はじめに
AWS CodePipelineでStepFunctionsのステートマシンを実行します。
準備
S3バケットを2つとStepFunctionsのステートマシンを1つ用意します。S3バケットの1つは、バージョニングを有効にします。CodePipelineのソース(Source)ステージのアクションに使用するS3バケットは、バージョニング有効が条件のようです。
- S3バケット名
- tmp-0wwkdvhvwz (バージョニング有効)
- tmp-hokdvhvwzw
StepFuncitions ステートマシン HOGE
を作成しました。ペイロード(入力値:JSON形式)の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バケットを使用したアクションを設定しました。
{"HOGE": 50}
s3バケット tmp-0wwkdvhvwz
に test/sample.zipをアップロードします。
sample.zipのアップロードを検知しパイプライン test001
が実行を開始します。
パイプライン test001
実行により、s3バケット tmp-hokdvhvwzw
にsample.jsonがアップロードされます。
{"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
とする
- S3バケット
- ② invokeステージのStepFuncアクションについて
- S3バケット
tmp-hokdvhvwzw
を指定 - 入力アーティファクトを
SourceArtifact
とする - StepFunctions スマートマシン
HOGE
とする - 入力タイプをファイルパスとし、
hoge-200.json
とする- ※
hoges.zip
の中のhoge-200.json
をStepFunctionに渡す
- ※
- 出力アーティファクト名
hogeout
とする
- S3バケット
- ③ DeployステージのDeployアクションについて
- S3バケット
tmp-0wwkdvhvwz
を指定 - 入力アーティファクトを
hogeout
とする
- S3バケット
実行します
以下2つのファイルを圧縮したhoges.zip
をS3バケットtmp-0wwkdvhvwz
のtest/hoges.zip
としてアップロードします。
アップロードするhoges.zip
の内容を変えて2回実施します
1回目のhoges.zip
{"HOGE": 100}
{"HOGE": 200}
2回目のhoges.zip
{"HOGE": 100}
{"HOGE": 100}
実行結果
1回目と2回目でStepFunctionsの処理が変わっていることを確認しました(期待した処理)。
また、S3バケットtmp-hokdvhvwzw
のtest2/out.zip
を解凍するとoutput.json
があります。
{"HOGE": 100}
(おまけ)パイプライン test002 に承認処理を加える
Sourceステージとinvokeステージに間にProcedureステージを作成し、承認処理を設定しました。承認依頼はメール送信なのでSNSトピックが必要になります。
実行します
実行すると、以下のようなメールが送信されます。
メールにはパイプラインtest002
へのリンクがあり、パイプライン上のレビューボタンから却下/承認を選択します。
承認処理を承認すると処理はそのまま実行されます。却下すると以下のようになり、その後の処理は実行されません。
実行者と承認者をわける権限設定について
承認プロセスを追加しても、実行者が承認できないように権限を設定する必要があります。動作確認はしていませんが、おそらく以下の権限割り当てでいけると思います。
- 実行者
- S3バケット
tmp-0wwkdvhvwz
へファイルをアップロードする権限 - パイプライン
test002
を閲覧する権限- IAMポリシー
AWSCodePipelineReadOnlyAccess
- IAMポリシー
- S3バケット
- 承認者
- パイプライン
test002
で承認できる権限- IAMポリシー
AWSCodePipelineApproverAccess
- IAMポリシー
- パイプライン
※課題※ 承認者が、却下/承認の判断を楽にできる仕組みが必要そう。
最後に
CodePipelineとStepFunctionsを組み合わせると、運用にかかわる手順を自動化できそうです。