LoginSignup
0
0

More than 3 years have passed since last update.

[aws-cdk]変数展開をミスった結果スタックが消せなくなった(未解決

Last updated at Posted at 2021-03-25

CDKでIAMロールを作成しようとした時に犯したミス・・・。
テンプレートリテラル使った変数展開は気をつけなければならない・・・:ghost:

やらかした結果、スタックが削除できなくなった・・・。(まだ解決してない:sob:

まだ未解決なので以下は現状・・・

環境

  • TypeScript
  • AWS CDK 1.91.0

やりたかったこと

ロール名にpropsから受け取った値を使いつつスタックのクラス名でも付けてみようかなーと思い
以下のようなコードを書いた、つもりでいました。。。

import * as core from "@aws-cdk/core";
import * as iam from "@aws-cdk/aws-iam";

export interface SampleProps extends core.StackProps {
    readonly hoge: string;
}

export class SampleStack extends core.Stack {
    constructor(scope: core.Construct, id: string, props: SampleProps) {
        super(scope, id, props);

        new iam.Role(this, "Role", {
            roleName: `SampleStack-${props.hoge}-role`,
            assumedBy: new iam.ServicePrincipal("lambda.amazonaws.com"),
        });
        // 以下ポリシーを付けたり...
    }
}

やらかしていたコード

実際には以下のようなコードを生み出してしまい、気づかずにdeployを行ってしまいました。

import * as core from "@aws-cdk/core";
import * as iam from "@aws-cdk/aws-iam";

export interface SampleProps extends core.StackProps {
    readonly hoge: string;
}

export class SampleStack extends core.Stack {
    constructor(scope: core.Construct, id: string, props: SampleProps) {
        super(scope, id, props);

        new iam.Role(this, "Role", {
            // ※※※※※ SampleStackクラスが展開されている ※※※※※
            roleName: `${SampleStack}-${props.hoge}-role`,
            assumedBy: new iam.ServicePrincipal("lambda.amazonaws.com"),
        });
        // 以下ポリシーを付けたり...
    }
}

差分は以下の部分です。
文字列で書いたと思っていクラス名が${SampleStack}になっていました:innocent:

// やりたかったこと
roleName: `SampleStack-${props.hoge}-role`,

// やらかしていたこと
roleName: `${SampleStack}-${props.hoge}-role`,

起こったこと

cdk deployを実施したところいつまで経ってもロール作成が終わらず
以下のような状態で固まり続けました。
しばらーーーーくすると失敗。

$ cdk deploy sample-stack
sample-stack: deploying...
sample-stack: creating CloudFormation changeset...
[████████████████▌·········································] (2/7)

22:27:59 | CREATE_IN_PROGRESS   | AWS::CloudFormation::Stack     | sample-stack
22:28:07 | CREATE_IN_PROGRESS   | AWS::IAM::Role                 | IAMRole

コンソールを確認してみる

イベントログを見てみるとInternal Failureが発生している。

失敗するまでにものすごい時間がかかっている:innocent:
スタックが作られてからIAMRoleがCREATE_FAILDになるまで約34分
ロールバックを開始しROLLBACK_FAILEDになるまで約35分

スクリーンショット 2021-03-26 1.35.45.png

CloudFormationテンプレートがどうなるか

問題のコードでcdk synthコマンドでCloudFormatonテンプレートを出力した結果です。

$ cdk synth sample-stack
Resources:
  Role1ABCC5F0:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Action: sts:AssumeRole
            Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
        Version: "2012-10-17"
      RoleName: >-
        class SampleStack extends core.Stack {
            constructor(scope, id, props) {
                super(scope, id, props);
                new iam.Role(this, "Role", {
                    roleName: `${SampleStack}-${props.hoge}-role`,
                    assumedBy: new iam.ServicePrincipal("lambda.amazonaws.com"),
                });
                // 以下ポリシーを付けたり...
            }
        }-hoge-role
    Metadata:
      aws:cdk:path: sample-stack/Role/Resource
〜〜 以下略 〜〜

RoleNameが「SampleStackクラスの実装 + propsの値 + 固定のSuffix」で出力されています。
ロール名をこれで作ろうとした結果おかしなことになっているのだろうか・・・。

      RoleName: >-
        class SampleStack extends core.Stack {
            constructor(scope, id, props) {
                super(scope, id, props);
                new iam.Role(this, "Role", {
                    roleName: `${SampleStack}-${props.hoge}-role`,
                    assumedBy: new iam.ServicePrincipal("lambda.amazonaws.com"),
                });
                // 以下ポリシーを付けたり...
            }
        }-hoge-role

そしてスタックが削除できなくなった

AWSのコンソールからスタックの削除しようとしてもInternal Failureが出て削除できない。
そしてここでも失敗するまで約35分かかる:sob:

スクリーンショット 2021-03-26 1.29.19.png

現状

コンソールから消せないので困ってるナウ:ghost:

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0