Workload Identity Federation を使って AWS から Google Cloud にアクセスしてみた
はじめに
前回の記事で Google Cloud から AWS にアクセスする方法を検証しました。
今回は逆に AWS から Google Cloud にアクセスする方法を検証してみたいと思います。
弊社では主に Google Cloud を利用して自社プロダクトの開発を行っていますが、以下の様なケースでは AWS から Google Cloud のリソースにアクセスするケースが考えられます。
- Google Cloud を利用しない形で外形監視などを行うことを考えると AWS から Google Cloud のリソースにアクセスする
- AWS のシステムからファイルを出力し、イベント駆動で Google Cloud のシステムと連携する
前提
以下の様にすでに多くの記事があります。ただ、参考記事の中でも言及されていますが、Google Cloud の Workload Identity Federation を設定したあとに取得できる構成ファイルは EC2 上で動作することを前提にしており実行環境によっては利用できません。
そこで、今回は構成ファイルを利用しない形で Google Cloud のリソースにアクセスする方法を検証したいと思います。
- Workload Identity 連携で AWS(EC2/ECS/EKS)からサービスアカウントキーなしで BigQuery にアクセスする
- キーを使用せずに AWS から Google Cloud にアクセスする方法
Workload Identity プールとプロバイダの作成 (Google Cloud 側)
以下を参考に Wookload Identity のプールとプロバイダを作成します。
Workload Identity のプールとプロバイダを作成する
Workload Identity プールを作成します。プールの名前は任意ですが今回は test-aws-pool
としました。
gcloud iam workload-identity-pools create test-aws-pool \
--location="global" \
--description="テスト用の Workload Identity プールです" \
--display-name="test-aws-pool"
次に Workload Identity プロバイダを作成します。プロバイダの名前は任意ですが今回は test-aws-provider
としました。
また、attribute-mapping の部分はマネージメントコンソールから作成する際の設定値をそのまま利用しました。
gcloud iam workload-identity-pools providers create-aws test-aws-provider \
--location="global" \
--workload-identity-pool="test-aws-pool" \
--account-id="AWS のアカウント ID" \
--attribute-mapping='google.subject=assertion.arn,attribute.aws_role=assertion.arn.contains("assumed-role")'
Google Cloud Storage へのアクセス権限の付与 (Google Cloud 側)
今回は AWS の CloudShell から Google Cloud のリソースにアクセスを試します。
また、多くの参考記事ではサービスアカウントの接続を試していたため、プロバイダに直接権限を付与する方法を試してみました。
今回は AWS 側で Assume Role を行った状態で CloudShell を利用する想定のため以下のプリンシパルにアクセス権を付与します。
最後の IAM ユーザー名がログインしたユーザー名で IAM ロール名が Assume Role したロール名になります。
principal://iam.googleapis.com/projects/<プロジェクト ID>/locations/global/workloadIdentityPools/test-aws-pool/subject/arn:aws:sts::<AWS アカウント ID>:assumed-role/<IAM ロール名>/<IAM ユーザー名>
Cloud Storage に上のプリンシパルに対して今回は検証のため roles/storage.admin
の権限を付与しました。
CloudShell から Google Cloud Storage へのアクセス (AWS 側)
Google のドキュメントにある python スクリプトを CloudShell にコピーし、実行前に以下のプロジェクト Number 、プール名、プロバイダ名を設定しておきます。
def main() -> None:
# TODO(Developer): Replace the below credentials.
# project_number: Google Project number (not the project id)
project_number = "my-project-number"
pool_id = "my-pool-id"
provider_id = "my-provider-id"
コピーしたスクリプトを実行します。
python3 path/to/script
スクリプトを実行すると以下の様な Google Cloud の Security Token Service API のリクエストに必要な情報が出力されます。
Token:
{
"headers": [
{
"key": "Host",
"value": "sts.amazonaws.com"
},
{
"key": "x-goog-cloud-target-resource",
"value": "//iam.googleapis.com/projects/XXXXXXXX/locations/global/workloadIdentityPools/test-aws-pool/providers/test-aws-provider"
},
{
"key": "X-Amz-Date",
"value": "202410XXT002132Z"
},
{
"key": "X-Amz-Security-Token",
"value": "XXXXX"
},
{
"key": "Authorization",
"value": "AWS4-HMAC-SHA256 Credential=XXXX/202410XX/us-east-1/sts/aws4_request, SignedHeaders=host;x-amz-date;x-amz-security-token;x-goog-cloud-target-resource, Signature=XXXXXXX"
}
],
"method": "POST",
"url": "https://sts.amazonaws.com/?Action=GetCallerIdentity&Version=2011-06-15"
}
URL encoded token:
<トークン>
出力された情報をコピーして Google Cloud からアクセストークンを取得します。トークンは前のスクリプトで取得したトークンを利用します。
SUBJECT_TOKEN_TYPE="urn:ietf:params:aws:token-type:aws4_request"
SUBJECT_TOKEN=<トークン>
STS_TOKEN=$(curl https://sts.googleapis.com/v1/token \
--data-urlencode "audience=//iam.googleapis.com/projects/<プロジェクト Number>/locations/global/workloadIdentityPools/test-aws-pool/providers/test-aws-provider" \
--data-urlencode "grant_type=urn:ietf:params:oauth:grant-type:token-exchange" \
--data-urlencode "requested_token_type=urn:ietf:params:oauth:token-type:access_token" \
--data-urlencode "scope=https://www.googleapis.com/auth/cloud-platform" \
--data-urlencode "subject_token_type=$SUBJECT_TOKEN_TYPE" \
--data-urlencode "subject_token=$SUBJECT_TOKEN" | jq -r .access_token)
echo $STS_TOKEN
出力されたトークンを利用して Google Cloud Storage にアクセスします。
curl -H "Authorization: Bearer $STS_TOKEN" https://storage.googleapis.com/storage/v1/b/<バケット名>/o
正常にアクセスできたらバケットの中身が表示されます。
終わりに
今回は AWS から Google Cloud にアクセスする方法を検証しました。
構成ファイルを利用しない形で実際に Google Cloud のリソースにアクセスすることで、ライブラリ側でどのような事が行われているか理解が深まりました。
今後、実際に AWS から Google Cloud のリソースにアクセスする必要が発生した場合には今回の知識を下に適切な構成を設定できるようになったと思います。
※ データ分析、データ基盤構築、及び AI 活用に関するご相談は、以下よりお気軽にお問い合わせください。
お問い合わせフォーム
Discussion