【问题标题】:CodeDeploy can't find my AWS Lambda FunctionCodeDeploy 找不到我的 AWS Lambda 函数
【发布时间】:2018-07-07 08:57:30
【问题描述】:

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

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

问题

第 1 步和第 2 步工作没有问题,但在 CodeDeploy 方面我收到以下错误:

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

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

如果我尝试从 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
  • 这是我的arn:aws:lambda:us-east-1:239748505547:function:email_submition:default
  • 这很奇怪,但对于 Lambda 或 ECS 部署,该文件应该是“appspec.yaml”。对于 EC2/On prem,它的“appspec.yml”

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


【解决方案1】:

所以这真的应该是评论而不是答案。我还没有 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

【讨论】:

【解决方案2】:

我无法在 CodeBuild 部分为您提供帮助,因为我使用的是 3rd 方 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 函数:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-08
    • 2019-10-31
    • 2018-11-09
    • 2021-11-20
    • 1970-01-01
    • 2022-06-22
    • 2016-03-15
    • 1970-01-01
    相关资源
    最近更新 更多