AWS Step FunctionsステートマシンでCloudWatchメトリクスを発行する

2021.11.06

こんにちは、CX事業本部 IoT事業部の若槻です。

今回は、AWS Step FunctionsステートマシンでCloudWatchメトリクスを発行してみました。

構成

下記のような構成を作成します。

やってみた

Lambda関数の作成

発行するメトリクスの値はLambda関数を使用してランダムな値を生成することにします。

下記のコードでLambda関数randomTemperatureを作成します。0から30の間のtemperatureの値を返します。

exports.handler = async () => {
    const max = 30;
    
    return {temperature: Math.floor( Math.random() * max )};
};

ステートマシンの作成

Step Functions Workflow Studioでステートマシンを作成します。

Step Functionsのマネジメントコンソールでステートマシンの作成を開始します。

[次へ]をクリックします。

[アクション]からAWS Lambda Invokeをドラッグして追加します。

[Lambda Invoke]の[設定]で、[APIパラメータ]-[Function name]で先程のLambda関数を指定し、[ペイロード]でNo payloadを指定します。

続いて[action]をPutMetricDataで検索して[CloudWatch System Manager GetParameter]をLambda Invokeの下の位置にドラッグして追加します。

[PutMetricData]の[設定]で、[APIパラメータ]で下記のJSONを指定します。これによりLambda関数が生成したtemperatureの値をメトリクスとして発行できます。[次へ]をクリックします。

{
  "MetricData": [
    {
      "MetricName": "temperature",
      "Value.$": "$.temperature"
    }
  ],
  "Namespace": "StateMachinePublish"
}

生成されたコードを確認します。Lambda実行のリトライの処理は既定で設定されるようですね。[次へ]をクリックします。

今回生成されたコード(ステートマシン定義)は下記のようになります。

{
  "Comment": "A description of my state machine",
  "StartAt": "Lambda Invoke",
  "States": {
    "Lambda Invoke": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "OutputPath": "$.Payload",
      "Parameters": {
        "FunctionName": "arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:randomTemperature:$LATEST"
      },
      "Retry": [
        {
          "ErrorEquals": [
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException"
          ],
          "IntervalSeconds": 2,
          "MaxAttempts": 6,
          "BackoffRate": 2
        }
      ],
      "Next": "PutMetricData"
    },
    "PutMetricData": {
      "Type": "Task",
      "End": true,
      "Parameters": {
        "MetricData": [
          {
            "MetricName": "temperature",
            "Value.$": "$.temperature"
          }
        ],
        "Namespace": "StateMachinePublish"
      },
      "Resource": "arn:aws:states:::aws-sdk:cloudwatch:putMetricData"
    }
  }
}

[ステートマシンの作成]をクリックして作成を完了します。(PutMetricDataの権限が不足しているとのことなので、後で追加します。)

ステートマシンを作成できました。不足しているパラメータストアへのアクセス権限を付与するために[IAMでロールを編集]をクリックします。

今回はAWS管理ポリシーのCloudWatchFullAccessをアタッチしました。(実際の利用では必要に応じて権限を絞ってください)

EventBridgeルールの作成

前述のステーマシンを「1分毎(rate(1 minute))」で実行するEventBridgeルールを作成します。

作成方法については以前の下記エントリに詳しく紹介しています。

動作

CloudWatchのコンソールでグラフ化されたメトリクスを確認することができます。1分毎に0から30の間の値が発行されていますね。

参考

以上