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
    }
  }
}

このワークフローは以下の処理を行います:

  1. ユニークな名前のS3バケットを作成
  2. 作成したバケットに「hello.txt」というファイルをアップロード
  3. バケット内のオブジェクト一覧を取得

エラーハンドリング

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ロールの権限を最小限に設定し、エラーハンドリングを適切に実装することをお勧めします。

参考資料