##はじめに
初投稿です
AWS初心者です
シェル初心者です
AWSのリソース「DynamoDB」にはプロビジョニング済みキャパシティーモードと、オンデマンドキャパシティーモードがあります。
オンデマンドキャパシティーは2018年11月に発表された設定で、違いは以下の通りです。
- オンデマンドキャパシティーモード
オンデマンドキャパシティーモードを利用している場合、DynamoDB の料金は、アプリケーションがテーブルに対して実行したデータの読み取り/書き込みに対して発生します。※
開発時等、業務時間以外は DynamoDB を利用しない、
または、急にリクエストは頻発する場合に利用するとよさそうです。
- プロビジョニング済みキャパシティーモード
プロビジョニング済みキャパシティーモードでは、アプリケーションに必要と予想される 1 秒あたりの読み込みと書き込みの回数を指定します。※
DynamoDB へのリクエストに対してある程度予測できる、
または、24 時間リクエストが定量的に存在する場合に使うとよさそうです。
※以下のサイトより引用
Amazon DynamoDB 料金
違いを比較すると、リクエストが少ないテーブルにはオンデマンドモードを設定した方がコストは低くなります。
特に、開発環境の場合、業務時間外では、DynamoDB にアクセスすることは少ないと思います。
ただし、今使っているDynamoDB に対して、CloudFormation を通じて設定するのは面倒・・・
かといって、たくさんのテーブルに対して、手動で設定を変えたくるのも面倒・・・
という訳で、今回、DynamoDB を(できるだけ)一括でオンデマンド課金にする、スクリプトを作りました。
必要なもの
AWS CLIとjqを使います。
各サイトに記載されている方法でインストールしましょう。
##書いてみた
書いてみたスクリプトはこちら。
#!/bin/bash
# 念のため、環境を確認してもらう
region='ap-northeast-1'
profile=$(echo $AWS_PROFILE)
read -p "${profile}環境で実行します。よろしいですか? (y/N): " yn
case "$yn" in [yY]*) ;; *) echo "処理を終了します。" ; exit ;; esac
#リクエスト課金になっていないテーブルを抽出する
#同時にUpdateできる最大テーブル数は50なので、実行数を制限している
no_ondemand_tables=$(aws dynamodb list-tables | jq -r '.TableNames[]' | xargs -I tablename aws --profile=${profile} dynamodb describe-table --table-name tablename | jq -r '.Table | select(.BillingModeSummary == null) | .TableName')
list=(`echo $no_ondemand_tables`)
for (( i = 0; i < 50; ++i ))
do
aws dynamodb update-table --table-name ${list[$i]} --billing-mode PAY_PER_REQUEST
done
オンデマンド課金になっていないテーブルはBillingModeSummary
が NULL になっています。
list-tables
で一度テーブルを取得し、整形してから抽出します。
公式のドキュメントでは、テーブルへの操作は同時に10テーブルまでと記載されていますが、
制限数を決めずに実行させると、50テーブル実行後、LimitExceededException
が発生しました。
(制限があり、全テーブルに対して一括にはできないので、タイトルに「できるだけ」をつけています)
なお、1テーブルの設定がオンデマンド課金になるまで、20分程度かかりました。
一括で更新したい場合、業務時間終了間近にスクリプトを実行し、
翌日確認するのがいいかもしれません。
リクエスト課金にした結果
1日約 15$ かかっていましたが、リクエスト課金にした結果、なんと1日約 0.2$ になりました!!
1か月あたり、約440$ のコスト削減になります!!
個人でしたら旅行に行けてしまいますね。
DynamoDB の運用にもよりますが、コスト抑えたい方はリクエスト課金にしてみるのはいかがでしょうか。