- 1 Step Functions SDK Direct Integration完全ガイド — Lambdaレスでフルサーバーレスを実現するハンズオン
- 1.1 目次
- 1.2 Section 1: SDK Direct Integration 概念編
- 1.3 Section 2: アーキテクチャ解説
- 1.4 Section 3: AWSコンソールでのハンズオン
- 1.5 3-1. 前提条件
- 1.6 3-2. リソースの準備
- 1.7 3-3. 段階的構築
- 1.8 まとめ(Section 3)
- 1.9 Section 4: TerraformでのSDK Direct Integration構築
- 1.10 4-1. 前提条件
- 1.11 4-2. ディレクトリ構成
- 1.12 4-3. statemachine/definition.json.tpl
- 1.13 4-4. variables.tf
- 1.14 4-5. main.tf(完全なコード)
- 1.15 4-6. outputs.tf
- 1.16 4-7. デプロイ手順
- 1.17 4-8. 動作確認
- 1.18 4-9. IAM権限の最小化(解説)
- 1.19 まとめ(Section 4)
- 1.20 Section 5: 実践Tips(SDK Direct Integration設計ガイド)
- 1.21 Section 6: ハンズオン後の削除手順
- 1.22 Section 7: まとめとStep Functionsシリーズ総括
Step Functions SDK Direct Integration完全ガイド — Lambdaレスでフルサーバーレスを実現するハンズオン
公開日: 2026-04-13
難易度: 中級〜上級
所要時間: 約90分
シリーズ: [Step Functions シリーズ 第8回(最終回)]
この記事で学ぶこと
– SDK Direct Integration の仕組み(arn:aws:states:::aws-sdk:service:actionARN形式)
– Lambda不要でDynamoDB・SQS・SNS・S3を直接操作するLambda-lessアーキテクチャ
– PascalCase変換ルール(AWS SDK APIとの違い)
– Optimized Integration vs SDK Integration の使い分け
– 最小権限IAM設計とエラーハンドリングのベストプラクティス
– Terraform での完全構築(コンソール版とASL完全一致)シリーズ前回記事:
– 第1回: AWS Step Functions 入門
– 第2回: ECS × Step Functions 入門
– 第3回: Step Functions エラーハンドリング完全ガイド
– 第4回: Step Functions 入出力データフロー制御完全ガイド
– 第5回: Step Functions Callbackパターン完全ガイド
– 第6回: Step Functions Distributed Map完全ガイド
– 第7回: Step Functions Express vs Standard完全ガイド
目次
- SDK Direct Integration 概念編
- アーキテクチャ解説
- AWSコンソールでのハンズオン
- TerraformでのSDK Direct Integration構築
- 実践Tips(SDK Direct Integration設計ガイド)
- ハンズオン後の削除手順
- まとめとStep Functionsシリーズ総括
Section 1: SDK Direct Integration 概念編
1-1. SDK Direct Integration とは
AWS SDK Direct Integration(SDKインテグレーション)は、Lambda関数を介さずに、ステートマシン定義(ASL)から直接AWSサービスのAPIを呼び出せる機能です。
2021年9月にGA(一般公開) され、現在は 220以上のAWSサービス・10,000以上のAPIアクション をサポートしています(2026年3月時点)。
ARN形式(呼び出しパターン):
arn:aws:states:::aws-sdk:serviceName:apiActionserviceName: AWSサービス名(小文字)例:dynamodb,sqs,s3apiAction: APIアクション名(camelCase)例:putItem,sendMessage,publish
最近の主な追加サービス(2025〜2026年):
– Amazon Bedrock AgentCore(エージェント実行、リトライ・並列実行対応)
– Amazon S3 Vectors(ドキュメント取り込みパイプライン自動化)
– AWS End User Messaging、Amazon Q Apps 等 36サービス(2025年1月)
– AWS Backup Search + 137の追加APIアクション(2025年4月)
1-2. Lambda経由 vs SDK Direct Integration の比較
| 項目 | Lambda経由 | SDK Direct Integration |
|---|---|---|
| コード記述 | Python/Node.jsでAPI呼び出しコードが必要 | ASL定義のみ(コード不要) |
| コスト | Lambda実行費用が追加発生 | Lambda費用ゼロ |
| レイテンシ | Lambdaコールドスタート + 実行時間 | 直接呼び出し(低レイテンシ) |
| デバッグ | CloudWatch Logs + Lambda側のログ | SF実行履歴のみ |
| メンテナンス | Lambdaコード + 依存パッケージ管理が必要 | ASL定義のみ管理 |
| 向いているケース | 複雑なビジネスロジック・データ変換 | 単純なCRUD・メッセージング |
1-3. 呼び出しパターン: ARN形式
arn:aws:states:::aws-sdk:serviceName:apiAction主要サービスのARN例:
| サービス | APIアクション | ARN |
|---|---|---|
| DynamoDB | PutItem | arn:aws:states:::aws-sdk:dynamodb:putItem |
| DynamoDB | GetItem | arn:aws:states:::aws-sdk:dynamodb:getItem |
| SQS | SendMessage | arn:aws:states:::aws-sdk:sqs:sendMessage |
| SNS | Publish | arn:aws:states:::aws-sdk:sns:publish |
| S3 | PutObject | arn:aws:states:::aws-sdk:s3:putObject |
| S3 | GetObject | arn:aws:states:::aws-sdk:s3:getObject |
| EventBridge | PutEvents | arn:aws:states:::aws-sdk:eventbridge:putEvents |
| SSM | GetParameter | arn:aws:states:::aws-sdk:ssm:getParameter |
| Bedrock | InvokeModel | arn:aws:states:::aws-sdk:bedrockruntime:invokeModel |
1-4. Parameters の書き方(PascalCase変換ルール)
SDK Direct IntegrationのParametersは PascalCase(アッパーキャメルケース) で記述します。
重要: AWS CLI/SDK では
tableName(camelCase)ですが、SF Parameters ではTableName(PascalCase)になります。
DynamoDB PutItem の例:
{ "Type": "Task", "Resource": "arn:aws:states:::aws-sdk:dynamodb:putItem", "Parameters": { "TableName": "Users", "Item": {"user_id": {"S.$": "$.user_id"},"email": {"S.$": "$.email"},"created_at": {"S.$": "$$.Execution.StartTime"} }, "ConditionExpression": "attribute_not_exists(user_id)" }}SQS SendMessage の例:
{ "Type": "Task", "Resource": "arn:aws:states:::aws-sdk:sqs:sendMessage", "Parameters": { "QueueUrl.$": "$.queue_url", "MessageBody.$": "States.Format('Welcome {}! Your registration is complete.', $.email)" }}主なPascalCase変換ルール:
| SDK(camelCase) | SF Parameters(PascalCase) |
|---|---|
tableName | TableName |
item | Item |
queueUrl | QueueUrl |
messageBody | MessageBody |
topicArn | TopicArn |
bucket | Bucket |
key | Key |
conditionExpression | ConditionExpression |
1-5. Optimized Integration vs SDK Integration の違い
| 項目 | Optimized Integration | SDK Integration |
|---|---|---|
| ARN形式 | arn:aws:states:::dynamodb:putItem | arn:aws:states:::aws-sdk:dynamodb:putItem |
| 対応サービス | 限定的(SFが特別最適化したサービスのみ) | 220+サービス全般 |
.sync / .waitForTaskToken | サポートあり(一部) | 基本的にリクエスト/レスポンスのみ |
| 主な対応サービス | Lambda, SQS, SNS, DynamoDB, ECS, S3 等 | 上記 + 全AWSサービス |
| 使いどころ | 非同期完了待ち(ECS Runタスク等) | CRUD・メッセージング全般 |
推奨: 対応サービスは Optimized Integrationを優先(ネイティブ統合のため)。未対応サービスやSDK全機能へのアクセスは SDK Integrationを使用。
1-6. ユースケース一覧
SDK Direct Integrationが特に有効なケース:
| ユースケース | サービス | APIアクション |
|---|---|---|
| ユーザー情報の登録・取得 | DynamoDB | putItem / getItem / updateItem |
| メールキューへの送信 | SQS | sendMessage |
| 管理者通知 | SNS | publish |
| ログ・ドキュメント保存 | S3 | putObject |
| イベント送信 | EventBridge | putEvents |
| 設定値取得 | Systems Manager | getParameter |
| シークレット取得 | Secrets Manager | getSecretValue |
| AI推論リクエスト | Bedrock Runtime | invokeModel |
向いていないケース:
– 複雑なビジネスロジック・データ変換(Lambdaの方が適切)
– 外部HTTP API呼び出し(EventBridge API Destinations / Lambda経由)
– 100KB以上のペイロード処理(S3経由で回避可能)
1-7. 本シリーズとの関連
| 回 | テーマ | SDK統合との関連 |
|---|---|---|
| 第1弾 | Step Functions 入門 | 基本概念・コンソール操作 |
| 第3弾 | エラーハンドリング | Lambda Task + Retry/Catch → SDK統合でも同様に使用可 |
| 第5弾 | ECS・Fargate連携 | Optimized Integration使用 |
| 第6弾 | Distributed Map | SDK統合 + 並列処理パターン |
| 第7弾 | Express vs Standard | Express + SDK統合でLambda-lessの高スループット処理 |
| 第8弾(本記事) | SDK Direct Integration | Lambda不要でAWSネイティブな統合を実現 |
概念を理解したところで、次のセクションではこのSDK統合を使った実際のアーキテクチャと、本ハンズオンで構築するシナリオの全体像を解説します。
Section 2: アーキテクチャ解説
2-1. ハンズオンシナリオ概要
本ハンズオンでは「Lambda不要のユーザー登録ワークフロー」を構築します。ユーザーが登録フォームを送信すると、Step Functionsが以下の処理を Lambdaを一切使わず に自動実行します。
入力: { "user_id": "user001", "email": "user@example.com", "name": "田中太郎" } │ ├─① RegisterUser → DynamoDB(ユーザー情報を永続化) ├─② SendWelcomeEmail → SQS(ウェルカムメールをキューに送信) ├─③ NotifyAdmin → SNS(管理者トピックに通知) └─④ SaveRegistrationLog → S3(登録ログをJSONで保存)使用リソース一覧:
| リソース | 役割 | SDK統合パターン |
|---|---|---|
| DynamoDB | ユーザー情報の永続化 | aws-sdk:dynamodb:putItem |
| SQS | ウェルカムメールのキュー | aws-sdk:sqs:sendMessage |
| SNS | 管理者への通知 | aws-sdk:sns:publish |
| S3 | 登録ログの保存 | aws-sdk:s3:putObject |
| IAM | SF実行ロール | 各サービスへのAPIアクセス権限 |
2-2. アーキテクチャ全体図

