[アップデート] Lambdaから直接Parameter Store/Secrets Managerから値を取得できるようになりました!

2022.10.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは 新卒の南です。

今回のアップデートでLambdaから直接Parameter Store, Secrets Managerから値を取得できるようになりましたのでご紹介します。

アップデート概要

これまでLambdaでParameter StoreやSecrets Managerから値を取得する際はSDK経由で直接APIを叩いていました。
それぞれAPIのコールごとに課金(パラメータストアAPIインタラクション1万回ごとに0.05 USD)されますので、自前でキャッシュを実装していた方もいるのではないでしょうか?
今回のアップデートではLambdaから直接値を取ってこれるようになっただけではなく、AWS側でキャッシュしてくれることで、コストの削減•レイテンシーの改善を行うことができるようになります。

また、仕組みとしてはLambda Extensionsを使っており、関数呼び出しとは別に並列で処理を行い、値を取得しローカルキャッシュに保存します。

Lambda Extensionsに関しては以下のブログをご覧ください。

ちなみにArmアーキテクチャではまだサポートされていません。

やってみた

Parameter Storeを例にやってみました。

公式リファレンス
パラメーターストア
シークレットマネージャー

権限周り

SDKで実装していた時と同様、実行ロールに権限を渡す必要があります。

  • ssm:GetParameter

また、暗号化されている場合(SecureStringの場合)は

  • kms:DecryptSecureString

を付与する必要があります。

Lambda Extensionsの追加

「レイヤー」からExtensionsを追加します。 マネジメントコンソールの場合は 「AWS レイヤー」→ 「AWS-Parameters-and-Secrets-Lambda-Extension」を選択してください。

CLI等で設定する場合は公式リファレンスに記載のARNを入力して設定します。(ARNはリージョン毎に値が異なります。)

リージョン ARN
米国東部 (バージニア北部) arn:aws:lambda:us-east-1:177933569100:layer:AWS-Parameters-and-Secrets-Lambda-Extension:2
アジアパシフィック (東京) arn:aws:lambda:ap-northeast-1:133490724326:layer:AWS-Parameters-and-Secrets-Lambda-Extension:2
アジアパシフィック (大阪) arn:aws:lambda:ap-northeast-3:576959938190:layer:AWS-Parameters-and-Secrets-Lambda-Extension:2

環境変数の追加

環境変数を設定することで、キャッシュのTTLなど細かい値を制御することができます。

環境変数 必須 有効な値 デフォルト 説明
SSM_PARAMETER_STORE_TIMEOUT_MILLIS いいえ すべての整数 0 Parameter Store へのリクエストのタイムアウト (ミリ秒単位)。

値 0 は、タイムアウトがないことを示します。

SECRETS_MANAGER_TIMEOUT_MILLIS いいえ すべての整数 0 Secrets Manager へのリクエストのタイムアウト (ミリ秒単位)。

値 0 は、タイムアウトがないことを示します。

SSM_PARAMETER_STORE_TTL いいえ 0 ~ 300 秒 (5 分) 300000 ミリ秒 (5 分) Parameter Storeから取得した値のキャッシュの最大有効存続時間 (秒単位)。値 0 は、キャッシュしないことを示します。PARAMETERS_SECRETS_EXTENSION_CACHE_SIZEの値が 0 の場合、この変数は無視されます 。
SECRETS_MANAGER_TTL いいえ 0 ~ 300 秒 (5 分) 300000 ミリ秒 (5 分) Secrets Managerから取得した値のキャッシュの最大有効存続時間 (秒単位)。値 0 は、キャッシュしないことを示します。PARAMETERS_SECRETS_EXTENSION_CACHE_SIZEの値が 0 の場合、この変数は無視されます 。
PARAMETERS_SECRETS_EXTENSION_CACHE_ENABLED いいえ True, False true 拡張機能のキャッシュを有効にするかどうかを決定します。
PARAMETERS_SECRETS_EXTENSION_CACHE_SIZE いいえ 0 ~ 1000 1000 項目数に関するキャッシュの最大サイズ。値 0 は、キャッシュしないことを示します。両方のキャッシュ TTL 値が 0 の場合、この変数は無視されます。
PARAMETERS_SECRETS_EXTENSION_HTTP_PORT いいえ 1 ~ 65535 2773 ローカル HTTP サーバーのポート。
PARAMETERS_SECRETS_EXTENSION_MAX_CONNECTIONS いいえ 最小 1。上限なし。 3 Extensionsが Parameter Store または Secrets Manager へのリクエストを行うために使用する HTTP クライアントの最大接続数。
PARAMETERS_SECRETS_EXTENSION_LOG_LEVEL いいえ DEBUG, WARN, ERROR, NONE, INFO INFO Extensionsのログレベル

値の取得方法

ローカルホストに対して以下のようなHTTPリクエストを行うことで値を取得することができます。

GET: /systemsmanager/parameters/get?name=parameter-path?version=version&label=label&withDecryption={true|false}

parameter-pathに関してはParameter storeのNameと ARNで指定することが可能です。

注意点

  • パスに含まれる/(スラッシュ)はエスケープする必要があります。
    • 例 「/abc/def/hij/」の場合は「%20/abc%20/def%20/hij%20/」
  • 検証の為「X-Aws-Parameters-Secrets-Token 」ヘッダーに「AWS_SESSION_TOKEN 」を設定する必要があります
  • デフォルトのポートは2773となっています。(環境変数で変更可能)

サンプル

import requests
import os

def get_parameter():
    end_point = 'http://localhost:2773'
    path = '/systemsmanager/parameters/get/?name=test_param'
    url = end_point + path
    headers = {
        'X-Aws-Parameters-Secrets-Token': os.environ['AWS_SESSION_TOKEN']
    }

    res = requests.get(url, headers=headers)

最後に

Twitterの反応を見ていると、割と多くの方が望んでいたアップデートのように見受けれらます。自前でキャッシュを実装する必要がなくなったので、嬉しい方も多いのではないでしょうか?
また、今回のアップデートではArmアーキテクチャではまだサポートされていませんので、こちらも対応してくれることを期待ですね!