背景・目的
以前、下記でカスタムモニタリングを試してみました。今回はDataDogのインテグレーション機能を利用してStep Functionsをモニタリングします。
実践
事前準備
Datadog Integrationsの準備
-
DataDogにサインインします
-
ナビゲーションペインで、「Integrations」をクリックします
-
下記を入力し、「Launch CloudFormation Template」をクリックします
-
「スタックの作成」をクリックします
Datadog
IAMロールを修正
- AWSにサインインします
- CloudFormationに移動します
- DatadogIntegration-DatadogIntegrationRoleStackを選択します
- テンプレートタブをクリックします
- 「Infrastructure Composerで表示」をクリックします
- 「テンプレート」をクリックします
-
DatadogAWSIntegrationPolicy
に下記を追加しますstates:ListStateMachines, states:DescribeStateMachine
- 「テンプレートを更新」をクリックします
- 更新します
VPCの作成
AWS Batchを動かすためにVPCを作成します
- AWSにサインインします
- VPCに移動します
- VPCを作成をクリックします
- 下記の要領で作成します
- パブリックサブネット
- プライベートサブネット
- NAT GW
アプリケーションの作成
AWS Batch用コードの準備
-
下記のシンプルなコードを作成します
import time import os print("Job started.") time.sleep(10) print("Job completed.")
-
Dockerfileを作成します
FROM python:3.11-slim COPY job.py /app/job.py WORKDIR /app CMD ["python", "job.py"]
-
Dockerデーモンを起動するため、colimaを実行します
colima start
-
ビルドします
docker build -t my-batch-job . % docker images my-batch-job REPOSITORY TAG IMAGE ID CREATED SIZE my-batch-job latest XXXXX About a minute ago 130MB %
-
ローカルで動作確認してみます。動作しました
% docker run -it my-batch-job Job started. Job completed. %
イメージの準備
-
ECRリポジトリを作成します
% aws ecr create-repository --repository-name my-batch-job { "repository": { "repositoryArn": "arn:aws:ecr:ap-northeast-1:XXXXX:repository/my-batch-job", "registryId": "XXXXX", "repositoryName": "my-batch-job", "repositoryUri": "XXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/my-batch-job", "createdAt": "2025-03-20T17:09:03.320000+09:00", "imageTagMutability": "MUTABLE", "imageScanningConfiguration": { "scanOnPush": false }, "encryptionConfiguration": { "encryptionType": "AES256" } } } %
-
ECRにログインします
$ aws ecr get-login-password | docker login --username AWS --password-stdin <account_id>.dkr.ecr.<region>.amazonaws.com Login Succeeded
-
タグ付けします
% docker tag my-batch-job:latest <account_id>.dkr.ecr.ap-northeast-1.amazonaws.com/my-batch-job:latest % docker images <account_id>.dkr.ecr.ap-northeast-1.amazonaws.com/my-batch-job REPOSITORY TAG IMAGE ID CREATED SIZE <account_id>.dkr.ecr.ap-northeast-1.amazonaws.com/my-batch-job latest XXXXXX 13 minutes ago 130MB %
-
ECRにプッシュします
% docker push <account_id>.dkr.ecr.ap-northeast-1.amazonaws.com/my-batch-job:latest The push refers to repository [<account_id>.dkr.ecr.ap-northeast-1.amazonaws.com/my-batch-job] ・・・・ latest: digest: sha256:XXXXXX size: 1366 %
AWS Batch
AWS Batchを作成します。
- AWS Batchに移動します
コンピューティング環境
- ナビゲーションペインで「コンピューティング環境」をクリックします
- 「作成」をクリックします
- 下記を指定し、「次へ」をクリックします
- EC2スポットインスタンス等の設定をし、「次へ」をクリックします
- 作成したVPC、サブネットを選択し、「次へ」をクリックします
- 「コンピューティング環境を作成」をクリックします
- できました
ジョブキュー
-
ナビゲーションペインで「ジョブキュー」をクリックします
-
「作成」をクリックします
-
下記を指定し、「ジョブキューの作成」をクリックします
ジョブ定義
-
ナビゲーションペインで「ジョブ定義」をクリックします
-
「作成」をクリックします
-
下記を指定し、「次へ」をクリックします
- オーケストレーションタイプ:EC2
- 全般
- 名前:任意
- 実行タイムアウト:300秒
- スケジュールの優先度:1
- ジョブの試行:1
-
コンテナ設定では、作成したECRを指定し「次へ」をクリックします
-
Linnuxとロギングの設定を「次へ」をクリックします
-
「ジョブ定義を作成」をクリックします
AWS Step Functions
AWS Batchを呼び出す、Step Functionsを作成します。
- AWS Step Functionsに移動します
ステートマシンの作成
-
「ステートマシンの作成」をクリックします
-
ステートマシン名を指定し、「続行」します
-
下記のコードを指定し、「作成」をクリックします
{ "Comment": "sample statement", "StartAt": "SubmitBatchJob", "States": { "SubmitBatchJob": { "Type": "Task", "Resource": "arn:aws:states:::batch:submitJob.sync", "Arguments": { "JobName": "sample-job", "JobDefinition": "arn:aws:batch:ap-northeast-1:XXXXXX:job-definition/my-job-definition:1", "JobQueue": "arn:aws:batch:ap-northeast-1:XXXXXX:job-queue/my-batch-queue" }, "End": true } }, "QueryLanguage": "JSONata" }
-
ロールの作成で「確認」をクリックします
-
できました
テスト
上記で作成したステートメントを実行してみます
Step Functions(Batch)とDatadogを統合
Step Functionsの設定変更
Step FunctionsでCloudWatch Logsにログを出力するように設定します。
IAMロール
デフォルトで作成されたIAMロールにはCloudWatch Logsへのログ出力ポリシーが含まれていないため、修正します。
- IAMロールに移動します
- 該当のロールにアタッチされているIAMポリシーに、下記のポリシーを追加します
{ "Effect": "Allow", "Action": [ "logs:CreateLogDelivery", "logs:GetLogDelivery", "logs:UpdateLogDelivery", "logs:DeleteLogDelivery", "logs:ListLogDeliveries", "logs:PutResourcePolicy", "logs:DescribeResourcePolicies", "logs:DescribeLogGroups", "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "*" }
Step Functions
-
Step Functionsに移動します
-
対象のステートマシンを選択します
-
「ステートマシンの編集」をクリックします
DataDogの準備
DataDogの設定を確認しておきます。
- Datadogにサインインします
AWS Integration 設定確認
- ナビゲーションペインで、「Integrations」をクリックします
- 「Amazon Web Services」をクリックします
- 「Metric Collection」タブをクリックし、「Step Functions」を検索します
- 有効になっている事がわかります
Datadog Forwarderのセットアップ
API KEYの準備
DatadogのAPI KEYを取得します
- ナビゲーションペインで、「アカウント」>「API Keys」をクリックします
- API Keysをコピーします
Lambdaのセットアップ
-
こちらのページで、「Launch Stack」をクリックします
-
下記を入力し、「スタックの作成」をクリックします
CloudWatchのサブスクリプションフィルターの設定
サブスクリプションの設定
-
CloudWatchに移動します
-
ナビゲーションペインの「ロググループ」をクリックします
-
対象のロググループを選択します
-
下記を指定します
-
「パターンをテスト」をクリックすると出力イメージがわかります
-
「ストリーミングを開始」をクリックすると、作成されます
ログイベントの作成
-
対象のCloudWatch Logsを選択します
-
「ログストリームを作成」をクリックします
-
作成したログストリームをクリックします
Logsで確認
-
ナビゲーションペインで、「Logs」をクリックします
-
「Get Started」をクリックします
Step Functionsを実行し、Datadogで確認する
-
Step Functionsに移動します
-
ナビゲーションペインで、「ステートマシン」をクリックします
-
対象のステートマシンをクリックします
-
「実行を開始」をクリックします
考察
今回、下記を試してみました。次回は実行ステータスを可視化してみたいと思います。
- Step FunctionsのログをCloudWatch Logsへ出力
- CloudWatch Logsにサブスクリプションフィルターを設定
- Datadogで確認
参考