はじめに
AWS Lambda, Node.js(18.x), System Manager(Paramter Store)で簡単なサーバーレスバックエンドを構築した時、Node.js 16.x以前とParamter Storeにアクセスする記述が変わったので変更点をまとめます。
対象となる読者
- AWS Lambda初心者の方
- AWS System Manager初心者の方
Lambda実行環境
- Node.js 18.x
ポリシーの作成とLambda関数の実装
AWS LambdaのデフォルトではParamter Storeにアクセスする権限がありません。そのためParamter Storeにアクセスするにはポリシーを設定し、そのポリシーを対象のLambda関数にアタッチ(権限付与)する必要があります。以下はParameter Storeにアクセスするポリシーのサンプルです。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"ssm:GetParameters"
],
"Resource": "*"
}
]
}
AWS SDK for JavaScript v3ではv2と比べて少し記述方法が変更されています。v3ではパッケージ分割されたためSDKのサイズを小さくして使用することが可能となりました。
// import the Lambda client constructor in v2 of the SDK
const Lambda = require("aws-sdk/clients/lambda");
// import the Lambda client constructor in v3 SDK
const { Lambda } = require("@aws-sdk/client-lambda");
System Manager(SSM)で設定したParameter StoreにアクセスするLambda関数の参考例
ssm.js
// CommonJS require syntax
const { SSMClient, GetParametersCommand } = require("@aws-sdk/client-ssm");
const ssmClient = new SSMClient({ region: "ap-southeast-1" }); //対象のregion指定
const input = { Names: ['paramter1', 'paramter2'], WithDecryption: true };
const command = new GetParametersCommand(input);
const init_promise = ssmClient.send(command);
exports.handler = async () => {
const data = await init_promise; // await inside handler
let paramter1 = '';
let paramter2 = '';
let ssm = {};
for (const i of data.Parameters) {
if (i.Name === '取得したいParameter') {
paramter1 = i.Value;
ssm['paramter1'] = paramter1
}
if (i.Name === '取得したいParameter') {
paramter2 = i.Value;
ssm['paramter2'] = paramter2
}
}
return ssm;
};
index.js
const ssmFunc = require('./ssm.js');
// ssmの処理
※複数のParameterを取得したいため、GetParametersCommandとしましたが、取得するParameterが1つであればGetParameterで良いです。