ヤマムギ

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アラームが残ります。

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

これで掃除完了です。


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

「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。

「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第2版」という本を書きました。

「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。

「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。

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

 - AWS , , ,

ad

ad

  関連記事

ブログのアーキテクチャをコストベースで見直しました

当ブログはAWSで構築しています。 アーキテクチャをコストを最重視して見直しまし …

東京リージョンでAWS Control Towerランディングゾーンをセットアップする

AWS Control Towerの最初の画面で[ランディングゾーンの設定]を押 …

AWS CodeDeployからEC2 Auto Scalingにデプロイするチュートリアル

公式チュートリアルチュートリアル: アプリケーションを CodeDeployグル …

EC2:RunInstances APIにリクエストしてEC2インスタンスを起動(署名バージョン4、Postman)

AWSのAPIリクエストってHTTPでもよかったですよね?って思って、確認のため …

php-fpm で Out of memoryが発生した際にメール通知する(AWS CloudWatch , Amazon SNS)

AWS CloudWatch LogsエージェントでAmazon EC2上のNg …

S3オブジェクトへのリクエストをCloudTrail, Athenaで識別する(パーティショニング)

Amazon S3オブエジェクトへのリクエストをCloudTrail, Athe …

AWS Organizations SCPがリソースベースのポリシーには影響しないことを確認

AWS Organizations SCPで許可ポリシーの設定をし継承の関係を確 …

CloudFrontからのバーチャルホストなサイトのテストってどうしてます?

このブログの構成です。 AWSで構築しています。 4つのサイトを1つのEC2で配 …

slackのbotに天気を教えてもらう(Python on AWS Lambda + API Gateway)

slackのbotにAPIの定番ともいえる天気情報を教えてもらいました。 環境は …

AWS Lambdaで「Process exited before completing request」

AWS lambdaで「Process exited before comple …