🚚

Cloud Storage Transfer from AWS S3 を credential発行なしで

2021/10/10に公開

概要

TransferでS3のデータを引っ張る機能があるが、 credential ベタ書きしか対応してない。
STSを叩けばええんだが、ずっとGCP側が対応してなかったのが最近対応したらしい。
プレビューのためか、ずいぶん公式の説明が荒いのでこうやったらできるだけ書いとく。

AWS側の設定

https://cloud.google.com/storage-transfer/docs/configure-access#federated-identity

Googleアカウントを認証基盤としてつかい、FederateでAWSに認可してもらうということやな。GCP側の権限も必要になるので、それがいいのか、AWS側は accounts.google.com:subで制限しなさいということか。

GCP側のAPI指定

https://cloud.google.com/storage-transfer/docs/reference/rest/v1/TransferSpec#awss3data

roleArn を指定しろってことね、はいはい。

試し実装

そのうち公式にドキュメントも書くやろ。時限のある記事は詳説しない、手順だけ

GCPの作業

https://cloud.google.com/storage-transfer/docs/configure-access#federated-identity

data transfer は google-managedのサビ垢使うので、それを確認しとけとかいてある。DevelopersConsoleから確認できるのかと思いきや、確認できんわこれ。リンクをたどるとIAMのgetServiceAccountじゃなく、Transferのもの、つまり専用。だからリンク飛んでAPI Exprolerで結果見ろと。

{
  "accountEmail": "project-12345679@storage-transfer-service.iam.gserviceaccount.com",
  "subjectId": "12345699999999999"
}

両方後で使うからメモる

AWS側でロール作る

書いてあるとおりやればええ。

"accounts.google.com:sub": "Service_account_subject_identifier" は上の手順で帰ってきた subjectIdを使えと。Principalと権限を振っておわり。

Callしてみる

gcloud 非対応、developer console も非対応なので、client-libか、API Exploerで試し打ち。今回は試し打ちで

https://cloud.google.com/storage-transfer/docs/reference/rest/v1/transferJobs/create

{
  "description": "test",
  "transferSpec": {
    "awsS3DataSource": {
      "roleArn": "[AWSで作ったロール]",
      "bucketName": "[AWS側のバケツ]"
    },
    "gcsDataSink": {
      "bucketName": "[GCS側バケツ]",
      "path": "[GCS側パス]"
    }
  },
  "projectId": "[project-id]",
  "status": "ENABLED"
}

job作るだけだから、DCで走らせてテストする。とりあえず動いた。

安全評価

  • accounts.google.com:sub でAWS側から制約が入っている。試しにわざと間違えてみる。s3 permission denied でちゃんと失敗する。
  • subject-id がプロジェクトごとにちゃんと異なってるのかの確認したら、確かに違う値になってる

この仕組み自体は鍵の持ち出しもできないので、穴は見つからない。とっととGAにしてもいいんじゃないでしょうか。

Discussion