【问题标题】:AWS CodeDeploy is not able to deploy lambda functionAWS CodeDeploy 无法部署 lambda 函数
【发布时间】:2020-01-03 19:02:19
【问题描述】:

我有一个简单的 AWS CodePipeline,只需几个步骤。

  1. AWS CodeCommit(提供输出“SourceCode”)
  2. AWS CodeBuild(输入“SourceCode”,npm install,npm run-scripts build,输出“FinalCode”)
  3. AWS CodeDeploy(输入“FinalCode”,部署到 Lambda 函数)

真的,我从几个小时开始就尝试让这个 F*** CodeDeploy 工作。 这是不可能的。我不敢相信-.-

所以我们可以看一下 AWS CodeDeploy 步骤。错误一定在那里。 我用 CodeBuild 尝试了不同的场景。 输出 artifacts.zip 和 appspecs.yml 以及其他内容。


CodeDeploy 说:

Action execution failed
BundleType must be either YAML or JSON

当它被 CodePipeline 触发时。

我从 CodePipeline-S3-Bucket 下载文件,这是 CodeDeploy 的输入。 它包含所有需要的文件。

我不知道如何告诉管道接受这个 appspec.yml。

有趣的是,如果我手动部署它,它就可以工作。 所以 CodeDeploy 找不到我认为的 appspec.yml。

在这里你可以看到。

但如果我仔细想想,这没有任何意义。 因为在这个应用规范编辑器中,我无法指定要部署的 ZIP 存档的路径。

有人知道如何完成最后一步吗?

我不敢相信它这么难:-D 我能够非常轻松地设置 CodeCommit。 CodeBuild 也很容易使用 buildspec.yml。 现在我无法部署,因为忽略了 appspec.yml 或类似的东西......

【问题讨论】:

  • 您是否能够找出问题所在或解决方法?我现在使用 CodeDeploy 也遇到了同样的错误,我知道我包含了正确的 appspec.yml 文件。
  • @Patrick 你能找到解决办法吗?我在这里发现了一个类似的问题:stackoverflow.com/questions/62210071/… 接受的答案是 CodeDeploy 在 CodePipeline 中使用时不支持部署到 Lambda。只是想知道从那以后你的经历如何。

标签: amazon-web-services aws-lambda aws-code-deploy aws-codebuild aws-codecommit


【解决方案1】:

我也有同样的问题。我花了几天的时间在这上面,我认为couldFormatoin的AWS::CodeDeploy::DeploymentGroup有问题

我在s3://my-backet-for-lambda-deployment/appspec.yaml 中有这个 yaml 文件:

appspec.yaml

version: 0.0
Resources:
  - my-lambda-app-MyLambdaApp-157EXYJT40C0U:
      Type: AWS::Lambda::Function
      Properties:
        Name: arn:aws:lambda:us-east-1:292285124316:function:my-lambda-app-MyLambdaApp-157EXYJT40C0U 
        Alias: production
        CurrentVersion: 8 
        TargetVersion: 9 

appspec.yaml 是正确的,因为我可以使用控制台手动指定它在 S3 中的位置,并且一切正常。所以我完全确定appspec.yaml 没有错在这里。

问题

我用下面AWS::CodeDeploy::DeploymentGroup

  MyDeploymentGroup:
    Type: AWS::CodeDeploy::DeploymentGroup
    Properties:
      ApplicationName: !Ref MyCodeDeployApp
      Deployment: 
        IgnoreApplicationStopFailures: false
        Revision:       
            RevisionType: S3
            S3Location: 
              Bucket: my-backet-for-lambda-deployment
              Key: appspec.yaml
              BundleType: YAML              
      DeploymentConfigName: CodeDeployDefault.LambdaAllAtOnce
      DeploymentStyle: 
        DeploymentOption: WITH_TRAFFIC_CONTROL
        DeploymentType: BLUE_GREEN
      ServiceRoleArn: !ImportValue MyCodeDeployRoleArn

上述资源的堆栈创建失败,无法指定属性部署

解决方法

我找不到任何纯粹基于 CloudFormatoin 的解决方案。所以我所做的是创建DeploymentGroup而不定义Deployment,然后使用CLI或boto3开始部署。

Resources:

  MyCodeDeployApp:
    Type: AWS::CodeDeploy::Application
    Properties: 
      ComputePlatform: Lambda

  # DeploymentGroup without Deployment property
  MyDeploymentGroup:
    Type: AWS::CodeDeploy::DeploymentGroup
    Properties:
      ApplicationName: !Ref MyCodeDeployApp           
      DeploymentConfigName: CodeDeployDefault.LambdaAllAtOnce
      DeploymentStyle: 
        DeploymentOption: WITH_TRAFFIC_CONTROL
        DeploymentType: BLUE_GREEN
      ServiceRoleArn: !ImportValue MyCodeDeployRoleArn

Outputs:

  CodeDeployAppName:
    Value: !Ref MyCodeDeployApp

  DeploymentGroupName:
    Value: !Ref MyDeploymentGroup

创建堆栈后,我可以使用 bash 开始部署:

aws deploy create-deployment \
    --application-name ${deployment_app_name} \
    --deployment-group-name ${deployment_group_name} \
    --s3-location bucket=my-backet-for-lambda-deployment,bundleType=YAML,key=appspec.yaml

附言

MyCodeDeployRoleArn 角色也是正确的,所以也不是它的错:

Resources:

  MyCodeDeployServiceRole:
    Type: AWS::IAM::Role
    Properties: 
      AssumeRolePolicyDocument:                   
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal: {Service: [codedeploy.amazonaws.com]}
            Action: ['sts:AssumeRole']
      Description: Role for deploying lambda
      ManagedPolicyArns: 
        - arn:aws:iam::aws:policy/service-role/AWSCodeDeployRoleForLambda
      Policies: 
        - PolicyName: MyS3GetObjectPolicy
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action: 
                  - s3:Get*
                  - s3:List*
                Resource: '*'            


Outputs:

  CodeDeployRoleArn:
    Value: !GetAtt MyCodeDeployServiceRole.Arn
    Export: 
      Name: MyCodeDeployRoleArn

【讨论】:

    【解决方案2】:

    嗨@Patrick,听起来这里发生了一些事情。

    1. 正如@Putnik 所说,图中应该选择YAML,但我不认为图片是部署问题。

    2. Lambda 部署只需要一个 'appspec 文件。因此,通过控制台执行此操作不需要客户添加 zip,除非他们的 appspec 位于另一个存储库 (S3) 中。发布的图片看起来像是您的手动部署测试使用了输入到 appspec 文件编辑器中的原始字符串 appspec。 (如果您想使用 .zip,请将 Revision Location 更改为 S3 选项。)

    3. 它无法将 .yml 识别为 .yaml。我会调查一下。目前,一种解决方法是将文件的扩展名更改为.yaml

    【讨论】:

    • 谢谢@annamataws。我会试试你的想法。如果唯一的问题是缺少 YAML 文件而不是 .YML ... :-D
    • @annamataws 扩展在这里不是问题。
    【解决方案3】:

    猜猜看:这里不用选yaml吗?

    【讨论】:

    • 没关系,因为它是通过 API 部署并且选择了 YAML :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    • 2021-09-28
    • 1970-01-01
    • 2018-04-27
    • 2023-03-09
    • 2019-10-31
    相关资源
    最近更新 更多