CDKでIAMロールを作成しようとした時に犯したミス・・・。
テンプレートリテラル使った変数展開は気をつけなければならない・・・
やらかした結果、スタックが削除できなくなった・・・。(まだ解決してない
まだ未解決なので以下は現状・・・
環境
- 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}
になっていました
// やりたかったこと
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
が発生している。
失敗するまでにものすごい時間がかかっている
スタックが作られてからIAMRoleがCREATE_FAILD
になるまで約34分
ロールバックを開始しROLLBACK_FAILED
になるまで約35分
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分かかる
現状
コンソールから消せないので困ってるナウ