grasys blog

もうアクセスキーの発行はやめよう。S3からGCSへの「鍵なし」転送術

こんにちは、つのだです。

Google CloudのStorage Transfer Serviceを使用してS3からGCSへデータを送りたい時ありますよね。

でもアクセスキーの管理めんどくさい…

鍵ローテ?ダルい…

鍵の漏洩リスク?怖い…

「鍵なし」での転送方法は非常にスマートですが、設定手順はちっともスマートじゃなかったので、最短ルートの地図を書き残しておきます。

道に迷いたくない方はこちらをどうぞ。

フェデレーションIDを使用したS3連携

1つの資格情報セットを使用して、許可されたユーザーが複数のアプリケーションやドメインにアクセスできるようになるものです。

これを使ってS3と連携することで「鍵なし」にします。

手順は以下


  1. AWS:ポリシー作成
  2. AWS:ロール作成
  3. GCP:Storage Transfer Serviceで使用するSAのサブジェクトID取得
  4. AWS:ロール設定更新(信頼ポリシーの編集)
  5. 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バケットを指定する
  • 認証情報
    • 認証のオプション:ID連携のためのAWS IAMロール
      • ARNを設定する
  • 転送先
    • バケットまたはフォルダ:grasys-transfer-receiver
      • 転送先のGCSバケットを指定する
  • ジョブを実行するタイミングの選択
    • 今回は1回だけ実行/今すぐ実行
  • あとはデフォルト

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

S3側のsampleフォルダが転送されてきました!

まとめ

アクセスキーという「物理的な鍵」を持たない運用は快適です。

この構成のポイントを振り返って締めくくります。


複雑な手順ではありますが、一度設定してしまえば運用は劇的に楽になります。

苦労した先には、鍵の管理がない環境が待っています。

信頼関係(フェデレーション)を正しく設定することは、マルチクラウドの醍醐味だったりします。

まずは一歩、キーレス運用の世界へ踏み出してみましょう!


(参考) google公式ドキュメント:フェデレーションIDを使用して認証する


採用情報
お問い合わせ