AWSオーロラのためのAWSラムダ関数による自動データベース更新と復元


免責事項:この記事は、here
クラウドの採択へのロードマップは、設定し、実装することは困難である可能性がありますが、一度それが完了すると、多くの柔軟性、継続的な改善のための多くのスペースと創造性のための多くの部屋は、新しいソリューションを構築するために提供しています.
自動化されたプロセスを持つことは、会社がビジネスにとって重要であることに集中するのを助けて、開発者に彼らの仕事をより効率的に最適化させます.
私が取り組んでいた最新のものの1つはクライアントの解決がすでに雲に移されたあと、続くことを必要とする仕事を伴います.私がそれについて気に入ったのは、クラウドにあるという利点を取るだけではなく、次のレベルのクラウド・ソリューションであるというServerless技術も関係しているということでした.タスクはAWSオーロラとAWS DocumentDBデータベースの両方を含みました、そして、私は提示されて、議論される若干の違いがあるので、第2のものについて別々の記事を作ります.

シナリオ


お客様には2種類のAWSアカウントがあります.
  • の容認
  • 生産
  • すべての変更は、生産アカウントで行われる(2週間ごとに)受け入れアカウントでの回帰テストのための受け入れアカウントに同期する必要があります.
    ON PREMインフラストラクチャでこれを行う方法は、手動でいくつかのコマンドを実行し、データベースを更新することでした.
    このプロセスは、メンテナンスウィンドウで行われるべきです.これは、誰もデータベースを使用していないときに、夜間/早朝の作業を意味します.

    解決概要


    我々が合意した解決策は、2つのAWSラムダ関数を持つ2つの主要部分にプロセスを分割することでした.

  • 最初のDB DB最新のスナップショットIDは主に環境の準備に集中します.
  • オーロラ
  • の最新の共有スナップショットをチェック
  • AWS SSMパラメータストア
  • の最新のスナップショットIDパラメータを更新します

  • 2番目の1つは、スナップショットからの復元、主に更新と復元プロセスをトリガに焦点を当てます.
  • は最新のスナップショットID値を現在のスナップショットIDにコピーし、メインパイプラインをトリガして最新のスナップショットからデータベースを復元して復元します
    既存のAWSラムダ関数を利用して、データベースのスナップショットを1つのアカウントから別のアカウントに共有します.共有部分はこの記事の範囲にありません、しかし、それは解決のより良い見解のために示されました.
  • AWS SSMパラメータストアでは、3つのパラメータを作成しました.
  • ssmstra rdschen currentnal snapshotcle name
  • ssmrest rdsstraラテンストープスナンドックル名
  • mainnal ciicdcle name
  • 現在の値は、データベースが復元され、最新の値がアカウントに存在する最新のスナップショットの値になります.
    最新のスナップショットのために現在のものと1つの2つの異なるパラメータを持っている必要があります.このプロセスの外側の特定のスナップショットIDからデータベースをリストアすることができ、パイプラインが動作しているときにリストアを直接トリガすることはできません.
    アカウントには2つのパイプラインがあり、インフラストラクチャを展開しているメインパイプラインの名前が必要になった.
    解決策は、AWS CDKでIACを使ってPythonで書かれました.

    どうやって働くの


    最初にパラメータをコードで定義する方法を見てみましょう.環境変数とgetfunctionオプションを取得するカスタム関数を使用しています.環境変数から特定のスナップショットarnからデータベースを復元する既存のプロセスがあります.このため、現在のRedsCount BackupSunスナップショットパラメーターのチェックを使用します.存在するならば、それはこの値でパラメタを更新します.SSMのために、あなたは空の値でSSMパラメタを作成することができないので、ダミー値を使用しました.
    current_rds_backup_snapshot = get_optional(
        'DATABASE_BACKUP_SNAPSHOT_ID_ARN',
        None
    )
    
    ssm_rds_current_snapshot_name = get_optional(
        'SSM_RDS_CURRENT_SNAPSHOT_NAME',
        None
    )
    
    ssm_rds_latest_snapshot_name = get_optional(
        'SSM_RDS_LATEST_SNAPSHOT_NAME',
        None
    )
    
    main_cicd_name = get_optional(
        'SSM_MAIN_CICD_NAME',
        None
    )
    
    resources = []
    if current_rds_backup_snapshot:
        current_arn = ssm.StringParameter(
            scope,
            f'{config["stack_name"]}RdsCurrentSnapshotArn',
            parameter_name=ssm_rds_current_snapshot_name,
            string_value=current_rds_backup_snapshot
        )
        resources.append(current_arn.parameter_arn)
    
    rds_ssm = ssm.StringParameter(
        scope,
        f'{config["stack_name"]}RdsLatestSnapshotArn',
        parameter_name=ssm_rds_latest_snapshot_name,
        string_value='dummyvalue'
    )
    resources.append(rds_ssm.parameter_arn)
    
    main_cicd_ssm = ssm.StringParameter.from_string_parameter_name(
        scope,
        f'{config["stack_name"]}MainPipelineName',
        string_parameter_name=main_cicd_name,
    )
    main_cicd_name_value = main_cicd_ssm.string_value
    resources.append(main_cicd_ssm.parameter_arn)
    resources.append(f'arn:aws:codepipeline:*:*:{main_cicd_name_value}')
    
    cronjobを使用すると、更新機能( DB update最新のスナップショットID )は午前2時に2週間毎に実行されます.
    この関数は以下のタスク/関数を持っています:
  • getSum LatestCount RdsSunnyスナップショット-オーロラDBの最新の共有スナップショットをチェックし、最新のものを取得します.
  • UpdateRange SSM -それは、AuroraRenLatestCountスナップショットIDの最新のスナップショットの新しい値でSSMパラメータストアを更新します.
    そして、これはアップデートプロセスのためです.
    今すぐ復元のためにも簡単です.別のcronjobを使用して、復元機能(DBショットからの復元)は、更新プロセスより2時間後に2週間ごとに実行されます.
    この関数のタスクは以下の通りです.

  • UpdateCounrent -最新のパラメータから値を取得し、現在のパラメータにコピーします.現在、SSMLIGHT RDSHERN CurrentCount SnapShottRange名の値は、SSMLIGHT RDSSINS LATESTHUNE SnapshotRange名の値で更新されます.パイプラインは現在のパラメータの値をチェックします.私たちは、このプロセスを上で詳述したようにこの記事で説明されたものより他のケースのスナップショットから回復を容易にするために最新の、そして、現在のパラメタでこのプロセスを分割しました.
  • は、SSMパラメタストアからmainnal cicdCount名を使用して展開パイプラインをトリガーします
  • # Trigger a new pipeline deployment
        cicd_client.start_pipeline_execution(
            name=cicd_name
        )
    

    小バンプ


    解決策を見つける過程は、実装の各段階で挑戦的でした.初めに、我々は既存のものの上に来て、それを改善するために働く解決を見つけようとしました.ラムダ関数を使用してソリューションを実装する過程では、必要な正確なスナップショットを特定する問題がありました.これはもちろん、ドキュメントを展開して読みたいものを知ることでした.たとえば、利用可能な共有スナップショットをチェックする方法は次のようになります.
    rds_shared_snapshots = rds_client.describe_db_cluster_snapshots(
            SnapshotType='shared',
            IncludeShared=True
        )
    
        # Check available RDS shared snapshots from the source account
        rds_snapshots_source = []
        for snap in rds_shared_snapshots['DBClusterSnapshots']:
            source_account_id = snap['DBClusterSnapshotIdentifier'].split(':')[4]
            if snap['Status'] == 'available' and \
               source_account_id == source_account and \
               snap['EngineVersion'] == rds_engine_version:
                rds_snapshots_source.append(snap)
    
    それで、我々はすべてのスナップショットから特定のソース口座IDを持っているものを選択しなければなりませんでした.

    結論


    我々が持っていた小さなバンプでさえ、この解決はAWSクラウドで実装するのがかなり簡単です.ソリューションは、時間とお金を節約するだけでなく、データベースの操作が実装されている夜、その時点で簡単に起こることができる人間のエラーに対しても環境を保護します.手動のタスクでは、開発者は他の重要なタスクに焦点を当てることができますまた、ソリューションへのより多くの自動化をもたらす上で.DocumentDBのシナリオでは、どのような違いがあるかを確認し、どのように動作させることができます.