LoginSignup
0

More than 1 year has passed since last update.

AWS-CDKでStepFunctionのDescribeXXXタスクを実装する

Last updated at Posted at 2022-12-01

初めまして!
Webエンジニアで飯を食べている大西です。
初めてQiitaに記事を書くので、至らぬ点もあるかと思いますが、生暖かい目で見ていただけると嬉しいです!

はじめに

最近、タスクが200個ぐらい追加されて、StepFunctionを活用する場面が増えて来ましたよね〜

WebUI上でアーキテクチャを組み終わっていざAWS-CDKで書き起こそうとした時に、DescribeXXXのタスクの実装方法が見つからなくて、かなり時間を使ってしまいました、、、

ということで、この記事ではAWS-CDKでDescribeXXXタスクを実装する方法をご紹介します。

環境

実行環境

  • macOS Monterey v12.5.1
  • node v16.3.0

package

  • typescript@3.9.10
  • aws-cdk@2.43.1

DescribeInstanceStatuceの場合

DescribeInstanceStatuceの場合、以下のように書きます。
State Machineの定義を含めて全部書くと長いので、タスク定義に必要な最低限のコードだけ書きます。

import { Stack, StackProps } from "aws-cdk-lib";
import { Construct } from "constructs";
import * as iam from "aws-cdk-lib/aws-iam";
import * as sfnTasks from "aws-cdk-lib/aws-stepfunctions-tasks";

export class StepFunctionStack extends Stack {
    constructor(scope: Construct, id: string, props?: StackProps) {
        super(scope, id, props);

        // taskのrole. これがないと実行できない
        const describeInstanceStatusTaskRole = new iam.Role(
            this,
            "DescribeInstanceStatusTaskRole",
            {
                assumedBy: new iam.CompositePrincipal(
                    new iam.ServicePrincipal("states.amazonaws.com")
                ),
                managedPolicies: [
                    iam.ManagedPolicy.fromAwsManagedPolicyName("AmazonEC2FullAccess"),
                ],
            }
        );
        
        // describeInstanceStatusのタスク定義
        const describeInstanceStatusTask = new sfnTasks.CallAwsService(
            this,
            "DescribeInstanceStatusTask",
            {
                service: "ec2",
                action: "describeInstanceStatus",
                // state machineのinputで単一のinstanceIdが渡ってくる想定
                parameters: {
                    "InstanceIds.$": "States.Array($.instanceId)",
                },
                iamResources: [describeInstanceStatusTaskRole.roleArn],
                resultPath: "$.describeInstanceResult",
            }
        );
    }
}

他のAPIでも使えるように一般化

そもそも200個のタスクが追加されたのは、StepFunction用の機能が追加された訳ではなく、StepFunctionのタスクとしてAPIを叩けるようになったみたいですね(全部確認したわけではないので、それ以外のものも含まれるかもしれませんが、、、

APIを呼べる機能のことをAWS公式ではAWS SDK統合と呼んでるみたいです。
https://docs.aws.amazon.com/step-functions/latest/dg/supported-services-awssdk.html

StepFunctionのタスクでAWS SDK統合を利用する方法は公式ドキュメントにもあります。
https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_stepfunctions_tasks-readme.html#aws-sdk

公式ドキュメントだけだと微妙に分かりにくいので、AWS CLIを使って一般化したコードも載せておきます。

// aws <conmmand> <subcommand> <parameter>に相当するタスクを書きます。記法はよしなに変換してください。
// ex) aws ec2 describe-instance-status --instance-ids "<instanceId>"

const callAPITask = new sfnTasks.CallAwsService(
    this,
    "CallAPITask",
    {
        service: "<command>",
        action: "<subcommand>",
        iamResources: [callAPITaskRole.roleArn],  // 必要なRoleを定義して下さい
        parameters: {
            <parameter>
        }
    }
);

おわりに

英語でググっても全然記事が出てこなくて、最終的にはAWSのサポートの方に助けてもらいました。
(いつもありがとうございます)

この記事が多くの方の手助けになれば幸いです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0