ASK CLI(Version2)でのCloudFormationのデバッグ方法について
ASK CLI(v2)からはデプロイにAWS CloudFormationを利用することができます。が、時々デプロイに失敗することがあります。 この場合のデバッグ方法を2つ紹介します。 1: AWS CLIでテンプレート […]
広告ここから
広告ここまで
目次
ASK CLI(v2)からはデプロイにAWS CloudFormationを利用することができます。が、時々デプロイに失敗することがあります。
✖ Deploy Alexa skill infrastructure for region "default"
[Error]: The CloudFormation deploy failed for Alexa region "default" for the reasons:
この場合のデバッグ方法を2つ紹介します。
1: AWS CLIでテンプレートそのものをバリデートする
AWS CLIにはテンプレートのバリデーションができるコマンドが用意されています。
% aws cloudformation validate-template --template-body file://infrastructure/cfn-deployer/skill-stack.yaml
An error occurred (ValidationError) when calling the ValidateTemplate operation: Template format error: Unrecognized resource types: [AWS::IAM::Role1]
この例では、AWS::IAM:Role1
という存在しないリソースタイプが指定されていることが指摘されています。ということで、ここを AWS::IAM::Role
になおしてやりましょう。
バリデーションが成功すると、このような出力がでます。
% aws cloudformation validate-template --template-body file://infrastructure/cfn-deployer/skill-stack.yaml
{
"Parameters": [
{
"ParameterKey": "LambdaHandler",
"NoEcho": false
},
{
"ParameterKey": "CodeBucket",
"NoEcho": false
},
{
"ParameterKey": "CodeKey",
"NoEcho": false
},
{
"ParameterKey": "CodeVersion",
"NoEcho": false
},
{
"ParameterKey": "SkillId",
"NoEcho": false
},
{
"ParameterKey": "LambdaRuntime",
"NoEcho": false
}
],
"Capabilities": [
"CAPABILITY_IAM"
],
"CapabilitiesReason": "The following resource(s) require capabilities: [AWS::IAM::Role]"
}
とはいえバリデーションだけではチェックしきれないこともあります。バリデーションは成功したのに・・・という場合は次の方法を試しましょう。
2: AWS CLI + jqで直接参照する
CloudFormationのエラーなのだから、CloudFormationに聴くのが確実です。
ASK CLI(v2)で作られたプロジェクトであれば、このようなコマンドで失敗したイベントを取得できます。
% aws cloudformation describe-stack-events \
--stack-name $(cat .ask/ask-states.json | jq ".profiles.default.skillInfrastructure[\"@ask-cli/cfn-deployer\"].deployState.default.stackId" -r) | \
jq ".StackEvents[] | select(.ResourceStatus == \"UPDATE_FAILED\")"
{
"StackId": "arn:aws:cloudformation:us-east-1:9999999:stack/example-skill-default-skillStack-1587380830650/1e4f54f0-82f7-11ea-86a4-0eb40de15aba",
"EventId": "AlexaSkillIAMRole-UPDATE_FAILED-2020-04-20T11:41:55.871Z",
"StackName": "example-skill-default-skillStack-1587380830650",
"LogicalResourceId": "AlexaSkillIAMRole",
"PhysicalResourceId": "example-skill-default-skillSta-AlexaSkillIAMRole-YFXEA2L5SOA4",
"ResourceType": "AWS::IAM::Role",
"Timestamp": "2020-04-20T11:41:55.871Z",
"ResourceStatus": "UPDATE_FAILED",
"ResourceStatusReason": "Resource arn:aws:s3:*:*:* can not contain region information. (Service: AmazonIdentityManagement; Status Code: 400; Error Code: MalformedPolicyDocument; Request ID: a7194a5d-6c32-47e3-ad53-f0ae70269a1e)",
"ResourceProperties": "{\"Path\":\"/\",\"Policies\":[{\"PolicyName\":\"alexaExternalPolicy1\",\"PolicyDocument\":{\"Version\":\"2012-10-17\",\"Statement\":[{\"Action\":[\"s3:GetObject\"],\"Resource\":\"arn:aws:s3:*:*:*\",\"Effect\":\"Allow\"}]}},{\"PolicyName\":\"alexaSkillExecutionPolicy\",\"PolicyDocument\":{\"Version\":\"2012-10-17\",\"Statement\":[{\"Action\":[\"logs:*\"],\"Resource\":\"arn:aws:logs:*:*:*\",\"Effect\":\"Allow\"}]}}],\"AssumeRolePolicyDocument\":{\"Version\":\"2012-10-17\",\"Statement\":[{\"Action\":[\"sts:AssumeRole\"],\"Effect\":\"Allow\",\"Principal\":{\"Service\":[\"lambda.amazonaws.com\"]}}]}}"
}
ResourceStatusReason
がfailした理由ですね。
この場合、 Resource arn:aws:s3:::* can not contain region information.
と指摘されていますので、これを直してやりましょう。
Optional: ask deploy --debug
ask deploy --debug
を実行することで、デプロイ時の動きを詳細に追うこともできます。