Amazon Web Services ブログ

AWS Batch および Amazon CloudWatch ルールにより Amazon RDS ジョブをスケジュールおよび実行する



従来、データベース管理者と開発者は、データベースが実行されているホスト上でシステム cron を使用して、スクリプトをデータベースに対して実行するようにスケジュールしています。Amazon Relational Database Service (RDS) は、マネージドデータベースサービスとして、基盤となるインフラストラクチャへのアクセスを提供しないため、そのようなワークロードをオンプレミスから移行する場合は、ジョブを移動する必要があります。この記事は、ジョブを一元的にスケジュールおよび実行する代替方法について説明します。

AWS Batch は、コンピューティングジョブのプロビジョニング、管理、モニタリング、スケーリングの複雑さを抽象化し、AWS でジョブを簡単かつ効率的に実行できるようにするマネージドサービスです。さらに、AWS Batch では、選択した言語を使用してジョブを構築し、それを Docker コンテナとしてデプロイできます。

この記事では、AWS Batch ルールと Amazon CloudWatch ルールを組み合わせることで、動的にリソースをプロビジョニングし、PostgreSQL データベースで関数またはストアドプロシージャをスケジュールして実行する方法を示します。同じプロセスを使用して、Amazon RDS データベースでジョブを実行できます。

ソリューションの概要

次の図は、ソリューションのアーキテクチャを示しています。

前提条件

始める前に、以下の前提条件を満たす必要があります。

  • マシンに Docker Desktop をインストールします。
  • マシンに git をインストールします。
  • AWS CLI をセットアップして設定します。手順については、「AWS CLI のインストール」を参照してください。
  • AWS CloudFormation テンプレートの入力パラメータとして、デフォルトのサブネットとセキュリティグループのカンマ区切りのリストを指定します。

チュートリアル

このチュートリアルの概要については、次の手順をご覧ください。

  1. AWS コードサンプルリポジトリからプロジェクトをクローンする
  2. CloudFormation テンプレートをデプロイして必要なサービスを作成する
  3. AWS CloudFormation コンソールに移動し、リソースが作成されていることを確認します
  4. データベーススクリプトを実行し、必要なテーブルと関数を作成する
  5. Docker イメージをビルド、タグ付けし、Amazon ECR にプッシュする
  6. CloudWatch ルールに基づいて、AWS Batch がジョブを正常に実行しているかどうかを確認する

この記事では、AWS CodeCommit および AWS CodeBuild のジョブとスケジュールの変更を管理するオプションの手順も示します。

AWS サンプルかのソースコードをクローンする

環境のセットアップに必要なファイルをダウンロードします。次のコードを参照してください。

$ git clone https://github.com/aws-samples/aws-batch-rds-job-scheduling

$ cd aws-batch-rds-job-scheduling

CloudFormation テンプレートをデプロイする

CloudFormation スクリプトを実行するには、次の手順を実行します。

  1. Amazon VPC コンソールで、[サブネット] セクションに移動します。
  2. 使用する VPC のサブネット ID を記録します。
  3. 以下のスクリーンショットのプレビューに示すように、上記の手順で記録したサブネットと VPC にアタッチされているセキュリティグループ ID を記録します。
  4. batchenv-cf.yaml の入力パラメータとして、デフォルトのサブネットとセキュリティグループのカンマ区切りリストを更新します。

CloudFormation テンプレートを実行して、必要なサービスをプロビジョニングします。次のコードを参照してください。

$ aws cloudformation create-stack --stack-name batchjob --template-body file://batchenv-cf.yaml --capabilities CAPABILITY_NAMED_IAM --region us-east-1
{
"StackId": "arn:aws:cloudformation:us-east-1:XXXXXXXXXXXXXX:stack/batchjob/73448940-63c5-11ea-918d-1208f0f76cbf"
}

テンプレートにより、以下が作成されます。

  • Docker イメージを格納する Docker レジストリ
  • ジョブの Docker イメージ、IAM ロール、およびリソース要件を定義するジョブ定義
  • コンピューティング環境で実行する準備ができるまでのジョブのキュー
  • AWS Batch がジョブが使用するコンピューティングリソースを管理するコンピューティング環境
  • PostgreSQL インスタンス
  • PostgreSQL データベースログイン認証情報を持った AWS Secrets Manager
  • スケジュールに基づいて AWS Batch ジョブを実行する CloudWatch ルール
  • 適切なアクセス許可を持つロール

