Edited at

lambdaの設定をsdkから更新する際の注意点


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がありましたので

情報として載せて起きます。

https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html#constructor-property

こんな感じ

const AWS = require('aws-sdk');

const lambda = new AWS.Lambda({
maxRetries: 10,
retryDelayOptions: {
base: 1000,
},
});