CDK(というかCloudFormationの仕様)においてS3やDynamoDB、そしてECRなど一部のリソースはcdk destroyでのスタック削除時にデフォルトでは残されるようになっています。
これは以下のようにremovalPolicy: cdk.RemovalPolicy.DESTROYを指定することで削除できます。
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as ecr from 'aws-cdk-lib/aws-ecr';
export class CdkEcrStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// ECRリポジトリ作成
new ecr.Repository(this, 'Repository', {
removalPolicy: cdk.RemovalPolicy.DESTROY,
});
}
}
が!ECRリポジトリはリポジトリが空でない(イメージが存在する)場合削除がエラーになります。
destroy failed Error: The stack named CdkEcrStack is in a failed state.
You may need to delete it from the AWS console : DELETE_FAILED (The following resource(s)
failed to delete: [Repository***]. ): Resource handler returned message: "The repository
with name 'cdkecrstack-repository***' in registry with id '***' cannot be deleted because
it still contains images (Service: Ecr, Status Code: 400, Request ID: ***)" (RequestToken:
***, HandlerErrorCode: GeneralServiceException)
これが起きるとスタックがDELETE_FAILED状態になってしまい面倒です。
S3にはこのような状況を解決するためにautoDeleteObjectsというパラメータがあります。
new s3.Bucket(this, 'Bucket', {
autoDeleteObjects: true,
removalPolicy: cdk.RemovalPolicy.DESTROY,
});
が、ECRにはありません…。
仕方ないので手動で消しました。
(イメージを空にするのはID指定が面倒なのでdelete-repositoryに–forceを付けて消してしまいます。この後cdk destroyが通ります。)
aws ecr delete-repository --repository-name [ECRリポジトリ名] --force
ちなみに機能追加リクエストはCloudFormationとCDK両方のリポジトリに立っていますが数年間解決されていません(´・ω・`)
(ecr): add option to auto delete images upon ECR repository removal #12618
AWS::ECR::Repository – Request to support Force Removal of Non-empty ECR repositories #515
APIにforceというパラメータがあるのでAPI的には可能な気がするんですけどね…。
コメント