イベント駆動できるようになった Storage Transfer Service で、S3 から GCS にファイル転送してみた。

2022.12.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、みかみです。

1年経つのが速いのなんの。。 ここ数年、大掃除は3日に分けてやる主義です。 大掃除が終わった後には、せっかくきれいにしたところ汚したくないので、料理したくなくなります(何のために掃除したんだかw

やりたいこと

  • AWS S3 から Google Cloud Storage(GCS) にファイル転送したい
  • Google Cloud の Storage Transfer Service(STS)で、ノーコードでファイル転送したい
  • S3 にファイルが配置されたら、イベント駆動でファイル転送したい

前提

Cloud Storage や Storage Transfer Service など、今回使用する Google Cloud サービスの API は有効化済みです。

また、操作に必要な権限は付与済みです。 動作確認では、Goolge Cloud 側はプロジェクトオーナーロールを付与したアカウント、AWS 側は AdministratorAccess 権限のある IAM ユーザーを使用しています。

なお、Storage Transfer Service のイベントドリブン転送は、2022/12/31 時点ではまだプレビューの機能です。 ご利用の際にはご留意ください。

AWS 環境準備

S3 バケットを作成

AWS 管理コンソールから、転送元の S3 バケットを作成しました。 バケット作成画面で任意のバケット名を入力し、他はデフォルト設定のままです。

作成した S3 バケットの「プロパティ」画面から ARN を確認してメモしておきます。

AWS SQS キューを作成

続いて SQS キューを作成します。

キュー作成画面で任意の名前を入力し、キューを作成しました。 作成した SQS の ARN をメモっておきます。

キューの「アクセスポリシー」を、以下で「編集」しました。

{
  "Version": "2008-10-17",
  "Id": "__default_policy_ID",
  "Statement": [
    {
      "Sid": "__owner_statement",
      "Effect": "Allow",
      "Principal": {
        "Service": "s3.amazonaws.com"
      },
      "Action": "SQS:SendMessage",
      "Resource": "arn:aws:sqs:ap-northeast-1:xxxxxxxxxxxx:cm-mikami-sts",
      "Condition": {
        "ArnLike": {
          "aws:SourceArn": "arn:aws:s3:::cm-mikami-sts"
        }
      }
    }
  ]
}

※一部伏せ字に変更しています。

S3 イベント通知を作成

ファイルが配置された時に SQS に通知するために、S3 バケットにイベント通知を設定します。 対象バケットの「プロパティ」画面「イベント通知」欄の「イベント通知を作成」ボタンをクリックし、任意のイベント名を入力しました。 「プレフィックスオプション」で、転送対象とするディレクトリも指定しておきます。

「イベントタイプ」で「すべてのオブジェクト作成イベント」を選択し

「送信先」で「SQS」をチェックして、プルダウンから先ほど作成した SQS キューを指定して保存しました。

IAM ロールを準備

Storage Transfer Service ジョブの認証には AWS IAM ユーザーのクレデンシャルを使用することもできますが、今回は AWS IAM ロール(AssumeRoleWithWebIdentity)を使用します。

イベント駆動のファイル転送のためには SQS メッセージを操作する権限も必要なため、前回作成した AssumeRole 用の IAM ロールに、AmazonSQSFullAccess ポリシーを追加付与しました。

これで、AWS 側の準備は完了です。

Google Cloud 環境準備

転送先の GCS バケットはすでに作成済みです。

STS ジョブを作成

Google Cloud 管理コンソールから、Storage Transfer Service のファイル転送ジョブを作成します。

ジョブ作成画面で、転送元に S3、転送先に GCS を選択します。

「ソースの選択」で、転送元の S3 バケットパスを入力し、「認証情報」欄で「ID 連携のための AWS IAM ロール」をチェックして、AssumeRole 用の AWS IAM ロールの ARN を入力します。

転送先 GCS バケットパスを入力したら、

いよいよイベント駆動のファイル転送設定です。 「転送実行モード」で「イベントドリブン」を選択し、AWS SQS キューの ARN を入力します。

次の詳細設定画面はデフォルトのままで、ジョブを作成しました。

ファイル転送ジョブを実行

ファイル転送ジョブが作成できたので、S3 にファイルを配置して、本当にイベント駆動でファイルが転送されるか確認してみます。

STS ジョブ詳細画面を確認してみると、フィル転送が完了したようです。

転送先 GCS バケットを確認してみると、期待通り、ファイルが転送されたことが確認できました。

S3 にさらにファイルを追加して、本当にファイル Put トリガーで転送が実行されるか確認してみます。

ファイルアップロード後すぐに、再度 STS ジョブ詳細画面を確認してみます。

「転送済みデータ」表示をみると、転送ファイル数が増えています。

GCS バケットでも、転送ファイルが追加されたことが確認できました。

念のため、転送対象のパス以外にファイルをアップロードして、転送されないことも確認してみます。

5分ほど待ってから STS ジョブ詳細と GCS バケットを確認してみましたが、転送ファイルは増えていないことが確認できました。

まとめ(所感)

スケジュール実行(バッチモード)で STS ジョブを実行する場合、ファイル転送は最短でも1時間おきにしか実行できません。 もっと高頻度、または S3 にファイルが Put されたらすぐにファイル転送を行いたい場合、これまでは STS の利用は諦めなければなりませんでした。

STS ジョブのイベントドリブン転送サポートにより、ニアリアルタイムのファイル転送が可能になり、利用の幅もかなり広がるのではないかと思います。 GA になるのを楽しみにしております。

参考