AWS Amplify 削除時に Cognito ユーザープールや IAM ロールを残す方法を試してみた
はじめに
AWS Amplify で構築したシステムを移行する際、移行先でも DynamoDB や Cognito のリソースを引き続き利用したい、というケースはよくあると思います。
移行が完了したあと、Amplify で管理していた不要なリソースは削除したいところです。
しかし、そのまま削除するとその中で管理されていたリソースも一緒に消えてしまいます。
この記事では、Cognito リソースを対象に、Amplify 削除時にリソースを残す方法を紹介します。
Cognito ユーザープールを保持する
リソースを消さないようにするには、backend.ts で applyRemovalPolicy をリソースに追加してしまえば OK です。
import { defineBackend } from '@aws-amplify/backend';
import { auth } from './auth/resource.js';
import { RemovalPolicy } from "aws-cdk-lib";
const backend = defineBackend({
auth
});
const { cfnUserPool, cfnIdentityPool, cfnUserPoolClient, cfnIdentityPoolRoleAttachment } = backend.auth.resources.cfnResources;
cfnUserPool.applyRemovalPolicy(RemovalPolicy.RETAIN);
cfnUserPoolClient.applyRemovalPolicy(RemovalPolicy.RETAIN);
cfnIdentityPool.applyRemovalPolicy(RemovalPolicy.RETAIN);
cfnIdentityPoolRoleAttachment.applyRemovalPolicy(RemovalPolicy.RETAIN);
さて、ここで注意点なのですが、アイデンティティプールにアタッチしている IAM ロールについては上記のような方法では保持が難しいです。
Cognito アイデンティティープールの IAM ロールを保持する
backend.auth.resources.cfnResources を確認してみましょう。
AuthCfnResources が CloudFormation リソースとして取得可能な一覧ですが、IAM ロールは含まれていません。
AuthResources には、authenticatedUserIamRole / unauthenticatedUserIamRole として定義はされているものの、型は Role クラスではなく IRole インターフェースです。
CDK には IAM ロールを扱う型として Role (L2 コンストラクト) と IRole (インターフェース) があります。
IRole にも applyRemovalPolicy メソッドは定義されているため呼び出し自体は可能ですが、Role.fromRoleArn() でインポートされたロールの場合は L1 リソースを持たないため、呼んでも DeletionPolicy は設定されません。
現時点では Amplify が内部で new Role() を使って生成しているため、IRole 型のまま applyRemovalPolicy を呼んでも正常に動作します。
ただし、将来的に内部実装が Role.fromRoleArn() などに変わった場合、L1 リソースを持たないため applyRemovalPolicy を呼んでも DeletionPolicy が設定されず、エラーも発生しないまま保持設定が無効になる可能性があるので注意が必要です。
試してみた
前述したように、現時点では Amplify が IAM ロールを生成しているので、実体は Role です。そのため、IRole 型のまま applyRemovalPolicy を呼んでも動作します。
const { authenticatedUserIamRole, unauthenticatedUserIamRole } = backend.auth.resources;
authenticatedUserIamRole.applyRemovalPolicy(RemovalPolicy.RETAIN);
unauthenticatedUserIamRole.applyRemovalPolicy(RemovalPolicy.RETAIN);
デプロイして家訓すると、DeletionPolicy が Retain になっていました。

Amplify の削除後は、スキップされていることも確認できますね。

注意点
デプロイ後に CloudFormation テンプレートを確認し、対象リソースの DeletionPolicy が Retain になっていることを必ず検証しましょう。
また、IAM ロールを Retain しても、ロールにアタッチされているインラインポリシーが別の CloudFormation リソースとして管理されている場合、スタック削除時にそれらのポリシーは削除されてしまいます。
結果として、ロール自体は残るものの権限が空の状態になる可能性がありますので、関連するポリシーリソースについても確認しましょう。
まとめ
今回は Cognito リソースでしたが、実際には DynamoDB などの Storage リソースの保持が求められることも多いと思います。
基本的な考え方は同じで、backend.storage.resources.cfnResources から L1 リソースを取得して applyRemovalPolicy を適用する流れになります。
ただし、Auth とは公開されているリソースの構造が異なるため、型定義を確認してからご対応ください。






