AWS Step FunctionsでS3操作を行うためのAWS SDK統合
AWS Step FunctionsからAWS SDKを使用してS3バケットの作成、オブジェクトの操作などを行う方法を解説します
はじめに
AWS Step Functionsは、AWSのサーバーレスワークフローサービスで、複数のAWSサービスを組み合わせて複雑なビジネスロジックを実装できます。Step Functionsの強力な機能の一つに「AWS SDK統合」があります。これにより、Lambda関数を作成することなく、Step Functionsから直接AWSサービスのAPIを呼び出すことができます。
この記事では、AWS Step FunctionsからAWS SDK統合を使用してAmazon S3の操作を行う方法について詳しく解説します。バケットの作成、オブジェクトのアップロード・ダウンロード・削除など、基本的なS3操作をStep Functionsから直接実行する方法を学びましょう。
AWS SDK統合とは
AWS SDK統合は、Step Functionsから直接AWSサービスのAPIを呼び出すことができる機能です。これにより、Lambda関数を作成することなく、Step Functionsのワークフロー内でAWSリソースを操作できます。
AWS SDK統合を使用するには、TaskステートのResourceフィールドに以下の形式でARNを指定します:
arn:aws:states:::aws-sdk:サービス名:APIアクション
例えば、S3バケットの一覧を取得するには以下のように指定します:
arn:aws:states:::aws-sdk:s3:listBuckets
IAMロールの設定
Step FunctionsからS3操作を行うには、適切なIAMロールの設定が必要です。以下は、S3バケットの作成、オブジェクトの操作などを行うために必要な権限を持つポリシーの例です:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:CreateBucket",
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:ListAllMyBuckets"
],
"Resource": "*"
}
]
}
実際の運用では、より制限された権限を設定することをお勧めします。例えば、特定のバケットやオブジェクトに対する操作のみを許可するなど、最小権限の原則に従って設定しましょう。
S3バケットの作成
Step FunctionsからS3バケットを作成するには、createBucket APIアクションを使用します。以下は、バケットを作成するTaskステートの例です:
{
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:s3:createBucket",
"Parameters": {
"Bucket": "my-new-bucket-name",
"CreateBucketConfiguration": {
"LocationConstraint": "ap-northeast-1"
}
},
"Next": "NextState"
}
このタスクは、指定した名前のバケットを東京リージョン(ap-northeast-1)に作成します。バケット名はグローバルに一意である必要があるため、実行時に一意の名前を生成するには、Step Functionsの組み込み関数States.UUID()を使用することもできます:
{
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:s3:createBucket",
"Parameters": {
"Bucket.$": "States.Format('my-bucket-{}', States.UUID())",
"CreateBucketConfiguration": {
"LocationConstraint": "ap-northeast-1"
}
},
"ResultPath": "$.bucketInfo",
"Next": "NextState"
}
S3オブジェクトの取得(GetObject)
S3からオブジェクトを取得するには、getObject APIアクションを使用します:
{
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:s3:getObject",
"Parameters": {
"Bucket": "my-bucket-name",
"Key": "folder/myfile.txt"
},
"ResultPath": "$.fileContent",
"Next": "NextState"
}
取得したオブジェクトの内容は、BodyフィールドにBase64エンコードされた文字列として返されます。これをデコードするには、後続のステートでStates.Base64Decode関数を使用します:
{
"Type": "Pass",
"Parameters": {
"decodedContent.$": "States.Base64Decode($.fileContent.Body)"
},
"Next": "NextState"
}
S3オブジェクトのアップロード(PutObject)
バケットにオブジェクトをアップロードするには、putObject APIアクションを使用します:
{
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:s3:putObject",
"Parameters": {
"Bucket": "my-bucket-name",
"Key": "folder/myfile.txt",
"Body": "Hello, this is the content of my file!"
},
"ResultPath": "$.uploadResult",
"Next": "NextState"
}
Base64エンコードされたデータをアップロードする場合は、以下のようにBodyパラメータを指定します:
{
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:s3:putObject",
"Parameters": {
"Bucket": "my-bucket-name",
"Key": "folder/myfile.txt",
"Body.$": "States.Base64Decode($.base64Content)"
},
"ResultPath": "$.uploadResult",
"Next": "NextState"
}
S3オブジェクトの削除(DeleteObject)
オブジェクトを削除するには、deleteObject APIアクションを使用します:
{
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:s3:deleteObject",
"Parameters": {
"Bucket": "my-bucket-name",
"Key": "folder/myfile.txt"
},
"ResultPath": "$.deleteResult",
"Next": "NextState"
}
複数のS3オブジェクトの削除(DeleteObjects)
複数のオブジェクトを一度に削除するには、deleteObjects APIアクションを使用します:
{
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:s3:deleteObjects",
"Parameters": {
"Bucket": "my-bucket-name",
"Delete": {
"Objects": [
{
"Key": "folder/file1.txt"
},
{
"Key": "folder/file2.txt"
}
]
}
},
"ResultPath": "$.deleteResult",
"Next": "NextState"
}
S3バケット内のオブジェクト一覧の取得
バケット内のオブジェクト一覧を取得するには、listObjectsV2 APIアクションを使用します:
{
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:s3:listObjectsV2",
"Parameters": {
"Bucket": "my-bucket-name",
"Prefix": "folder/" // オプション:特定のプレフィックスを持つオブジェクトのみを取得
},
"ResultPath": "$.objectsList",
"Next": "NextState"
}
実践的なワークフロー例:S3バケットの作成とファイルのアップロード
以下は、新しいS3バケットを作成し、ファイルをアップロードする実践的なワークフロー例です:
{
"Comment": "S3バケットを作成してファイルをアップロードするワークフロー",
"StartAt": "CreateBucket",
"States": {
"CreateBucket": {
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:s3:createBucket",
"Parameters": {
"Bucket.$": "States.Format('my-bucket-{}', States.UUID())",
"CreateBucketConfiguration": {
"LocationConstraint": "ap-northeast-1"
}
},
"ResultPath": "$.bucketInfo",
"Next": "UploadFile"
},
"UploadFile": {
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:s3:putObject",
"Parameters": {
"Bucket.$": "$.bucketInfo.Location",
"Key": "hello.txt",
"Body": "Hello, this is a test file created by Step Functions!"
},
"ResultPath": "$.uploadResult",
"Next": "GetFilesList"
},
"GetFilesList": {
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:s3:listObjectsV2",
"Parameters": {
"Bucket.$": "$.bucketInfo.Location"
},
"ResultPath": "$.filesList",
"End": true
}
}
}
このワークフローは以下の処理を行います:
- ユニークな名前のS3バケットを作成
- 作成したバケットに「hello.txt」というファイルをアップロード
- バケット内のオブジェクト一覧を取得
エラーハンドリング
AWS SDK統合を使用する際のエラーハンドリングは重要です。S3操作に関連するエラーは、S3.ErrorNameの形式で返されます。例えば、バケットが既に存在する場合はS3.BucketAlreadyExistsエラーが発生します。
以下は、エラーハンドリングを含むバケット作成の例です:
{
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:s3:createBucket",
"Parameters": {
"Bucket": "my-bucket-name",
"CreateBucketConfiguration": {
"LocationConstraint": "ap-northeast-1"
}
},
"Catch": [
{
"ErrorEquals": ["S3.BucketAlreadyExists"],
"Next": "HandleBucketExists"
},
{
"ErrorEquals": ["States.ALL"],
"Next": "HandleOtherErrors"
}
],
"Next": "UploadFile"
}
まとめ
この記事では、AWS Step FunctionsからAWS SDK統合を使用してAmazon S3の操作を行う方法について解説しました。バケットの作成、オブジェクトのアップロード・ダウンロード・削除など、基本的なS3操作をStep Functionsから直接実行できることがわかりました。
AWS SDK統合を活用することで、Lambda関数を作成することなく、Step Functionsのワークフロー内でAWSリソースを操作できます。これにより、サーバーレスアプリケーションの開発がより簡単になり、コードの保守性も向上します。
実際のプロジェクトでは、セキュリティのためにIAMロールの権限を最小限に設定し、エラーハンドリングを適切に実装することをお勧めします。