前: RDSを自動で止めたいのでAWS Lambdaを学ぶ - t_hazawaの日記
経緯
- 手間を節約したい
- この前学んだ
- 今回実践 (私物AWS)
復習
- ↓をやる
やること
- 復習
- RDSつくり
- Lambda用意
- Lambda テスト
- CloudWatch 設定
RDSつくり
- つくった
- 業務の方に合わせて、 Aurora MySQL にした
Lambda 用意
- すぐにはうまくいかなかったノで、↓も読んだ
- 【速報】Amazon Auroraでも一時的な停止がサポートされました | DevelopersIO
- AWS Lambda関数でRDS Auroraクラスターを自動停止、起動する | 稲葉サーバーデザイン
- 読んだ結果、LambdaからRDSを止めれた
謎だった Lambda Layersについて
最新のsdkや、複数のlambda関数で使用する共有ロジックを「レイヤー」として外出しして配置し、本来の目的のみlambda関数で実装することができるようになりました。
- 共有ロジックがレイヤーらしい。 2021/10/15 18:45 6m
権限をちゃんとやる
- https://ap-northeast-1.console.aws.amazon.com/lambda/home?region=ap-northeast-1#/functions/rdsStop?tab=configure の一番↑に 実行ロールがある ので、ここにいい感じのロールを設定する
- ロールは 元々あった(というか、作ってるうちに自然とできた) CloudWatch Logs(?) の権限と rds:StopDBCluster (対象クラスターだけ)にした
cron編
- スケジュール式の ? がわからないので調べる
- ルールのスケジュール式 - Amazon CloudWatch Events
注記。。イベントを管理するには、amazon eventbridgeが好ましい方法です。cloudwatch eventsとeventbridgeは同じ基盤となるサービスとapiですが、eventbridgeはより多くの機能を提供します。
[*]を日および曜日フィールドの両方に使用することはできません。一方に使用する場合は、もう一方に[?]を使用する必要があります。?(疑問符)ワイルドカードは任意を意味します。
- スケジュール式: cron(0 * ? * * *) にしたら、ちゃんと00分すぎに停止になった
できたLambda のコード
- ↑のリンク先のを参考にして、必要なところだけにして整えた
- (Python 3.6)
import boto3 import time import os from botocore.client import ClientError client = boto3.client('rds', os.environ['AWS_REGION']) # RDSクラスター一覧 rds_cluster_ids = [ 'database-1' ] def lambda_handler(event, context): rds = boto3.client('rds') # リストの要素が0の場合は終了 if len(rds_cluster_ids) == 0: print('対象RDSクラスターがありません。') else: for i in rds_cluster_ids: _stop_db_cluster(db_cluster_identifier=i) print('RDSクラスターを停止しました。:' + str(i)) return 'RDSインスタンスの停止処理を完了しています。' # クラスターを停止する関数 def _stop_db_cluster(db_cluster_identifier): # 3回挑戦 for i in range(1, 3): return client.stop_db_cluster( DBClusterIdentifier=db_cluster_identifier ) time.sleep(1) raise Exception('Cannot stop rds db cluster: , ' + db_cluster_identifier)
次
- 業務の方のRDSでもやってく
時間まとめ
- 2021/10/14 にはじめた
- 2021/10/16 18:06 おわり
- 30 + 34 + 17 + 10(ブログ) = 91分
実施結果
- 業務の方でもできたら、ここに結果を書く