AWS CodePipeline内で作業すると、CodeDeployとAWS Lambdaで問題が発生します。これは私のセットアップです:
ステップ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
この構成には何が欠けていますか?
ですから、これは答えではなくコメントであるべきです。まだ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 です。
サードパーティの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が必要になるのは、少しずつ凝った展開をしたい場合や、テストコードとライブコードで異なるバージョンを使用する場合のみです。
私は以下を試します:
aws lambda update-function-code --function-name YourFunction --Zip-file fileb://~/your-code.Zip --publish
作成したバージョン番号をメモしてください
aws s3 cp appspec.yml s3://your-deploy-bucket/your-deploy-dir/appspec.yml
aws deploy register-application-revision --application-name YourApplcationName --s3-location bucket=your-deploy-bucket,key=your-deploy-dir/appspec.yml,bundleType=YAML
CLIからは、これは何もしないように見えますが、実際はそうでした。
aws deploy get-application-revision --application-name YourApplcationName --s3-location bucket=your-deploy-bucket,key=your-deploy-dir/appspec.yml,bundleType=YAML
aws deploy create-deployment --s3-location bucket=your-deploy-bucket,key=your-deploy-dir/appspec.yml,bundleType=YAML
「EC2 /オンプレミスデプロイメントのAppSpecファイルの名前はappspec.ymlである必要があります。AmazonECSまたはAWS LambdaデプロイメントのAppSpecファイルの名前はappspec.yamlである必要があります。」
https://docs.aws.Amazon.com/codedeploy/latest/userguide/reference-appspec-file.html