この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
渡辺です。
調べてすぐに出てこなかったのでメモ。
Lambdaで自身のAWSアカウントIDとリージョンが知りたい
ハードコーディングせずに他のサービスを呼び出すため、arnを作りたいです。 例えば・・・
const arn = `arn:aws:states:${region}:${accountId}:stateMachine:test`;
リージョンの取得
リージョンは環境変数から取得できます。
const region = process.env.AWS_REGION;
AWSアカウントID
AWSアカウントIDは環境変数から 取得できません 。
STS#getCallerIdentity を使う
STSの getCallerIdentity
は鉄板ですね。
const AWS = require('aws-sdk');
const sts = new AWS.STS();
const accountId = (await sts.getCallerIdentity({}).promise()).Account;
contextのinvokedFunctionArnから取得する
Lambdaの実行コンテキストに、実行されたLambda関数のARNが含まれるので、パースして取得します。
exports.handler = async (event, context) => {
// ex: arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxxxxxx:function:test
const accountId = context.invokedFunctionArn.split(':')[4];
}
まとめ
リージョンは環境変数から取得しましょう。
AWSアカウントIDは getCallerIdentity
か context
から取得できます。
Lambdaのハンドラーで取得してしまえば解決するなら context
、
関数の深い位置やライブラリ内で取得するならば getCallerIdentity
が無難でしょうかね。
以下、実行サンプルです。
const AWS = require('aws-sdk');
const sts = new AWS.STS();
exports.handler = async (event, context) => {
console.log(process.env.AWS_REGION)
const accountId = (await sts.getCallerIdentity({}).promise()).Account;
console.log(accountId)
const accountId2 = context.invokedFunctionArn.split(':')[4];
console.log(accountId2)
return accountId;
};