Java AWS ラムダ関数を Codepipeline -> Cloudformation 経由でデプロイするように設定していますが、Cloudformation で問題が発生しています。以前に Terraform を使用したことがあるので、一般的な概念は理解しています...
明確にするために、私のコードは Codecommit リポジトリに格納されており、すべて Codestar によってセットアップされているため、1 段階の 2 段階のデプロイ (変更セットの生成、変更セットの実行) で Codepipeline を作成しました。
今のところ、Codestar がリポジトリで作成したサンプルの template.yml ファイルをマークアップしているだけなので、HelloWorld は参照しています。
template.yml ファイルに加えて、Codebuild 用の buildspec.yml ファイルもありますが、ビルド プロセスは正常に完了します。
以下は私の template.yml cloudformation スクリプトです。Codepipeline デプロイ ステージの ChangeSet ステップは正常に完了しますが、ExecuteChangeset ステップは失敗し、「理由が提供されていません」(非常に役立ちます)。詳細リンクをクリックすると、実行ステップの Cloudformation ページが表示されますが、実際にはエラーは表示されません。私が期待する追加/削除手順のいくつかを示していますが、すべてを実行する必要があるとは限りません。「実行」をクリックすると、次のエラーで失敗します。
Error: Failed to execute change set: ChangeSet [arn:aws:cloudformation:us-east-1:XXXXXXXXXXXX:stack/awscodestar-test2-lambda/07e71ee0-6a73-11e7-bee5-50d5cd24fac6] cannot be executed in its current execution status of [EXECUTE_FAILED]
ここで何が間違っていますか?私は Fn::GetAtt 呼び出しをよく理解していませんが、いくつかの異なる方法を試しましたが、喜びはありませんでした。
**何が問題なのかを特定することに加えて、2 つの質問があります。
Fn::GetAtt 関数呼び出しで参照する必要があるものを正確に説明してください。呼び出そうとしているリソースの先頭に指定したリソース名ですか (例: GetHelloWorld)? または、そのリソースのプロパティとして提供される明示的な名前 (つまり、FunctionName)?
Lambda 関数の宣言では、イベント トリガーをインラインでセットアップしようとしています。これは、Lambda 関数を参照する必要があります。Lambda 関数リソース内にネストされた Event 宣言内から Lambda 関数リソースを参照できますか??
以下は私の template.yml ファイルです。
AWSTemplateFormatVersion: 2010-09-09
Transform:
- AWS::Serverless-2016-10-31
- AWS::CodeStar
Parameters:
ProjectId:
Type: String
Description: AWS CodeStar projectID used to associate new resources to team members
Resources:
RoleForLambda:
Type: "AWS::IAM::Role"
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Principal:
Service: "lambda.amazonaws.com"
Action: "sts:AssumeRole"
Policies:
- PolicyName: s3put
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Action:
- 'logs:CreateLogGroup'
- 'logs:CreateLogStream'
- 'logs:PutLogEvents'
- 's3:PutObject'
Resource:
- 'arn:aws:logs:*:*:*'
- 'arn:aws:s3:*'
GetHelloWorld:
Type: AWS::Serverless::Function
Properties:
Handler: com.aws.codestar.projecttemplates.handler.HelloWorldHandler
Runtime: java8
Timeout: 60
MemorySize: 256
Role:
'Fn::GetAtt':
- RoleForLambda
- Arn
ScheduleRule:
Type: 'AWS::Events::Rule'
Properties:
Name: DownloadFiles
ScheduleExpression: 'cron(2,7,12,17,22,27,32,37,42,47,52,57 * * * ? *)'
State: ENABLED
Targets:
- Arn:
'Fn::GetAtt':
- GetHelloWorld
- Arn
Id: downloadFiles
LambdaInvokePermission:
Type: "AWS::Lambda::Permission"
Properties:
Action: lambda:InvokeFunction
FunctionName: GetHelloWorld
Principal: events.amazonaws.com
SourceAccount: AWS::XXXXXXXXXXXX
SourceArn:
- Arn:
'Fn::GetAtt':
- ScheduleRule
- Arn