AWS CodeDeploy无法部署Lambda函数

时间:2018-08-06 22:02:39

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

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

  1. AWS CodeCommit(提供输出“ SourceCode”)
  2. AWS CodeBuild(输入“ SourceCode”,npm安装,npm运行脚本构建,输出“ 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的输入。 它包含所有需要的文件。

node_modules, appspec.yml and index.js

我不知道如何告诉管道使用此appspec.yml。

有趣的是,如果我手动部署它,它可以工作。 因此CodeDeploy无法找到我认为的appspec.yml。

example of working scenario if I add appspec.yml manually

在这里您可以看到。

Example of working result

但是,如果我考虑一下,这没有任何意义。 因为在此应用程序规范编辑器中,我无法指定要部署的ZIP存档的路径。

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

我不敢相信它是如此困难:-D 我能够非常轻松地设置CodeCommit。 使用buildspec.yml,CodeBuild也非常容易。 现在,由于忽略了appspec.yml或类似的内容,我无法部署...

3 个答案:

答案 0 :(得分:1)

@Patrick,您好,这听起来有些事。

  1. 正如@Putnik提到的那样,应该在图片中选择YAML,但是我认为图片不适合部署问题。

  2. Lambda部署仅需要一个'appspec文件。因此,除非客户的appspec位于另一个存储库(S3)中,否则通过控制台进行操作不需要客户添加邮政编码。张贴的图片看起来像您的手动部署测试使用的原始字符串appspec键入到appspec文件编辑器中。 (如果要使用.zip,请将“修订位置”更改为S3选项。)

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

答案 1 :(得分:0)

只需猜测:您不必在这里选择Yaml吗? enter image description here

答案 2 :(得分:0)

我有同样的问题。我花了几天的时间在此上,我认为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

P.S。

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