見出し画像

lambda(nodejs)で機密情報を扱うには?

AWS lambdaで機密情報を扱う場合、AWS System Managerのパラメータストアに値を突っ込んで暗号化することが推奨されているようです。そりゃハードコーディングしてたらGitに上げたとたんに悪い人たちの餌食でしょう。
とはいえ、最近はSecrets Managerなるサービスが公開されたので、どっち使えばいいのかみたいな検討からする必要があります。どういったタイミングでどちらを使えばいいのかは「AWSのParameter StoreとSecrets Manager、結局どちらを使えばいいのか?比較」で詳しく記載されているので、省きます。

今回は「AWS System Managerのパラメータストア」nodejsで書いたlambdaからアクセスしてパラメータを取得する方法について書きます。

で、「lambda パラメータストア」とかでググるとサンプルコードがたくさん見つかるわけですが、悉くpythonなわけです。うーん、nodejsのサンプルはないものか。

というわけで、lambda(nodejs)でSystem Managerのパラメータストアの値を取得する方法を調べたので備忘的な意味で残しておきます。

const ssm = new (require('aws-sdk/clients/ssm'))();

exports.handler = async (event) => {
    const data = await ssm.getParameters({
        Names: ['パラメータ名'],
        WithDecryption: true   //暗号化してる場合はtrueで複合化
    }).promise();
    
    for (const i of data.Parameters) {
        console.log(i);
        //あとは煮るなり焼くなり
    }
    
    return response;
};

こんな感じで書けば、パラメータを取得できます。
ただし、lambdaに適切な権限(ロール)を付与する必要があります。

lambdaに実行ロールを付与していると思います。そのロールにパラメータストアにアクセスできるようなポリシーを設定してあげる必要があります。
新規でポリシーを作るなりなんなりするのですが、肝心のポリシーの内容がこちら。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRole",
                "ssm:GetParameters"
            ],
            "Resource": "*"
        }
    ]
}

Resourceは適宜必要な範囲で書き換えたりしてください。

これでNodejsのlambdaからSystem Managerのパラメータストアにアクセスできるようになります。めでたしめでたし。

この記事が気に入ったらサポートをしてみませんか?