CodeDeploy找不到我的AWS Lambda函数

时间:2018-01-28 15:43:18

标签: amazon-web-services amazon-s3 aws-lambda aws-code-deploy aws-codepipeline

CodeDeploy和AWS Lambda在AWS CodePipeline中工作时遇到问题。这是我的设置:

  1. 来源GitHub
  2. AWS CodeBuild
  3. AWS CodeDeploy
  4. 问题

    步骤1.和2.工作没有问题,但是当涉及到CodeDeploy时,我收到以下错误:

      

    操作执行失败BundleType必须是YAML或JSON

    如果我解压缩CodeBuild生成的工件,则所有文件都已到位。

    如果我尝试从CodeDeploy手动部署到AWS Lambda,那么我会收到另一条消息......

      

    部署失败部署因目标而失败   Lambda函数FUNCTION_NAME不存在或指定的函数   无法找到版本或别名

    关于哪个错误消息有效,或者它们是否相同但是具有不同的错误消息,这是非常混乱的。

    设置

    该功能的ARN是:

    arn:aws:lambda:us-east-1:239748505547:function:email_submition
    

    Alias的ARN是:

    arn:aws:lambda:us-east-1:239748505547:function:email_submition:default
    

    我的appspec.yml文件包含以下内容

    version: 0.0
    Resources:
      - email_submition:
          Type: AWS::Lambda::Function
          Properties:
            Name: "email_submition"
            Alias: "default"
            CurrentVersion: "1"
            TargetVersion: "2"
    

    项目的文件夹结构是:

    .gitignore
    appspec.yml
    buildspec.yml
    index.js
    README.md
    

    问题

    我在此配置中缺少什么?

3 个答案:

答案 0 :(得分:6)

所以这真的应该是评论而不是答案。我还没有50名代表,所以就在这里。

我和你有同样的问题。我不确定你是否找到了解决方案。我能够使用以下appspec.yml成功执行部署:

version: 0.0
Resources:
    - mylambdafunction:
        Type: AWS::Lambda::Function
        Properties:
            Name: "mylambdafunction"
            Alias: "staging"
            CurrentVersion: "2"
            TargetVersion: "3"

在CodeDeploy工作之前,当前版本和目标版本都必须存在。当然,我通过手动部署测试了这一点。

我认为这里需要的是实际更新代码并创建新版本的东西。这就是CodeDeploy所能想到的。

编辑:进一步的研究已经产生了有关我没有意识到的CodePipeline的信息。

here看起来要通过管道运行你需要你的buildspec,appspec和cft。管道失败的原因是因为您需要为lambda函数包含CloudFormation模板,这就是部署实际代码的原因。 appspec.yml用于将流量从旧版本迁移到新版本,但cft是新代码的部署。

Edit2:这example app让我摆平了。 使用CodeBuild构建您的应用程序,但也可以生成CFT以进行实际部署。这意味着您使用lambda资源构建CFT。 这将完全从资源中删除appspec,而是使用CFT来定义Lambda函数。以下是SAM文档的link

答案 1 :(得分:2)

我无法帮助您使用CodeBuild部分,因为我使用的是第三方CI解决方案,但也许我可以帮助完成剩下的工作。

我认为AWS文档中存在错误,因为我从来没有能够使用它。他们说在命令行上调用“aws deploy push”并给它你的appspec.yml文件而不是Lambda的zip文件,但不管你做什么,你总会得到错误:

  

操作执行失败BundleType必须是YAML或JSON

我认为这是因为push在上传后会自动调用“register-application-revision”。如果将其拆分为单独的部分,这将有效。

您的appspec.yml应该看起来像

version: 0.0 Resources: - YourFunctionName: Type: "AWS::Lambda::Function" Properties: Name: "YourFunctionName" Alias: "YourFunctionNameAlias" CurrentVersion: "CurrentAliasVersionGoesHere" TargetVersion: "NewlyPublishedVersionGoesHere"

您使用的版本应该是当前别名所附加的版本。目标版本应该是您刚刚发布的新版本(见下文)。这部分仍然让我感到困惑。我不明白为什么它无法弄清楚别名指向的当前版本。

另外,请注意,您始终只需使用update-function-code上传Lambda代码的新代码,它将覆盖最新版本。或者您可以发布哪个将创建新版本并始终只调用最新版本。 CodeDeploy只有在你想要逐步部署或者测试和实时代码的版本不同时才是必需的。

我会尝试以下方法:

  1. 发布您的lambda函数:
  2. aws lambda update-function-code --function-name YourFunction --zip-file fileb://~/your-code.zip --publish

    记下它创建的版本号

    1. 将您的appspec.yml文件上传到S3
    2. aws s3 cp appspec.yml s3://your-deploy-bucket/your-deploy-dir/appspec.yml

      1. 注册您的应用程序修订版:
      2. aws deploy register-application-revision --application-name YourApplcationName --s3-location bucket=your-deploy-bucket,key=your-deploy-dir/appspec.yml,bundleType=YAML

        从CLI开始,这似乎没有做任何事情,但确实如此。

        1. 获取应用程序修订以确保其有效
        2. aws deploy get-application-revision --application-name YourApplcationName --s3-location bucket=your-deploy-bucket,key=your-deploy-dir/appspec.yml,bundleType=YAML

          1. 创建部署代码以进行部署
          2. aws deploy create-deployment --s3-location bucket=your-deploy-bucket,key=your-deploy-dir/appspec.yml,bundleType=YAML

答案 2 :(得分:0)

“ EC2 /本地部署的AppSpec文件的名称必须为appspec.yml。AmazonECS或AWS Lambda部署的AppSpec文件的名称必须为appspec.yaml。”

https://docs.aws.amazon.com/codedeploy/latest/userguide/reference-appspec-file.html