[AWS]CodePipelineでStepFunctionsを実行する


はじめに

AWS CodePipelineでStepFunctionsのステートマシンを実行します。

準備

S3バケットを2つとStepFunctionsのステートマシンを1つ用意します。S3バケットの1つは、バージョニングを有効にします。CodePipelineのソース(Source)ステージのアクションに使用するS3バケットは、バージョニング有効が条件のようです。

  • S3バケット名
    • tmp-0wwkdvhvwz (バージョニング有効)
    • tmp-hokdvhvwzw

StepFuncitions ステートマシン HOGE を作成しました。ペイロード(入力値:JSON形式)のHOGEの値によって処理が分岐します。

StepFunctionsステートマシンHOGE
{
  "Comment": "This is your state machine",
  "StartAt": "Choice",
  "States": {
    "Choice": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.HOGE",
          "NumericEquals": 100,
          "Next": "Pass HOGE 100"
        }
      ],
      "Default": "Pass HOGE Not 100"
    },
    "Pass HOGE 100": {
      "Type": "Pass",
      "End": true
    },
    "Pass HOGE Not 100": {
      "Type": "Pass",
      "End": true
    }
  }
}

CodePipeline

パイプラインを作ります。



パイプライン test001 (S3 -> S3)

S3バケットのデータを別のS3バケットに格納するパイプラインを作ります。(StepFunctionsは使用しません)
Sourceステージと、DeployステージにS3バケットを使用したアクションを設定しました。

sample.json
{"HOGE": 50}

s3バケット tmp-0wwkdvhvwz に test/sample.zipをアップロードします。


sample.zipのアップロードを検知しパイプライン test001 が実行を開始します。

パイプライン test001実行により、s3バケット tmp-hokdvhvwzw にsample.jsonがアップロードされます。

sample.json(s3バケットtmp-hokdvhvwzw)
{"HOGE": 50}


パイプライン test002 (S3 -> StepFunctions-> S3)

S3バケットtmp-0wwkdvhvwzのデータを入力値としてStepFunctionsを実行します。また、StepFunctionsの実行結果をS3バケットtmp-hokdvhvwzwに出力します。

  • SourceステージとDeployステージの間に、invokeステージを追加
  • ① SouceステージのSourceアクションについて
    • S3バケットtmp-0wwkdvhvwzを指定
    • test/hoges.zipが更新された際にパイプラインが実行する
    • 出力アーティファクト名SourceArtifactとする
  • ② invokeステージのStepFuncアクションについて
    • S3バケットtmp-hokdvhvwzwを指定
    • 入力アーティファクトをSourceArtifactとする
    • StepFunctions スマートマシンHOGEとする
    • 入力タイプをファイルパスとし、hoge-200.jsonとする
      • hoges.zipの中のhoge-200.jsonをStepFunctionに渡す
    • 出力アーティファクト名hogeoutとする
  • ③ DeployステージのDeployアクションについて
    • S3バケットtmp-0wwkdvhvwzを指定
    • 入力アーティファクトをhogeoutとする

実行します
以下2つのファイルを圧縮したhoges.zipをS3バケットtmp-0wwkdvhvwztest/hoges.zipとしてアップロードします。

アップロードするhoges.zipの内容を変えて2回実施します

1回目のhoges.zip

hoge-100.json
{"HOGE": 100}
hoge-200.json
{"HOGE": 200}

2回目のhoges.zip

hoge-100.json
{"HOGE": 100}
hoge-200.json
{"HOGE": 100}

実行結果
1回目と2回目でStepFunctionsの処理が変わっていることを確認しました(期待した処理)。

また、S3バケットtmp-hokdvhvwzwtest2/out.zipを解凍するとoutput.jsonがあります。

2回目のoutput.json
{"HOGE": 100}

(おまけ)パイプライン test002 に承認処理を加える

Sourceステージとinvokeステージに間にProcedureステージを作成し、承認処理を設定しました。承認依頼はメール送信なのでSNSトピックが必要になります。


実行します
実行すると、以下のようなメールが送信されます。

メールにはパイプラインtest002へのリンクがあり、パイプライン上のレビューボタンから却下/承認を選択します。

承認処理を承認すると処理はそのまま実行されます。却下すると以下のようになり、その後の処理は実行されません。


実行者と承認者をわける権限設定について
承認プロセスを追加しても、実行者が承認できないように権限を設定する必要があります。動作確認はしていませんが、おそらく以下の権限割り当てでいけると思います。

  • 実行者
    • S3バケットtmp-0wwkdvhvwzへファイルをアップロードする権限
    • パイプラインtest002を閲覧する権限
      • IAMポリシーAWSCodePipelineReadOnlyAccess
  • 承認者
    • パイプラインtest002で承認できる権限
      • IAMポリシーAWSCodePipelineApproverAccess

※課題※ 承認者が、却下/承認の判断を楽にできる仕組みが必要そう。


最後に

CodePipelineとStepFunctionsを組み合わせると、運用にかかわる手順を自動化できそうです。