• 1000 *
Вот пример счетчика, увеличивающегося каждый раз при вызове лямбда-функции:
// handler.js, Lambda entry point
const AWS = require('aws-sdk')
const ssm = new AWS.SSM();
const SSM_KEY = 'SSMData';
const getSSMData = async () => {
var getParams = {
Name: SSM_KEY,
};
try {
const data = await new Promise((resolve, reject) => {
ssm.getParameter(getParams, (error, data) => {
if (error) reject(error)
if (data) resolve(data)
});
});
if (data.Parameter && data.Parameter.Value) {
return JSON.parse(data.Parameter.Value)
} else {
return null
}
} catch (error) {
return false
}
}
const putSSMData = async (data) => {
const jsonData = JSON.stringify(data)
var putParams = {
DataType: "text",
Name: SSM_KEY, /* required */
Type: 'String',
Value: jsonData, /* Max 4kb */
Overwrite: true
};
try {
await new Promise((resolve, reject) => {
ssm.putParameter(putParams, (error, data) => {
if (error) reject(error)
if (data) resolve(data)
});
});
return true
} catch (error) {
console.log(error, error.stack);
return false;
}
};
module.exports.hello = async (event, context) => {
let previousResult = await getSSMData()
if (!previousResult) {
previousResult = {
count: 0
}
}
console.log({ previousResult })
const nextResult = { ...previousResult, count: previousResult.count + 1 }
await putSSMData(nextResult)
};
Результат
Вызов лямбда-выражения 1: { previousResult: { count: 0 } }
Лямбда-вызов 2: { previousResult: { count: 1 } }
Лямбда-вызов 3: { previousResult: { count: 2 } }
...
Разрешения
Необходимо добавить роль IAM, чтобы лямбда-функция использовала SSM. Используя бессерверную структуру:
iamRoleStatements:
- Effect: "Allow"
Action:
- "ssm:GetParameter"
Resource:
- "arn:aws:ssm:<REGION>:<ACCOUNT_ID>:parameter/SSMData"
- Effect: "Allow"
Action:
- "ssm:PutParameter"
Resource:
- "arn:aws:ssm:<REGION>:<ACCOUNT_ID>:parameter/SSMData"