CodeDeploy找不到我的AWS Lambda函数。

10

在AWS CodePipeline中,我使用CodeDeploy和AWS Lambda遇到了问题。我的设置如下:

  1. 源:GitHub
  2. AWS CodeBuild
  3. AWS CodeDeploy

问题

步骤1和2没有任何问题,但在涉及到CodeDeploy时,我会遇到以下错误:

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

如果我解压由CodeBuild生成的Artifact文件,所有文件都在正确的位置。

如果我尝试从CodeDeploy手动部署到AWS Lambda,则会得到不同的消息...

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

这非常令人困惑,因为我不确定哪个错误消息是有效的,或者它们是否相同但具有不同的错误消息。

设置

函数的ARN为:

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

别名的 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

问题

在这个配置中,我缺少了什么?


这是否是您创建的别名?默认通常为:latest。 - Pandelis
这是我拥有的 arn:aws:lambda:us-east-1:239748505547:function:email_submition:default - David Gatti
有点奇怪,但对于Lambda或ECS部署,文件应该是“appspec.yaml”。对于EC2/On prem,则为“appspec.yml”。 - steve y
2个回答

12

所以实际上这应该是一条评论而不是答案。我还没有50个声望,所以它在这里。

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

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

只有当前版本和目标版本都存在时,CodeDeploy才能工作。当然,我已经通过手动部署进行了测试。

我认为需要的是实际更新代码并创建新版本的东西。这就是我原本认为CodeDeploy会做的事情。

编辑:进一步的研究揭示了我没有意识到的关于CodePipeline的信息。

根据此处的内容,要运行Pipeline,您需要buildspec、appspec和cft。管道失败的原因是因为您需要包括一个CloudFormation模板来部署Lambda函数,这是部署实际代码的方法。 appspec.yml用于将流量从旧版本迁移到新版本,但是cft是执行新代码部署的方式。

编辑2:这个示例应用程序帮助我解决了问题。 使用CodeBuild构建您的应用程序,同时生成CFT以进行实际部署。这意味着您使用Lambda资源构建CFT。 这完全从资源中删除了appspec,并且您可以使用CFT定义Lambda函数。这里是SAM文档的链接


我猜你比我聪明,我仍然不知道发生了什么 :/ 呃 - David Gatti
我得出的结论是CodeDeploy与SAM不兼容,这个说法正确吗? - jbasko
正如@StoneyD在他的“评论”中得出的结论,必须使用Cloudformation来部署SAM风格的lambda函数:https://docs.aws.amazon.com/codepipeline/latest/userguide/integrations-action-type.html#integrations-deploy - jbasko
我也遇到了类似的问题,这是我的经验: 实际上,对于部署到Lambda中,如@StoneyD所指出的那样,不需要使用CodeDeploy
  1. 这里有一个CloudFormation示例
  2. Terraform示例
  3. AWS博客
  4. AWS文档
- JIoJIaJIu

6

我无法帮助您处理CodeBuild部分,因为我使用的是第三方CI解决方案,但也许我可以帮忙处理其他问题。

我认为AWS文档中有一个错误,因为我从未能够使其工作。他们说要在命令行上调用“aws deploy push”,并将您的appspec.yml文件提供给Lambda而不是zip文件,但无论您做什么,您都会收到以下错误:

Action execution failed BundleType must be either YAML or 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函数:

aws lambda update-function-code --function-name YourFunction --zip-file fileb://~/your-code.zip --publish

请注意它创建的版本号

  1. 将您的appspec.yml文件上传到S3

aws s3 cp appspec.yml s3://your-deploy-bucket/your-deploy-dir/appspec.yml

  1. 注册您的应用程序修订版:

aws deploy register-application-revision --application-name YourApplcationName --s3-location bucket=your-deploy-bucket,key=your-deploy-dir/appspec.yml,bundleType=YAML

从CLI上看,这似乎没有任何作用,但它确实起作用了。

  1. 获取应用程序修订版以确保它有效

aws deploy get-application-revision --application-name YourApplcationName --s3-location bucket=your-deploy-bucket,key=your-deploy-dir/appspec.yml,bundleType=YAML

  1. 创建部署以部署您的代码

aws deploy create-deployment --s3-location bucket=your-deploy-bucket,key=your-deploy-dir/appspec.yml,bundleType=YAML

可以用于AWS(亚马逊网络服务)的部署。它会在指定的S3存储桶中查找一个名为appspec.yml的文件,并将其作为YAML格式的包进行部署。请确保替换bucket和key参数为您自己的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接