• 作成:

AWS SDK for JavaScript v3を使ってDocker向けにAWS_ACCESS_KEY_IDなどを展開する

EFSにデータをアップロードするためのDockerfileを書きました

Dockerでごちゃごちゃビルドして最終成果物をEFSにアップロードするDockerfileを書きました。

[aws-efs] Upload files to EFS · Issue #9496 · aws/aws-cdk で提起されているように、 aws-s3-assetsみたいなものがEFSにもあればCDK任せで良かったのですが。

Dockerコンテナはローカルで動く

これはそんなに頻繁にビルドするわけではなく、多分二度と再ビルドしません。 Lambdaの容量制限を回避したかったのでEFSに巨大バイナリと辞書データを追い出しているだけです。

後これ調査段階で、出来るか確認したいだけでまだ本格的な開発はしてないんですよね。

なのでこんなもののためにCodePipelineは使いません。 LambdaとEFSのためだけに使う必要あるのか?と言う話ですね。一応EFSをBlue/Greenデプロイ出来るようなのでEFSに関しては意味はなくはないようですが、そんなに広く使われるわけではないと言うのと、 Lambdaしかないなので再起動とか関係ないと言うのもありますね。

CDKのデプロイ機能とCodePipelineの機能、若干範囲が被ってるので組み合わせの判断が難しい。

ともかく、そういう訳でこのDockerコンテナはローカルで動くことになるわけです。

ファイルに書いてある認証情報をコマンドライン側でごちゃごちゃしないで展開したい

ECSとかEC2で動くならAWSの認証情報はメタデータ管理されるので、基本的なSDKを使っていれば何も設定する必要は無いのですが、ローカルで動かすならそうもいきません。

なのでDockerfileには

ENV AWS_ACCESS_KEY_ID="require"
ENV AWS_SECRET_ACCESS_KEY="require"

のように書いていく必要があるのですが、キーをコマンドラインで指定するのはだるい。

AWS_PROFILEの指定だけで展開してほしいですよね。なんかツールとかあるのかもしれませんがみんなに導入してもらうのはつらいですし、将来的にさらに上位側でプロファイル指定じゃなくてキー指定やメタデータ指定などでも対応できる汎用的な方法で展開したい。

AWS SDK for JavaScript v3での方法

当然そう云うツールはあるわけですが、最近のSDKを使っているのでちょっと調べる必要がありました。

@aws-sdk/credential-provider-node | AWS SDK for JavaScript v3 を使って、このように展開出来るようです。

import { defaultProvider } from "@aws-sdk/credential-provider-node";

async function main() {
  const creds = await defaultProvider()();
  console.log(creds.accessKeyId);
}

main();