AWS
GCS

コンテナからGCS(Google Cloud Storage)にアクセスする方法


概要

AWS Batchで起動したコンテナ上からGCS(Google Cloud Storage)にアクセスするためにやったことを書きます。

AWS Batchじゃなくても使えると思います。

仕組みは、AWS Parameter StoreにGCPのサービスアカウントキーをKMSで暗号化した状態で格納しておき、

コンテナ起動時にParameter Storeからdecryptして、gcloud authコマンドで認証する流れです。

それでは行ってみましょう。


事前準備


  • GCPでGCSにアクセス可能なサービスアカウントを作成、ダウンロードしておく。

  • gcloudコマンドがインストールされたコンテナを用意する。




手順


AWS KMSでキーを作成

KMSでParameter Storeで暗号化するために必要なキーを作成します。

# キーの作成

aws kms create-key --description <キーの説明> --region ap-northeast-1

# キーのエリアスを設定
aws kms create-alias --alias-name alias/<キーの名前> --target-key-id <キー作成時に出力されたKeyId>


Parameter Storeでサービスアカウントを格納

上記で作成したKMSのkey idを指定して、暗号化した状態でサービスアカウントキーをParameter Storeに格納します。

# パラメーターストアの作成

aws ssm put-parameter \
--region ap-northeast-1 \
--name <パラメーターの名前> \
--type SecureString \
--key-id alias/<キーの名前> \
--value "$(cat <サービスアカウントキーのファイル>)"


IAMの権限付与

(AWS Batchを利用していれば)ジョブロールに割り当てるIAM Roleに以下のPolicyを付与します。


  • AmazonSSMFullAccess

  • 以下のインラインポリシーを作成し、割り当て

{

"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"kms:Decrypt"
],
"Resource": [
"<KMSのARNを入れてください>"
]
}
]
}


認証処理

今回はこちらの記事を参考に、DockerのENTRYPOINTで初期化用のスクリプト(fetch_and_run.sh)を実行させます。この初期化用スクリプトの中で gcloud auth を実行させました。

実際の認証処理は以下のようにしました。

aws ssm get-parameters で取得したサービスアカウントを /tmp/credentials.json に出力し、それを使って gcloud auth で認証しています。

# fetch_and_run.sh 

aws ssm get-parameters --name ${SSM_PARAMETER_NAME} --with-decryption --region ap-northeast-1 --output json | jq -r '.Parameters[].Value' > /tmp/credentials.json
gcloud auth activate-service-account --key-file=/tmp/credentials.json


まとめ

Parameter Storeって便利。