以下は、CodeCommit と CodeBuild を使用してジョブとスケジュールのルールへの変更を管理することにした場合にのみ必要となる補助的なサービスです。

  • buildspec.yml および src フォルダを格納するリポジトリ
  • Docker イメージをビルド、タグ付け、レジストリにプッシュする CodeBuild プロジェクト

サービスは、CloudFormation スタック名を接頭辞として作成されます。次のスクリーンショットは、成功した CloudFormation デプロイの詳細を示しています。

データベーススクリプトを実行する

データベーススクリプトを実行するには、次の手順を実行します。

  1. Amazon RDS コンソールの [データベース] で、[接続とセキュリティ] を選択します。
  2. 以下のスクリーンショットのプレビューに示すように、データベースエンドポイントの URL とポートを記録します。
  3. Secrets Manager コンソールの [シークレット] で、シークレットを選択します。
  4. [シークレットの値を取得する] を選択します。
  5. データベースの認証情報を書き留めます。
  6. CloudFormation テンプレートがプロビジョニングした PostgresSQL データベースに接続します。
  7. SQL スクリプト CreateSampleDataAndSP.sqlGitHub からダウンロードします。このスクリプトを実行して、データベースに次のオブジェクトを作成します。
  • DEPT – テーブル
  • EMP – テーブル
  • LOW_HIGH_SALARIES – 関数

Docker イメージの構築、タグ付け、Amazon ECR へのプッシュ

Docker イメージをビルドしてタグ付けし、Amazon ECR にプッシュするには、次の手順を実行します。

  1. ローカルマシンで、ダウンロードしたソースコードがあるフォルダに移動します。次のコードを参照してください。
    $ cd aws-batch-rds-job-scheduling/src
  2. このファイルを開き、次の値を変更します (CloudFormation テンプレートをデプロイしたときに別のスタック名とリージョンを選択した場合)。次のコードを参照してください。
    secret_name = "batchjob-secret"
    region_name = "us-east-1"

    データベースジョブに接続して実行する Python スクリプト (src/runjob.py) は、US-East-1 でプレフィックス batchjob が付いたデータベースシークレット名を検索するように設定されています。

  3. Amazon ECR に接続するには、次のコードを入力します。
    $(aws ecr get-login --region us-east-1 --no-include-email)
  4. requirements.txt に記載されている Python スクリプトとすべてのライブラリを Docker コンテナとしてパッケージ化するには、次のコードを入力します。
    $ docker build -t batchjob-ecr .
  5. Amazon ECR コンソールの [リポジトリ] で、リポジトリリンクを選択します。
  6. 環境固有のコマンドをタグ付けしてプッシュするには、[プッシュコマンドの表示] を選択します。
    次のスクリーンショットは、プッシュコマンドの場所を示しています。
  7. 前のスクリーンショットのステップ 3 にリストされているコードを入力します。次のコード例を参照してください。
    $ docker tag batchjob-ecr:latest 765500136580.dkr.ecr.us-east-1.amazonaws.com/batchjob-ecr:latest
  8. 前のスクリーンショットのステップ 4 にリストされているコードを入力します。次のコード例を参照してください。
    $ docker push 765500136580.dkr.ecr.us-east-1.amazonaws.com/batchjob-ecr:latest
  9. Docker イメージをローカルマシンから Amazon ECR にプッシュしたかどうかを確認します。
    次のスクリーンショットは、Amazon ECR コンソールにアップロードされた Docker イメージを示しています。

AWS Batch ジョブを手動で実行する

AWS Batch ジョブを手動で実行するには、次の手順を実行します。

  1. AWS Batch コンソールで、[ジョブ] を選択します。
  2. [ジョブの送信] を選択します。
  3. [ジョブ名] には、ジョブの名前を入力します。
  4. [ジョブ定義] では、ジョブ定義を選択します。
  5. [ジョブキュー] では、ジョブキューを選択します。
  6. vCPU とメモリの設定を変更します (このチュートリアルの場合はデフォルト設定で十分です)。
  7. [ジョブの送信] を選択します。
  8. [ジョブ] の下で、ジョブ ID リンクを選択し、ログを表示して、ジョブが正常に完了したことを確認します。
    次のスクリーンショットは、ジョブが正常に完了したことを示しています。
    AWS Batch ジョブは、次の関数を実行し、(runjob.py スクリプトで) 入力として指定された部門の従業員のうち、最高および最低の給与をもらっている従業員を表示するように設定されています。

    # Call stored procedure
    cur.callproc('low_high_salaries', (10,))
    

    AWS Batch が作成した CloudWatch Logs を使用してジョブを検証できます。次のスクリーンショットは、AWS Batch コンソールを介したジョブの詳細を示しています。
    次のスクリーンショットは、ジョブの CloudWatch Logs を示しています。

