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

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

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

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


**環境**

- TypeScript
- AWS CDK 1.91.0

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

```js
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を行ってしまいました。

```js
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: 


```js
// やりたかったこと
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206915/2f345683-1fa1-b0b2-c091-59d40330cb0a.png)

# CloudFormationテンプレートがどうなるか
問題のコードで`cdk synth`コマンドでCloudFormatonテンプレートを出力した結果です。

```sh
$ 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」で出力されています。
ロール名をこれで作ろうとした結果おかしなことになっているのだろうか・・・。

```sh
      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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206915/5dd49f60-a680-3c4d-33e3-268d1f04f9d6.png)

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