web-dev-qa-db-ja.com

CodeDeployがAWS Lambda関数を見つけられない

AWS CodePipeline内で作業すると、CodeDeployとAWS Lambdaで問題が発生します。これは私のセットアップです:

  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

質問

この構成には何が欠けていますか?

8
David Gatti

ですから、これは答えではなくコメントであるべきです。まだ50人の担当者がいないので、ここにいます。

私はあなたと同じ問題を抱えています。解決策を見つけたかどうかはわかりません。次のappspec.ymlを使用してデプロイを正常に実行できました。

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

CodeDeployが機能するためには、現在のバージョンとターゲットバージョンの両方が存在している必要があります。もちろん、これを手動で展開してテストしました。

ここで必要なのは、実際にコードを更新して新しいバージョンを作成するものだと思います。これは、CodeDeployが実行すると思っていたでしょう。

編集:さらなる調査により、私が気付かなかったCodePipelineに関する情報が得られました。

ここ ごとに、buildspec、appspec、およびcftを必要とするパイプラインを実行するように見えます。パイプラインが失敗する理由は、ラムダ関数のCloudFormationテンプレートを含める必要があるためです。これが実際のコードをデプロイするものです。 appspec.ymlは古いバージョンから新しいバージョンにトラフィックを移行するためにありますが、新しいコードのデプロイはcftが行います。

Edit2:これは サンプルアプリ のおかげで二乗できました。 CodeBuildを使用してアプリをビルドするだけでなく、実際のデプロイを行うためのCFTを生成します。つまり、ラムダリソースを使用してCFTを構築します。これにより、リソースからappspecが完全に削除され、代わりにCFTを使用してLambda関数を定義します。以下は、SAMドキュメントへの link です。

10
StoneyD

サードパーティのCIソリューションを使用しているため、CodeBuildの部分についてはお役に立てませんが、残りの部分についてはお役に立てると思います。

私もこれを機能させることができなかったので、AWSドキュメントに間違いがあると思います。彼らはコマンドラインで「aws deploy Push」を呼び出し、それにLambdaのZipではなくappspec.ymlファイルを与えると言いますが、何をしても、常にエラーが発生します。

アクションの実行に失敗しました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. ラムダ関数を公開します。

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

3
Mike

「EC2 /オンプレミスデプロイメントのAppSpecファイルの名前はappspec.ymlである必要があります。AmazonECSまたはAWS LambdaデプロイメントのAppSpecファイルの名前はappspec.yamlである必要があります。」

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

0
masayang