スケジュールに従い実行した AWS Batch ジョブの確認

CloudFormation テンプレートは、スケジュールに従ってジョブを実行する CloudWatch ルールも作成します。ルールを編集してスケジュールを変更できます。

  1. CloudWatch コンソールの [ルール] で、ルールを選択します。
  2. [アクション] ドロップダウンメニューから、[編集] を選択します。
  3. 要件に基づいてスケジュールを変更します。
  4. バッチジョブキューの入力として、[既存のロールを使用] を選択します。
  5. [BatchServiceRole] を選択します。
  6. [設定の詳細] を選択します。
  7. [ルールの更新] を選択します。
  8. [ダッシュボード] ページでスケジュールされたジョブをモニタリングします。
  9. ジョブが成功したことを確認するには、[ジョブ] ページで、[成功] を選択します。

クリーンアップ

AWS マネジメントコンソールで、CloudFormation スタック batchjob に移動して削除します。

または、AWS CLI に次のコードを入力します。

$ aws cloudformation delete-stack --stack-name batchjob

CodeCommit および CodeBuild のジョブおよびスケジュールルールの変更を管理する

手動で構築、タグ付け、ECR にプッシュする代わりに、次の手順を使用して Docker イメージへの変更を管理できます。

CodeCommit リポジトリにコードをコミットするには、次の手順を実行します。

  1. コンソールの [開発者用ツール] で、[CodeCommit] を選択します。
  2. [リポジトリ] を選択します。
  3. [batch-job-codecommit] を選択します。
  4. [URL のクローン] を選択します。
  5. [HTTPS のクローン] を選択します。
  6. [batchjob-codecommit] のクローンを作成します。次のコードを参照してください:
    $ git clone https://git-codecommit.us-east-1.amazonaws.com/v1/repos/batchjob-codecommit
  7. AWS サンプルからダウンロードした src フォルダと buildspec.yml を、CodeCommit からクローンしたリポジトリにコピーします。
    src フォルダには、関数を接続して実行するための Python コードが含まれています。Python スクリプト (src/runjob.py) は、batchjob プレフィックス (たとえば、secret_name = "batchjob-secret") を持つデータベースシークレットを探すように設定されています。別のプレフィックスを選択した場合は、この値を変更する必要があります。次のコードを参照してください。

    $ cp -Rf aws-batch-rds-job-scheduling/src ./batchjob-codecommit/.
    $ cp -Rf aws-batch-rds-job-scheduling/buildspec.yml ./batchjob-codecommit/.
    $ cd ./batchjob-codecommit/
    $ git add --all
    $ git commit -m "first commit"
    $ git push origin master

    次のスクリーンショットは、リポジトリへの正常なコードのアップロードを示しています。
    [ビルドの実行] をクリックしてビルドをモニタリングします。
    次のスクリーンショットは、ビルドログを示しています。
    ビルドジョブが正常に完了すると、Python スクリプトと他のライブラリを含む Docker イメージが Amazon ECR にプッシュされます。

まとめ

この記事では、さまざまな AWS のサービスを統合して、PostgresSQL データベースでジョブをスケジュールして実行する方法を示しました。Docker コンテナに互換性のある python アダプターを含め、それを python スクリプトにインポートすることで、同じソリューションで任意の RDS データベースでジョブを実行したり、複雑なジョブワークフローを調整したりできます。

さらに、このソリューションは、AWS Batch および CloudWatch ルールとともにプロビジョニングされた CI/CD ツールチェーンを使用して、ジョブとスケジュールの変更を管理するのに役立ちます。

 

 


著者について

 

Udayasimha Theepireddy (Uday) は、アマゾン ウェブ サービスのシニアクラウドアーキテクトです。彼は AWS のお客様と協力して、大規模な移行に関するガイダンスと技術支援を提供し、AWS を使用する際のソリューションの価値の向上を支援しています。

 

 

Vinod Ramasubbu は、アマゾン ウェブ サービスのクラウドアプリケーションアーキテクトです。 彼はお客様と協力して、AWS クラウド上で大規模なビジネスソフトウェアを構築、設計、自動化しています