Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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,
  },
});
kaihei777
「ここでの投稿は個人のものであって所属する企業や団体の見解を示すものではありません。」
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away