Lambda/Node.jsでAWSアカウントIDとリージョンを取得する

渡辺です。

調べてすぐに出てこなかったのでメモ。

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は getCallerIdentitycontext から取得できます。 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;
};