hero_picture
Cover Image for Amplify配下のDynamoDBに削除保護設定を入れる

Amplify配下のDynamoDBに削除保護設定を入れる

2024/03/29

こんにちは、クラウドソリューション事業部の本田です。今回は久しぶりにAWS Amplifyネタです。Amplify配下で作成されるリソースのカスタマイズについて書いていきます。

DynamoDBの削除保護

今回の対象となるのはDynamoDBです。経緯としてはSecurityHubのチェック項目で「DynamoDB tables should have deletion protection enabled」というのがありましてこちらの対応方法を調査しておりました。ルールの内容はDynamoDB削除保護設定を入れておきましょうというものなので、対応としては削除保護を入れるだけです。

コンソールから作ったDynamaDBのテーブルなどであればコンソールから設定をオンにするだけなのですが今回対象とするのはAmplifyの配下で作ったDynamoDBです。作ってからコンソールから地道に変更していくという手もありますが、そこはせっかくAmplifyを使っているのでコード上で管理しましょう。

Amplify配下でDynamoDBを作る

AmplifyでDynamoDBを作るとき、基本的にはamplify add apiのコマンド作成すると思います。
こちらのコマンドで作成すると、DynamoDBとappsyncのリソースが作られるのでDynamoDBの設定はデフォルトのまま作られます。一応parameters.jsonで変更できるパラメーターはあります。
https://docs.amplify.aws/javascript/tools/cli-legacy/config-params/#dynamodbbillingmode
こちらを見るに削除保護の設定はなさそうでした。

その後色々と調べていると、Amplifyにあるoverrideの機能を使って設定を上書きすることで
DynamoDBに削除保護の設定を入れることができるようでした。以下試してみます。

削除保護を有効化する


まず現状削除保護が無効になっているDynamoDBがあります。

この環境にてoverrideの機能を有効化します。
以下のコマンドを実行します。

1amplify override api


こちらを実行するとoverride.tsが作成されますので以下の内容に編集します。

1import { AmplifyApiGraphQlResourceStackTemplate, AmplifyProjectInfo } from '@aws-amplify/cli-extensibility-helper';
2
3export function override(resources: AmplifyApiGraphQlResourceStackTemplate, amplifyProjectInfo: AmplifyProjectInfo) {
4    for (const model in resources.models) {   
5        resources.models[model].modelDDBTable.deletionProtectionEnabled = true;
6    }
7}

deletionProtectionEnabled = 削除保護を有効化するという設定を上書きます。
こちらの内容をpushしAmplifyの環境にデプロイすると以下のように削除保護が有効化されています。

削除保護をするのは本番環境だけにしたい

削除保護を入れると当然削除をする際には、削除保護を無効にしないと削除できません。不要になった環境をまるっとすぐ消せるというのもAmplifyを使うメリットであると感じているのですが、削除保護が入っていると、削除する際にはまず削除保護を外してという形になり、本番環境などある程度絞って有効化するのが良いかと思います。忘れたまま消してしまうと中途半端にリソースが残ってしまうということもあります。別の記事で書きましたがoverirde内で条件分岐をさせることが可能です。
AWS Amplifyのoverride.tsで環境毎で分岐させる

1import { AmplifyApiGraphQlResourceStackTemplate, AmplifyProjectInfo } from '@aws-amplify/cli-extensibility-helper';
2
3export function override(resources: AmplifyApiGraphQlResourceStackTemplate, amplifyProjectInfo: AmplifyProjectInfo) {
4    if (amplifyProjectInfo.envName === "xxx") {
5
6        for (const model in resources.models) {      
7            resources.models[model].modelDDBTable.deletionProtectionEnabled = true;
8        }
9
10    }
11}

xxxの部分にAmplifyバックエンドの環境を入れることで条件分岐をさせることが可能です。誤って削除してしまった・・・ということが内容に本番環境などには削除保護を入れておきましょう。