ABCABC Tech Catalog
アプリ/業務効率化

認証にAWS IAMロールを使いながらAWS S3とGCSをリアルタイム同期する

アクセスキーを管理したくないから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側でも事前準備が必要です。

  1. [Google Cloud] Storage Transfer Service APIを有効化
  2. [Google Cloud] Storage Transfer Service用のサービスアカウントのメールアドレスおよびSubject IDを取得
  3. [AWS] リアルタイム同期のためのSQSのQueueを作成
  4. [AWS] S3のイベント通知対象に作ったQueueを指定
  5. [AWS] S3およびSQSの権限設定を行ったIAMポリシーを作成
  6. [AWS] 上記ポリシーの適用されるロールを作成
    • 信頼されたエンティティとしてウェブアイデンティティを選択し、Storage Transfer Serviceのサービスアカウントで認証が通るようにする
  7. [Google Cloud] 上記AWS IAMロールを認証に設定しつつイベントドリブンモードで転送ジョブを稼働させる

以上です。めっちゃ簡単ですね!!

S3からGCSへの転送設定時のポイントまとめ

転送の設定方法を全部書いていると長くなるので、いくつかポイントになる点をまとめようと思います。

「サービスアカウントのメールアドレスおよびSubject IDを取得」の方法

これは公式マニュアル「サービス エージェントのメールアドレスを確認する」のとおり、

「Method: googleServiceAccounts.get」のAPIマニュアルページ の「Try this method」から取得するのが一番早いです。あるいはCloud Shellを叩くか…でしょうか。

file1

ここで取得した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」を入力しておきます。

file2

こうすることで、下記のような信頼ポリシーが得られます。

file3

これだけで認証が通るのは、シークレットを管理する手間がなくて本当に助かりますね。

Google Cloud側の設定方法

AWS側の設定も全て終わったら、Storage Transfer Serviceを設定します。

スケジュール モードに「イベント ドリブン」を選択します。

file4

その後の設定画面では、

  • 認証情報として「ID連携のためのAWS IAMロール」を選択してIAMロールのARNを入力
  • イベントストリームにSQSのARNを指定

しておけば大丈夫です。

file5

Storage Transfer Serviceの実際の挙動

実際に動かしてみると、下記のようにイベントを常時リッスンしてくれます。

file6

ファイルが見つかると、自動で転送されます!

file7

まとめ

今回はGoogle CloudのStorage Transfer Serviceを利用することで、AWSとGoogle Cloudで同期を取る方法についてまとめました。

認証の際もIAMロールによる認証を使えば、シークレット管理の必要性がなく、ローテーションも不要でセキュアかつ楽ちんですね。

いつまでもキー管理をしていたらバカにされてしまっていたかも…というヒヤリ案件です。

それにしても、マネージドなサービスでこういったことが簡単にできるようになっているのは本当に有り難い限りです。自前で作ったりとかするとやはり保守の問題が出てきますからね…

AUTHOR

伴 拓也

朝日放送グループホールディングス株式会社 デジタル・アーキテック局 データ戦略チーム

アプリケーションからインフラ、ネットワーク、データエンジニアリングまで幅広い守備範囲が売り。最近はデータ基盤の構築まわりに力を入れて取り組む。 主な実績として、M-1グランプリ敗者復活戦投票システムのマルチクラウド化等。

WORK@ABC

技術力を培うための
環境と文化

ABCに昔から根付く「自分たちで開発する」文化を支える環境や取り組みをご紹介します
ABCについてもっと知る