初めまして!
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のサポートの方に助けてもらいました。
(いつもありがとうございます)
この記事が多くの方の手助けになれば幸いです。