目的
AWS SDK for JavaScript v3 で、
共有認証情報ファイル(~/.aws/credentials)と共有設定ファイル(~/.aws/config)から認証情報を取得する
@aws-sdk/credential-providersのfromIniを使用して、
MFA 設定あり profile のクレデンシャル取得
取得したクレデンシャルを使用してサービスクライアント実行
実装
import * as readline from "readline";
import { GetCallerIdentityCommand, STSClient } from "@aws-sdk/client-sts";
import { fromIni } from "@aws-sdk/credential-providers";
import { program } from "commander";
program.option("-p --profile <s>", "set switch role profile");
const prompt = (query) => {
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
return new Promise((resolve) =>
rl.question(query, (ans) => {
rl.close();
resolve(ans);
})
);
};
const getAccountId = async (credentials) => {
const client = new STSClient({ credentials });
const command = new GetCallerIdentityCommand({});
const response = await client.send(command);
return response.Account;
};
const getCredentials = async (profile) => {
const params = {
mfaCodeProvider: async (serial) =>
await prompt(`Type the mfa token for the following account: ${serial}: `),
};
if (profile !== undefined) {
params.profile = profile;
}
const provider = fromIni(params);
return await provider();
};
const main = async () => {
program.parse(process.argv);
const options = program.parse(process.argv).opts();
const credentials = await getCredentials(options.profile);
const accountId = await getAccountId(credentials);
console.log(accountId);
};
await main();
スクリプト実行時のコマンドライン引数(--profile <profile名>
)でprofileを指定できるようにしている
profile指定がない場合は、defaultのprofileで実行する
クレデンシャル取得関数(getCredentials
)について、
const client = new STSClient({ credentials: provider });
のように
fromIni
の戻り値(provider
)をクライアントにクレデンシャルとして指定できるが、
クライアントを生成するたびにMFA codeを聞かれるため、
await provider()
としている