目次
こんにちは、つのだです。
Google CloudのStorage Transfer Serviceを使用してS3からGCSへデータを送りたい時ありますよね。
でもアクセスキーの管理めんどくさい…
鍵ローテ?ダルい…
鍵の漏洩リスク?怖い…
「鍵なし」での転送方法は非常にスマートですが、設定手順はちっともスマートじゃなかったので、最短ルートの地図を書き残しておきます。
道に迷いたくない方はこちらをどうぞ。
フェデレーションIDを使用したS3連携
1つの資格情報セットを使用して、許可されたユーザーが複数のアプリケーションやドメインにアクセスできるようになるものです。
これを使ってS3と連携することで「鍵なし」にします。
手順は以下
- AWS:ポリシー作成
- AWS:ロール作成
- GCP:Storage Transfer Serviceで使用するSAのサブジェクトID取得
- AWS:ロール設定更新(信頼ポリシーの編集)
- GCP:Storage Transfer Service作成
環境
- ポリシー
- grasys-transfer-test-policy
- ロール
- grasys-transfer-test-role
- 転送元S3 (sample/あり)
- AWS:grasys-transfer-origin
- 転送先(空の状態)
- GCS:grasys-transfer-receiver


ポリシー作成
まずはAWS側で、Transfer用のポリシーを作成します。
定義される許可は以下にします。(JSON)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:Get*",
"s3:List*",
"s3:Delete*"
],
"Resource": "*"
}
]
}

ロール作成
作成したポリシーを許可ポリシーに設定したロールを作成します。
ウェブアイデンティティに設定
- プロバイダー:Google
- Audience:accounts.google.com

許可ポリシーは先ほど作ったポリシーを設定します。

信頼されたエンティティについては一旦このままにし、ロールを作成しちゃいます。

この後ロールの「信頼されたエンティティ」を更新するのですが、Google Cloud側のStorage Transfer Serviceで使用するサービスアカウントのサブジェクトIDが必要なので、先にそれを取得しに行きます。
Storage Transfer Serviceで使用するSAのサブジェクトID取得
googleServiceAccounts.getのリファレンスページに移動します。

プロジェクトIDを入れてExecuteボタンを押すと、ログインを求められた後、サブジェクトIDを取得できます。

ロール設定更新
作成したロールの信頼関係タブを選択
信頼されたエンティティを以下のようにします(JSON)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "accounts.google.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"accounts.google.com:sub": "取得したSUBJECT_ID"
}
}
}
]
}

Storage Transfer Service作成
設定は以下で作成
- 開始
- ソースタイプ:Amazon S3
- 宛先の種類:Google Cloud Storage
- スケジュールモード:今回は四半期
- ソースの選択
- バケットまたはフォルダ:grasys-transfer-origin
- 転送元のS3バケットを指定する
- バケットまたはフォルダ:grasys-transfer-origin
- 認証情報
- 認証のオプション:ID連携のためのAWS IAMロール
- ARNを設定する
- 認証のオプション:ID連携のためのAWS IAMロール
- 転送先
- バケットまたはフォルダ:grasys-transfer-receiver
- 転送先のGCSバケットを指定する
- バケットまたはフォルダ:grasys-transfer-receiver
- ジョブを実行するタイミングの選択
- 今回は1回だけ実行/今すぐ実行
- あとはデフォルト

作成するとジョブが立ち上がり、転送が始まります。

S3側のsampleフォルダが転送されてきました!
まとめ
アクセスキーという「物理的な鍵」を持たない運用は快適です。
この構成のポイントを振り返って締めくくります。
複雑な手順ではありますが、一度設定してしまえば運用は劇的に楽になります。
苦労した先には、鍵の管理がない環境が待っています。
信頼関係(フェデレーション)を正しく設定することは、マルチクラウドの醍醐味だったりします。
まずは一歩、キーレス運用の世界へ踏み出してみましょう!
(参考) google公式ドキュメント:フェデレーションIDを使用して認証する