上図はLambda-lessアーキテクチャの全体像を示しています。Step Functions State Machineが各AWSサービスへ直接SDK統合で接続しており、Lambda関数が介在しません。
従来のLambda経由との違い(左列 vs 右列):
– 左列(Lambda経由): SF Task → Lambda呼び出し → Lambda内でboto3 API → AWSサービス
– 右列(SDK Direct): SF Task → aws-sdk:xxx:apiAction → AWSサービス(直接)
Lambda経由では 関数の管理・コード記述・追加コスト が発生しますが、SDK統合ではすべて不要です。
2-3. Lambda-lessの効果

コスト比較(100万回実行した場合):
| 項目 | Lambda経由 | SDK Direct |
|---|---|---|
| Lambda実行費用 | ~$2.40(128MB, 200ms/回) | $0.00 |
| SF遷移費用 | 同一 | 同一 |
| 合計節約 | – | ~$2.40 / 100万回 |
注意: Lambda費用はワークロードにより異なります。Lambdaが必要なケース(複雑なロジック)では従来通りLambdaを使用してください。
複雑さの比較:
| 観点 | Lambda経由 | SDK Direct |
|---|---|---|
| 管理ファイル数 | Lambda関数 × N + ASL | ASL のみ |
| デプロイ対象 | Lambda + SF | SF のみ |
| テスト対象 | Lambda単体テスト + SF結合テスト | SF統合テストのみ |
| ランタイム更新 | Lambda Pythonバージョン管理が必要 | 不要 |
2-4. データフロー(Parameters設計)

