概要
AWS Batchで起動したコンテナ上からGCS(Google Cloud Storage)にアクセスするためにやったことを書きます。
AWS Batchじゃなくても使えると思います。
仕組みは、AWS Parameter StoreにGCPのサービスアカウントキーをKMSで暗号化した状態で格納しておき、
コンテナ起動時にParameter Storeからdecryptして、gcloud authコマンドで認証する流れです。
それでは行ってみましょう。
事前準備
- GCPでGCSにアクセス可能なサービスアカウントを作成、ダウンロードしておく。
- gcloudコマンドがインストールされたコンテナを用意する。
- Cloud SDKのインストールにて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って便利。