t_hazawaの日記

株式投資とWebエンジニアリングのブログです。株式投資の目次は→です。 https://t-hazawa.hatenablog.com/entry/2021/02/12/220933

AWS Lambda で RDSを止めた

前: RDSを自動で止めたいのでAWS Lambdaを学ぶ - t_hazawaの日記

経緯

  • 手間を節約したい
  • この前学んだ
  • 今回実践 (私物AWS)

復習

やること

  • 復習
  • RDSつくり
  • Lambda用意
  • Lambda テスト
  • CloudWatch 設定

RDSつくり

  • つくった
  • 業務の方に合わせて、 Aurora MySQL にした

Lambda 用意

謎だった Lambda Layersについて

  • 最新のsdkや、複数のlambda関数で使用する共有ロジックを「レイヤー」として外出しして配置し、本来の目的のみlambda関数で実装することができるようになりました。

  • 共有ロジックがレイヤーらしい。 2021/10/15 18:45 6m
    • なんかAWSって AppSync (GraphQLでデータをだしいれするやつ) もだけど、命名が微妙な漢字がする

権限をちゃんとやる

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分

実施結果

  • 業務の方でもできたら、ここに結果を書く