CodeDeploy 找不到我的 AWS Lambda 函数

CodeDeploy can't find my AWS Lambda Function

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

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

问题

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

Action execution failed BundleType must be either YAML or JSON

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

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

Deployment Failed The deployment failed because either the target Lambda function FUNCTION_NAME does not exist or the specified function version or alias cannot be found

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

设置

函数的 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

问题

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

所以这真的应该是评论而不是答案。我还没有 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 看起来 运行 通过管道您需要构建规范、应用规范和 cft。管道失败的原因是因为您需要为 lambda 函数包含一个 CloudFormation 模板,这就是部署实际代码的原因。 appspec.yml 用于将流量从旧版本迁移到新版本,但 cft 用于部署新代码。

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

由于我使用的是第 3 方 CI 解决方案,因此我无法在 CodeBuild 部分为您提供帮助,但也许我可以在其余部分提供帮助。

我认为 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