#lambdaの設定をsdkから更新する際の注意点
やりたかったこと
デプロイ済みの複数のlambdaに設定していた環境変数の値を、sdkを使って一気に更新したかった
どうなった?
設定してあった他の環境変数が消えてしまった・・・
結局のところ?
一度、設定情報を取得して、一部だけを更新したもので設定更新した。
説明
デプロイ済みのlambdaの設定情報をjsonで表すと以下の通り
{
FunctionName: 'service-stage-function1',
Environment: {
Variables: {
env1: 'ume',
env2: 'matsu',
env3: 'take',
},
},
}
失敗例(更新したい環境変数だけを渡した場合)
'use strict';
const AWS = require('aws-sdk');
const lambda = new AWS.Lambda();
const params = {
FunctionName: 'service-stage-function1',
Environment: {
Variables: {
env2: 'kame'
},
},
};
consr promise = lambda.updateFunctionConfiguration(params).promise();
promise.then((res) => {
console.info(res);
});
// 出力 res
{
FunctionName: 'service-stage-function1',
Environment: {
Variables: {
env2: 'kame'
},
},
}
何気に上手くいったかもと思って、AWSマネジメントコンソールから該当のlambdaファンクションを確認すると、他の環境変数が消えてしまっていた・・・
## 成功例(一度、設定を取得して、更新したい環境変数の値だけを変えて渡す)
'use strict';
const _ = require('lodash');
const AWS = require('aws-sdk');
const lambda = new AWS.Lambda();
const params = {
FunctionName: 'service-stage-function1',
};
// 現在設定されている内容を取得
const promise = lambda.getFunctionConfiguration(params).promise()
.then((config) => {
// 現在設定されている内容をコピーしないと、新しいenvだけになってしまう
const variables = _.clone(config.Environment.Variables);
variables.env2 = 'kame';
const update = {
FunctionName: functionName,
Environment: {
Variables: variables,
},
};
return lambda.updateFunctionConfiguration(update).promise();
});
promise.then((res) => {
console.info(res);
});
// 出力 res
{
FunctionName: 'service-stage-function1',
Environment: {
Variables: {
env1: 'ume'
env2: 'kame'
env3: 'take'
},
},
}
追記 2018/10/29
sdkで、大量に更新リクエストを投げると、TooManyRequestsExceptionとかLimitExceededExceptionとかリミット系例外が発生する事があります。
リトライしてタイミングをずらしてあげると、完了させられます。
デフォルトのオプションでmaxRetriesやretryDelayOptionsがありましたので
情報として載せて起きます。
こんな感じ
const AWS = require('aws-sdk');
const lambda = new AWS.Lambda({
maxRetries: 10,
retryDelayOptions: {
base: 1000,
},
});