ヤマムギ

growing hard days.

*

AWS Lambda(Python)でDynamoDB テーブルを日次で削除/作成(オートスケーリング付き)

      2018/12/08


この記事はAWS #2 Advent Calendar 2018に参加した記事です。

Selenium, Headless ChromeとAWS Lambdaで夜な夜なスクレイピング」にも書きましたが、上記のようなアーキテクチャで、Alexaスキルの開発を進めていまして、元となる情報をwebとあるwebサイトから収集しています。
日時点での最新情報をDynamoDBに書き込んでいます。
洗い替えでかまわないので、テーブル名に日付け文字列を付加して、毎日作り直しています。
作り直しが完了すれば、スクレイピングを始めるという処理順番をStepFunctionsで設定しています。

DynamoDBテーブルを作るだけなら調べることなくさっさと終わったのですが、キャパシティユニットのオートスケーリングを有効にするところで、少し調べたので書き残します。

StepFunctions

一応StepFunctionsのステートマシンのJSONです。
順番に処理しているだけなのでシンプルです。

では、Lambdaのコードを見ていきますが、削除の前に作成から見ます。
作成したものを翌々日に削除するので、何を作成しているかから見たほうがわかりやすいからです。

テーブル作成(オートスケーリング付き)

現在、マネジメントコンソールでDynamoDBテーブルを作成すると、オートスケーリングがデフォルトで有効になります。
ですが、LambdaのSDK boto3ではそこまではやってくれません。

このLambdaは環境変数で、タイムゾーンをJSTにしています。
具体的にはLambdaの環境変数キーに TZ , 値に Asia/Toky としています。

そして、StepFunctionsはCloudWatch Eventsで23時にターゲットとして実行されています。
UTCでは9時間の時差があるので、Cron式で 0 14 * * ? としています。

それを踏まえた上で見ていきます。

まず最初に作成するテーブル名を決めます。
明日の日付が入るテーブル名にします。

そしてDynamoDBテーブルを作成します。

ローカルセカンダリインデックスを持つDynamoDBテーブルを作成しました。
waiterを使ってテーブルが作成完了するまで待ちます。

次にこのテーブルにRCU,WCUそれぞれのオートスケーリングを設定していきます。

オートスケーリングを設定するには、application-autoscaling クライアントが必要でした。
dynamodb:table:ReadCapacityUnits, dynamodb:table:WriteCapacityUnitsでそれぞれ設定します。

これで完了かと思うとそうではないのですね。
この段階ではスケールする枠だけが決まって、いつスケールするかの設定が入っていません。
そうです。スケーリングポリシーもCloudWatchアラームも設定されていません。

次にその設定をしていきます。

application-autoscaling クライアントのput_scaling_policyを使いました。

これでDynamoDBのオートスケーリングとCloudWatchのアラームも出来ました。

テーブル削除(CloudWatchアラームも削除)

次にテーブルを削除するコードを見ます。
DynamoDBのテーブルだけが削除されてアラームが残っていては余分なコストがかかってしまいます。
ですので、消し忘れのないようにCloudWatchアラームも削除します。

テーブルは2日間は保持しておくので、昨日の日付のテーブルを削除しています。

テーブルを削除します。
テーブルに追加したスケーラブルターゲットもあわせて削除されました。
でもこれだけではCloudWatchアラームが残ります。

オートスケーリングポリシーを削除します。

これで掃除完了です。


最後までお読みいただきましてありがとうございました!

【PR】 「AWS認定試験対策 AWS クラウドプラクティショナー」という本を書きました。

【PR】 「AWSではじめるLinux入門ガイド」という本を書きました。

 - AWS , , ,

ad

ad

  関連記事

AWS OrganizationsでAWSアカウントを25作りたいのでPythonで作った

AWSアカウントを25作る必要があったので、Lambda Python 3.7で …

re:Invent 徒歩記(シアトルも)

このブログは、AWS re:invent 2018 Advent Calenda …

ACM(AWS Certificate Manager)の承認メールを受け取るためにAmazon SESを設定する

何のためでもいいのですが、ドメインは持っているけど、そのドメイン宛にメールを送ら …

RDSの証明書をrds-ca-2019に更新しました

クライアント接続で署名書使ってないので、必要ないのですが、古いままなのも気持ち悪 …

RocketChat(EC2インスタンス)でCPU80%以上を10分間継続したら再起動する

先日、数日間のやり取り用で完全に使い捨てとして使っているRocketChatで、 …

AWSのサービス数を数えてみました(2020/5/23)

何をもってサービスという単位にするかというのはあるかもしれませんが、とりあえず情 …

特定のIAMロールをLambda(Python)で削除する

やりたいこと 特定アカウントの特定の名前が含まれるIAMロールをまとめて削除した …

AWSアカウント内のすべてのS3バケットを削除するLambda(Python)

やりたいこと 特定アカウント内のS3バケットを全部削除したいです。 バケット内の …

AWS Cloud9で環境を共有する

(特にリモート環境では)画面共有をしたり、リポジトリを共有したり、コーディング環 …

AWS Lambda KMSを使って環境変数を暗号化、復号化する(Python)

Lambda内で外部APIを使用する場合などをユースケースとして、環境変数をKM …