はじめに
AWS Lambda を使ったサーバーレスアプリケーション開発では、認証情報や設定値などの秘匿情報をどのように管理・取得するかが重要な課題となります。従来はAWS SDKを用いてSecrets ManagerやSSM Parameter Storeにアクセスしていましたが、「AWS Parameters and Secrets Lambda Extension」を使うことで、よりシンプルで高速、かつセキュアにアクセスできることを最近知りました。今回はそんなAWS Parameters and Secrets Lambda Extensionについて紹介したいと思います。
そもそもLambda Extensionとは?
Lambda Extension は、Lambda 関数の実行環境に追加の機能を提供する仕組みです。AWS が提供する公式の「AWS Parameters and Secrets Lambda Extension」は、Secrets Manager および SSM Parameter Store からのパラメータ/シークレットの取得を高速化・簡素化してくれます。
SDKによるアクセスではだめなのか?
従来のSDKを利用した方法では、Lambda 関数内で毎回 SDK を使ってAPIリクエストをする必要があり、これにはオーバーヘッドがあり、関数のコールドスタートや実行時間に影響を与えます。
一方で「AWS Parameters and Secrets Lambda Extension」はExtension を使うことで、AWSのローカルのHTTPエンドポイント(127.0.0.1)を通じてSecrets ManagerやParameter Storeにアクセスできるだけではなく、Secrets ManagerやParameter Storeから取得した値をキャッシュしてくれるという利点もあり、Secrets ManagerやParameter StoreのAPIへのアクセス回数を大幅に減らしてくれます。
セットアップ手順は?
セットアップも非常に簡単です。
① レイヤーを追加する
Secrets ManagerやParameter StoreにアクセスしたいLambdaに「AWS Parameters and Secrets Lambda Extension」を追加します。レイヤーを追加する画面で[ARNを指定]を選択し、以下のARNを入力します。※ ARNの詳しい情報に関してはこちらの情報を参照してください。
arn:aws:lambda:ap-northeast-1:133490724326:layer:AWS-Parameters-and-Secrets-Lambda-Extension:12
② LambdaコードからローカルHTTPエンドポイントにアクセス
「AWS Parameters and Secrets Lambda Extension」を追加したLambdaからAWS内のローカルHTTPエンドポイントへアクセスします。以下はParameter Storeの値をローカルHTTPエンドポイント経由で取得する例になります。見ての通りリクエスト先は「localhost:2773」となっておりAWS内部のローカルエンドポイントにアクセスしています。1点実装上での注意は「AWS_SESSION_TOKEN」という環境変数の値をリクエストのヘッダーに付与している点です。ではこの環境変数がどこから来ているのか?答えとしては「これは実行中のすべての関数に対して Lambda によって提供される」になります。言い換えると、Lambdaが内部的に保持している環境変数で開発者側で別途Lambdaに設定する必要はないということです。
import urllib.request
import os
import json
aws_session_token = os.environ.get('AWS_SESSION_TOKEN')
def lambda_handler(event, context):
# Retrieve /my/parameter from Parameter Store using extension cache
req = urllib.request.Request('http://localhost:2773/systemsmanager/parameters/get?name=%2Fmy%2Fparameter')
req.add_header('X-Aws-Parameters-Secrets-Token', aws_session_token)
config = urllib.request.urlopen(req).read()
return json.loads(config)
参考:AWS Lambda 関数での Parameter Store パラメーターの使用
まとめ
今回紹介した「AWS Parameters and Secrets Lambda Extension」は導入が簡単であるにもかからずとても強力な拡張機能になり、従来よりも高速で簡単、かつセキュアにパラメータやシークレットを取得できます。これからLambdaからSecrets ManagerやParameter Storeから値を取得する際にはぜひこの拡張機能を使ってもらえたらと思います。