アクセスキーを管理したくないからIAMロールを使って認証する
AWS S3とGoogle Cloud Storageの間のファイル転送
マルチクラウド、クラウド二刀流なんて言葉も世にだいぶ普及してきましたね。
それぞれのクラウドベンダにそれぞれの強みがありますし、より頑強なシステム構成を目指す場合にはやはりマルチクラウドな環境が必要ですからね。ベンダーロックインも避けられますしね。
ちなみに弊社では2019年頃から様々な文脈でマルチクラウド化に取り組んでいます。
当時は「マルチクラウド」なんて言っても、ぽかーん、みたいな感じだったのです(本当に)。
もちろん取り組んでいた人も沢山いたのですが、ここまで一般的な考え方になってくると、感慨深いものがありますね。
さてさて、やはりそうなってくるとよく出てくる話題がストレージサービス間のデータ転送や同期です。
今回は、AWS S3からGoogle Cloud Storage(以下GCS)に同期を行う方法についてまとめてみます。
また、その際の認証に「IAMロール」での認証を設定してみたので、その方法についてもまとめます。このようにすることでシークレットの管理が不要になります!
ちなみにAWS側のサービスを使う場合については、AWSの「AWS DataSync を使用して Google Cloud Storage から Amazon S3 にデータを移行する方法」の記事が逆方向のパターンとしてよくまとまっています。
また、Google Cloudを使って逆方向の処理を行うことも Pub/Subを用いることで出来ます。
S3からGCSへのイベントドリブンな転送方法
使用するサービス
Google Cloud側でS3からGCSへ転送を行う場合に使用するサービスはやはりStorage Transfer Serviceでしょう。
こういった些末な処理でありつつも確実に稼働していて欲しいものは、マネージドサービスバンザイ、という感じがしますよね。
Storage Transfer Serviceを使用する上での手順
というわけでその使用のための手順をまとめるとこうなります。
基本は「AWS S3からのイベントドリブン転送を設定する」のマニュアルに沿うことになりますが、Google Cloud側でも事前準備が必要です。
-
[Google Cloud] Storage Transfer Service APIを有効化
-
[Google Cloud] Storage Transfer Service用のサービスアカウントのメールアドレスおよびSubject IDを取得
-
[AWS] リアルタイム同期のためのSQSのQueueを作成
-
[AWS] S3のイベント通知対象に作ったQueueを指定
-
[AWS] S3およびSQSの権限設定を行ったIAMポリシーを作成
-
[AWS] 上記ポリシーの適用されるロールを作成
- 信頼されたエンティティとしてウェブアイデンティティを選択し、Storage Transfer Serviceのサービスアカウントで認証が通るようにする
-
[Google Cloud] 上記AWS IAMロールを認証に設定しつつイベントドリブンモードで転送ジョブを稼働させる
以上です。めっちゃ簡単ですね!!
S3からGCSへの転送設定時のポイントまとめ
転送の設定方法を全部書いていると長くなるので、いくつかポイントになる点をまとめようと思います。
「サービスアカウントのメールアドレスおよびSubject IDを取得」の方法
これは公式マニュアル「サービス エージェントのメールアドレスを確認する」のとおり、
「Method: googleServiceAccounts.get」のAPIマニュアルページ の「Try this method」から取得するのが一番早いです。あるいはCloud Shellを叩くか…でしょうか。
ここで取得したSubject IDをAWSのIAM ロールを作成するときに使うのでメモしておかないといけません。
「SQS」のQueueの作り方
これは「AWS S3 からのイベント ドリブン転送を設定する」のマニュアルページを参照すると、ちゃんとJSONまで用意してくれていますのでぜひそのまま使いましょう。
S3およびSQSの権限設定を行ったIAMポリシーについて
これは同じマニュアルページの「権限を構成する」の箇所を参照します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sqs:DeleteMessage", "sqs:ChangeMessageVisibility", "sqs:ReceiveMessage", "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::AWS_BUCKET_NAME", "arn:aws:s3:::AWS_BUCKET_NAME/*", "AWS_QUEUE_ARN" ] } ] }
と記載がありますので、この通りにSQSとS3の権限を置いておけば問題無いでしょう。
AWS IAMロール作成時の選択方法
ロール作成時は、「信頼されたエンティティタイプ」として「ウェブアイデンティティ」を選択します。
その際に、アイデンティティプロバイダーとして「Google」を選択肢、Audienceに先ほど取得した「Subject ID」を入力しておきます。
こうすることで、下記のような信頼ポリシーが得られます。
これだけで認証が通るのは、シークレットを管理する手間がなくて本当に助かりますね。
Google Cloud側の設定方法
AWS側の設定も全て終わったら、Storage Transfer Serviceを設定します。
スケジュール モードに「イベント ドリブン」を選択します。
その後の設定画面では、
-
認証情報として「ID連携のためのAWS IAMロール」を選択してIAMロールのARNを入力
-
イベントストリームにSQSのARNを指定
しておけば大丈夫です。
Storage Transfer Serviceの実際の挙動
実際に動かしてみると、下記のようにイベントを常時リッスンしてくれます。
ファイルが見つかると、自動で転送されます!
まとめ
今回はGoogle CloudのStorage Transfer Serviceを利用することで、AWSとGoogle Cloudで同期を取る方法についてまとめました。
認証の際もIAMロールによる認証を使えば、シークレット管理の必要性がなく、ローテーションも不要でセキュアかつ楽ちんですね。
いつまでもキー管理をしていたらバカにされてしまっていたかも…というヒヤリ案件です。
それにしても、マネージドなサービスでこういったことが簡単にできるようになっているのは本当に有り難い限りです。自前で作ったりとかするとやはり保守の問題が出てきますからね…