上図はDynamoDB PutItemを例にした入力→Parameters→API→ResultSelectorの流れです。
PascalCase変換ルールの要点:
入力JSON (camelCase) →SF Parameters (PascalCase)──────────────────────────────────────────────────────$.user_id→"user_id": {"S.$": "$.user_id"}$.email →"email": {"S.$": "$.email"}※ Parameters のキー自体は PascalCase: tableName → TableName item → Item queueUrl→ QueueUrlResultSelector(レスポンスの絞り込み):
"ResultSelector": { "status_code.$": "$.SdkHttpMetadata.HttpStatusCode", "request_id.$": "$.SdkResponseMetadata.RequestId"}DynamoDB PutItemの成功レスポンスは大量のメタデータを含むため、ResultSelectorで必要な情報のみ抽出することを推奨します。
2-5. ASL全体構造(プレビュー)
本ハンズオンで構築するステートマシンのASL概要:
{ "Comment": "Lambda-less User Registration Workflow", "StartAt": "RegisterUser", "States": { "RegisterUser": {"Type": "Task","Resource": "arn:aws:states:::aws-sdk:dynamodb:putItem","Parameters": { "TableName": "Users", "Item": { "user_id": {"S.$": "$.user_id"}, "email": {"S.$": "$.email"}, "name": {"S.$": "$.name"} }},"Next": "SendWelcomeEmail" }, "SendWelcomeEmail": {"Type": "Task","Resource": "arn:aws:states:::aws-sdk:sqs:sendMessage","Parameters": { "QueueUrl": "https://sqs.ap-northeast-1.amazonaws.com/123456789/welcome-email-queue", "MessageBody.$": "States.Format('Welcome {}! Email: {}', $.name, $.email)"},"Next": "NotifyAdmin" }, "NotifyAdmin": {"Type": "Task","Resource": "arn:aws:states:::aws-sdk:sns:publish","Parameters": { "TopicArn": "arn:aws:sns:ap-northeast-1:123456789:admin-notification", "Message.$": "States.Format('New user registered: {} ({})', $.name, $.email)", "Subject": "New User Registration"},"Next": "SaveRegistrationLog" }, "SaveRegistrationLog": {"Type": "Task","Resource": "arn:aws:states:::aws-sdk:s3:putObject","Parameters": { "Bucket": "registration-logs-bucket", "Key.$": "States.Format('logs/{}/{}.json', $$.Execution.StartTime, $.user_id)", "Body.$": "States.JsonToString($)"},"End": true } }}ASL全文・Terraform定義・コンソール操作手順は Section 3〜5 で詳細解説します。
アーキテクチャと全体像が把握できました。次のセクションでは、AWSコンソールを使って実際にこのワークフローを段階的に構築していきます。
Section 3: AWSコンソールでのハンズオン
このセクションでは、AWSコンソールを使って Lambda不要のユーザー登録ワークフロー を段階的に構築します。DynamoDB PutItem → SQS SendMessage → SNS Publish → S3 PutObject の4サービスをLambda関数を一切使わず、AWS SDK統合(arn:aws:states:::aws-sdk:*)だけで直接呼び出します。
Step A(DynamoDB単体)→ Step B(SQS追加)→ Step C(SNS追加)→ Step D(S3+エラーハンドリング完成形)→ Step E(Lambda版との比較)の順に段階的に構築し、SDK統合の仕組みを体感します。
3-1. 前提条件
- AWSアカウントおよび以下のサービスを操作できるIAM権限
- AWS Step Functions(ステートマシンの作成・実行)
- Amazon DynamoDB(テーブルの作成・アイテムの確認)
- Amazon SQS(FIFOキューの作成・メッセージ確認)
- Amazon SNS(トピックの作成・サブスクリプション管理)
- Amazon S3(バケットの作成・オブジェクト確認)
- AWS IAM(ロール・ポリシーの作成)
- Amazon CloudWatch Logs(ログの参照)
- リージョン: ap-northeast-1(東京) で統一
- Lambdaは一切不要(このハンズオンの最大の特徴)
3-2. リソースの準備
3-2-1. DynamoDBテーブル作成
手順:
- AWSコンソール → DynamoDB → 「テーブルの作成」
- 以下を入力:
- テーブル名:
user-registrations - パーティションキー:
user_id(タイプ: 文字列) - ソートキー: なし(空欄のまま)
- 「テーブル設定」→「設定のカスタマイズ」を選択:
- キャパシティーモード: オンデマンド(ハンズオンでは従量課金が便利)
- 「テーブルの作成」をクリック
- テーブルのステータスが「アクティブ」になるまで待機(通常30秒以内)
💡 ポイント:
created_atカラムはASL内で$$.Execution.StartTime(Step Functionsの実行開始時刻)を自動セットします。DynamoDBテーブルにこのカラムを事前定義する必要はありません。
3-2-2. SQS FIFOキュー作成
手順:
- AWSコンソール → Amazon SQS → 「キューの作成」
- 以下を入力:
- タイプ: FIFO(先入れ先出し)
- キュー名:
welcome-email-queue.fifo(.fifoサフィックス必須) - 「設定」セクション:
- コンテンツベースの重複排除: 有効化(チェックを入れる)
- 他はデフォルトのまま「キューの作成」をクリック
- 作成後、キューのURLをメモしておく(ASLで使用)
- 例:
https://sqs.ap-northeast-1.amazonaws.com/123456789012/welcome-email-queue.fifo
💡 FIFOキューの必須パラメータ: FIFO キューへのメッセージ送信では
MessageGroupIdとMessageDeduplicationIdが必須です。本ハンズオンではASL内でこれらを指定します。コンテンツベースの重複排除を有効にしているため、MessageDeduplicationIdが重複チェックのキーとして機能します。
3-2-3. SNSトピック作成
手順:
- AWSコンソール → Amazon SNS → 「トピックの作成」
- 以下を入力:
- タイプ: スタンダード
- 名前:
user-registration-admin - 「トピックの作成」をクリック
- 作成後、トピックARNをメモ(ASLで使用)
- 例:
arn:aws:sns:ap-northeast-1:123456789012:user-registration-admin
テスト用メールサブスクリプションの追加:
- 作成したトピック
user-registration-adminを開く - 「サブスクリプション」タブ → 「サブスクリプションの作成」
- 以下を入力:
- プロトコル: Eメール
- エンドポイント: (受信確認できる自分のメールアドレス)
- 「サブスクリプションの作成」をクリック
- 受信したメールの「Confirm subscription」リンクをクリックして確認
💡 メール確認を忘れずに: サブスクリプションが「保留中の確認」のままだとSNS通知が届きません。Step Cを実行する前に「確認済み」になっていることを確認してください。
3-2-4. S3バケット作成
手順:
- AWSコンソール → Amazon S3 → 「バケットを作成」
- 以下を入力:
- バケット名:
user-registration-logs-{ランダム文字列}(例:user-registration-logs-a1b2c3) - AWS リージョン: アジアパシフィック(東京) ap-northeast-1
- 「オブジェクト所有者」: ACL 無効(推奨、デフォルト)
- 「このバケットのパブリックアクセスをブロックする設定」: すべてのパブリックアクセスをブロック(デフォルト、そのまま)
- 他はデフォルトのまま「バケットを作成」をクリック
- バケット名をメモ(ASLで使用)
⚠️ S3バケット名はグローバルで一意: 同名のバケットが世界に1つも存在しないよう、ランダム文字列を末尾に付けてください。
3-2-5. IAMロール作成
Step Functionsが各AWSサービスを直接呼び出すための実行ロールを作成します。
ロールの作成:
- AWSコンソール → IAM → 「ロール」→「ロールを作成」
- 信頼されたエンティティタイプ: 「AWSのサービス」
- サービス: Step Functions を選択 → 「次へ」
- 許可ポリシー: この画面では何も選択せず「次へ」(後でインラインポリシーを追加)
- ロール名:
sf-sdk-integration-role - 「ロールを作成」をクリック
インラインポリシーの追加:
- 作成した
sf-sdk-integration-roleを開く - 「許可」タブ → 「許可を追加」→「インラインポリシーを作成」
- 「JSON」タブに切り替え、以下をすべて貼り付け(
<ACCOUNT_ID>・<BUCKET_NAME>を実際の値に置換):
{ "Version": "2012-10-17", "Statement": [ {"Sid": "DynamoDBPutItem","Effect": "Allow","Action": "dynamodb:PutItem","Resource": "arn:aws:dynamodb:ap-northeast-1:<ACCOUNT_ID>:table/user-registrations" }, {"Sid": "SQSSendMessage","Effect": "Allow","Action": "sqs:SendMessage","Resource": "arn:aws:sqs:ap-northeast-1:<ACCOUNT_ID>:welcome-email-queue.fifo" }, {"Sid": "SNSPublish","Effect": "Allow","Action": "sns:Publish","Resource": "arn:aws:sns:ap-northeast-1:<ACCOUNT_ID>:user-registration-admin" }, {"Sid": "S3PutObject","Effect": "Allow","Action": "s3:PutObject","Resource": "arn:aws:s3:::<BUCKET_NAME>/logslogs/*" } ]}Lambda経由と比較した権限管理の簡素化:
| 方式 | 必要なIAMロール数 | 管理コスト |
|---|---|---|
| Lambda経由 | Lambda実行ロール + SF実行ロール(2つ) | 高(ロール間の権限設計が複雑) |
| SDK Direct Integration | SF実行ロールのみ(1つ) | 低(最小権限を一元管理) |
ポイント: リソースARNは可能な限り絞り込みましょう。
"Resource": "*"は便利ですが、意図しないリソースへのアクセスを許可してしまいます。DynamoDBテーブル名やS3バケット名を明示的に指定することを強く推奨します。
5-3. SDK統合が向かないケース
SDK Direct Integrationは非常に強力ですが、すべてのユースケースに最適ではありません。以下のケースはLambdaを使った方が適切です。
| ケース | 理由 | 代替手段 |
|---|---|---|
| 複雑なデータ変換(JSON整形、計算) | ASLはデータ変換が苦手 | Lambda(Python/Node.js) |
| 外部HTTP API呼び出し | aws-sdkはAWSサービスのみ対応 | Lambda + requests / EventBridge API Destinations |
| 256KB以上のペイロード | SF実行の最大入力/出力は256KB | S3経由でペイロードを渡す |
| ストリーミング応答が必要 | SF Taskは同期/非同期のみ | Lambda + WebSocket / API GW |
| 独自の認証/署名ロジック | SF統合はIAM認証のみ | Lambda |
| ConverseStream / InvokeModelWithResponseStream(Bedrock) | ストリーミングAPIは未サポート | Lambda |
2026年3月時点の最新情報: AWS Step FunctionsはSDK統合で220以上のサービス・10,000以上のAPIアクションをサポートするまで拡張されました(Amazon Bedrock AgentCoreも追加)。ただし、ストリーミング系APIはSDK統合の対象外であり、Lambdaを介した実装が必要です。
5-4. エラーハンドリングのベストプラクティス
SDK Direct Integrationでは、各AWSサービス固有のエラーコードをCatchで捕捉できます。
DynamoDB固有のエラー対応:
"Catch": [ { "ErrorEquals": ["DynamoDB.ConditionalCheckFailedException"], "Next": "HandleDuplicateUser", "ResultPath": "$.error" }, { "ErrorEquals": ["DynamoDB.ProvisionedThroughputExceededException","DynamoDB.RequestLimitExceeded" ], "Next": "HandleThrottling", "ResultPath": "$.error" }, { "ErrorEquals": ["States.ALL"], "Next": "HandleGenericError", "ResultPath": "$.error" }]エラーの優先順位ルール: 具体的なエラー(ConditionalCheckFailedException)を先に定義し、汎用エラー(States.ALL)は必ず最後に配置すること。Step Functionsはリストの上から順に評価するため、States.ALL を先に書くと具体的なハンドラーに到達しなくなります。
サービスエラーの命名規則:
| サービス | エラー形式 | 例 |
|---|---|---|
| DynamoDB | DynamoDB.XxxException | DynamoDB.ConditionalCheckFailedException |
| SQS | SQS.XxxException | SQS.QueueDoesNotExist |
| SNS | SNS.XxxException | SNS.InvalidParameterException |
| S3 | S3.XxxException | S3.NoSuchBucket |
5-5. Optimized vs SDK Integration の選択指針
呼び出したいAWSサービスは何か?↓Optimized Integration対応サービス(Lambda/SQS/SNS/DynamoDB/ECS/Glue/SageMaker等)? YES → Optimized Integration優先(ネイティブ最適化・.sync対応あり) NO → SDK Integration(220+サービス全般)↓.waitForTaskTokenや.syncが必要か? YES → Optimized Integration(SDK統合では非サポート) NO → SDK統合で問題なし↓ストリーミングAPIが必要か(ConverseStream等)? YES → Lambda経由(SDK統合では非サポート) NO → SDK統合で完結まとめ: 「AWSサービスを直接呼びたい・Lambdaを減らしたい」→ SDK Direct Integration。「コールバックや同期待機が必要」→ Optimized Integration。「複雑なロジックやストリーミングが必要」→ Lambda Task、という判断軸を持っておくと設計が迷いません。
Section 6: ハンズオン後の削除手順
⚠️ 放置するとDynamoDB・S3ストレージ・CloudWatch Logs料金が発生します。ハンズオン終了後は必ずリソースを削除してください。
6-1. コスト注意事項
| リソース | 月額目安 | 備考 |
|---|---|---|
| Step Functions | 無料枠内(本ハンズオン程度) | 4,000状態遷移/月まで無料(Standard) |
| DynamoDB | ~$0.25/GB(オンデマンド) | テストデータなら数円以下 |
| SQS(FIFO) | ~$0.00000050/リクエスト | 本ハンズオン程度なら無視可能 |
| SNS | 無料枠内 | 通知100万件/月まで無料 |
| S3 | ~$0.025/GB/月 | ログファイルは数KB |
| CloudWatch Logs | ~$0.76/GB | ALLレベルだと蓄積に注意 |
6-2. Terraformで構築した場合
terraform destroy -var="random_suffix=abc123" -var="admin_email=your@email.com"terraform destroy 実行後、確認プロンプトが表示されます。yes と入力して削除を開始してください。
手動削除が必要なもの(Terraformで管理されない場合がある):
# CloudWatch Logsロググループaws logs delete-log-group --log-group-name /aws/states/sf-sdk6-3. コンソールで構築した場合の削除チェックリスト
以下の順番で削除すると依存関係エラーが起きにくいです。
- [ ] Step Functions — ステートマシン(user-reg-step-a / user-reg-step-b / user-reg-step-c / user-reg-final)を削除
- [ ] DynamoDB — テーブル(user-registrations)を削除
- [ ] SQS — FIFOキュー(welcome-email-queue.fifo)を削除
- [ ] SNS — トピック(user-registration-admin)とすべてのサブスクリプションを削除
- [ ] S3 — バケット(user-registration-logs-XXXXX): オブジェクトをすべて削除 → バケットを削除
- [ ] IAM — ロール(sf-sdk-integration-role)と付随するインラインポリシーを削除
- [ ] CloudWatch Logs — ロググループ(
/aws/states/sf-sdk等)を削除
Tips: AWSマネジメントコンソールの「請求とコスト管理」→「コストエクスプローラー」で削除後のコストが0になっていることを数日後に確認することをおすすめします。
Section 7: まとめとStep Functionsシリーズ総括
7-1. この記事で学んだこと
本記事(第8回 SDK Direct Integration完全ガイド)では、以下を習得しました:
- SDK Direct Integrationの仕組み —
arn:aws:states:::aws-sdk:service:actionというARN形式でAWS SDKを直接呼び出す構造 - Lambda-lessアーキテクチャの実現 — DynamoDB・SQS・SNS・S3を中間Lambdaなしで直接操作する4ステップユーザー登録ワークフロー
- PascalCase変換ルール — AWS SDK APIのcamelCaseとASL上のPascalCaseの対応表とデバッグ方法
- Optimized Integration vs SDK Integration の使い分け —
.syncや.waitForTaskTokenの有無で選択する判断軸 - 最小権限IAM設計 — Lambda経由(2ロール)からSDK直接統合(1ロール)への簡素化
- SDK統合が向かないケース — ストリーミングAPI・複雑なデータ変換・外部HTTP APIはLambdaを活用
7-2. Step Functionsシリーズ全8弾の総まとめ
本シリーズを通じて、AWS Step Functionsの全機能を体系的に習得しました:
| 回 | テーマ | 習得スキル |
|---|---|---|
| 第1回 | Step Functions入門 | ステートマシン基礎・Hello World・ASL入門・コンソール+Terraform |
| 第2回 | ECS×SF入門 | Fargateタスク連携・バッチ処理・Optimized Integration実践 |
| 第3回 | エラーハンドリング | Retry/Catch/Timeout・回復力設計・サービスエラー捕捉 |
| 第4回 | 入出力データフロー制御 | InputPath/Parameters/ResultSelector/ResultPath/OutputPath |
| 第5回 | Callbackパターン | .waitForTaskToken・人間承認フロー・非同期処理設計 |
| 第6回 | Distributed Map | 大規模並列処理・ItemReader/ResultWriter・S3バッチ処理 |
| 第7回 | Express vs Standard | ワークフロータイプ選択・コスト最適化・StartSyncExecution |
| 第8回(本記事) | SDK Direct Integration | Lambda-less・220+サービス直接統合・PascalCase設計 |
7-3. Step Functions実践アーキテクチャ選択指針(総まとめ)
8回にわたるシリーズで学んだ知識を集約した「Step Functionsをどう使うか」の選択フローです:
ワークフローの種類は?├── 長時間処理(5分超)・監査ログが必要・人間承認あり│→ Standard Workflow(第7回)│└── 人間の承認ステップが必要│ → Callbackパターン(.waitForTaskToken)(第5回)│├── 大量データの並列処理(S3/DynamoDBの大規模バッチ)│→ Distributed Map(第6回)│└── 処理結果をS3にまとめて書き出したい│ → ResultWriter活用│├── 高スループット・短時間処理(APIのオーケストレーション)│→ Express Workflow(第7回)│└── API呼び出し元に同期で結果を返したい│ → StartSyncExecution│└── AWSサービスを直接呼びたい(Lambdaを減らしたい) ├── .sync / .waitForTaskTokenが必要(Lambda/ECS/SageMaker等) │→ Optimized Integration(第2回・第5回) ├── 220+サービスのAWS API(Lambda不要) │→ SDK Direct Integration(本記事)← 本シリーズの集大成 └── 複雑なデータ変換・外部HTTP API・ストリーミング → Lambda Task(第3回・第4回)Step Functionsは「ステートマシンで制御フローを書き、各ステートでAWSサービスを呼び出す」というシンプルな原則のもと、ここまで紹介した多様なパターンを組み合わせることで、エンタープライズレベルのワークフロー自動化が実現できます。
本シリーズ全8回を完走された方は、Lambda中心のアーキテクチャからStep Functionsを軸としたサーバーレスオーケストレーションへの移行を検討する十分な知識を身につけたと言えます。ぜひ実際のプロジェクトでStep Functionsを活用してみてください。
7-4. 今後のTechBlog予告
本シリーズに続く次のテーマとして、以下のコンテンツを公開予定です:
- AWS EventBridge完全ガイド — イベント駆動アーキテクチャの中核サービスをStep Functionsと組み合わせて解説(予定)
- AWS CDK入門 — インフラをTypeScriptで記述するCDKのハンズオン(予定)
- Step Functions × Bedrock — 生成AI/MLワークフロー統合の実践例(予定)
公開をお楽しみに。
7-5. シリーズリンク
本記事は「AWS ハンズオン TechBlog」Step Functions シリーズの最終回(第8回)です。
シリーズ一覧:
– 第1回: AWS Step Functions 入門 — コンソールとTerraformで学ぶハンズオン
– 第2回: ECS × Step Functions 入門 — CSVバッチをFargateタスクでジョブ化するハンズオン
– 第3回: Step Functions エラーハンドリング完全ガイド — 注文処理パイプラインで学ぶRetry/Catch/Timeout
– 第4回: Step Functions 入出力データフロー制御完全ガイド — 5つのフィルタでペイロードを最適化するハンズオン
– 第5回: Step Functions Callbackパターン完全ガイド — .waitForTaskTokenで実現する経費承認ワークフロー
– 第6回: Step Functions Distributed Map完全ガイド — S3大規模並列処理をハンズオンで習得
– 第7回: Step Functions Express vs Standard完全ガイド — 同一処理で比較するワークフロータイプ選択術
– 第8回: 本記事(SDK Direct Integration完全ガイド)← 最終回