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を実行することで、デプロイ時の動きを詳細に追うこともできます。

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark