Cloud Storage Transfer from AWS S3 を credential発行なしで
概要
TransferでS3のデータを引っ張る機能があるが、 credential ベタ書きしか対応してない。
STSを叩けばええんだが、ずっとGCP側が対応してなかったのが最近対応したらしい。
プレビューのためか、ずいぶん公式の説明が荒いのでこうやったらできるだけ書いとく。
AWS側の設定
Googleアカウントを認証基盤としてつかい、FederateでAWSに認可してもらうということやな。GCP側の権限も必要になるので、それがいいのか、AWS側は accounts.google.com:sub
で制限しなさいということか。
GCP側のAPI指定
roleArn
を指定しろってことね、はいはい。
試し実装
そのうち公式にドキュメントも書くやろ。時限のある記事は詳説しない、手順だけ
GCPの作業
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で試し打ち。今回は試し打ちで
{
"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