LoginSignup
4
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-10-02

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,
  },
});
4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0