#はじめに
AWS Lambda extensionsのプレビューが発表されました。それに伴い、AWS AppConfigから利用可能なextensionが提供されLambda関数から利用することができます。本稿ではAWS AppConfig Lambda extensionをLambda関数から利用する方法について紹介します。
#AWS AppConfigとは
AWS AppConfigはAWS Systems Managerの機能の1つで、アプリケーション設定を作成、管理し、デプロイを可能にするサービスです。アプリケーションはAWS AppConfigのAPIをコールすることで、アプリケーション自体の再デプロイを行うことなく、外部設定を動的にデプロイすることができるようになります。また、AWS AppConfigは検証機能を提供しており、全ての設定変更について、アプリケーションに投入する前に安全にテストを行うことができます。AWS AppConfigについての詳細はAWS AppConfig ユーザーガイドをご覧ください。
#AWS AppConfig Lambda extensionの動作
AWS AppConfig Lambda extensionの動作について説明します。AWS AppConfig Lambda extensionは、Lambda関数から見てAWS AppConfigのプロキシーの役割を果たします。
-
AWS AppConfig Lambda extensionをLambda関数のLayerとして構成します。
-
extensionはGetConfigurationリクエストをLambda関数から受け取り、ローカルキャッシュをチェックします。ローカルキャッシュの実態はローカルのHTTPサーバーです。
-
キャッシュが空なのでextensionはSDKコールの処理を実行してAWS AppConfigサービスを呼び出します。
-
サービスから設定情報を取得し、extensionは取得した設定情報をローカルキャッシュに保存した上で、Lambda関数に結果を返します。
-
extensionは後続のGetConfigurationへの呼び出しに対してローカルキャッシュの値を返します。AWS AppConfig Lambda extensionは設定情報のキャッシングと更新を管理し、Lambdaハンドラ実行をまたがって設定情報を保持します。設定情報が要求されると、Lambdaハンドラは
AWS AppConfigサービスを呼び出す代わりにAWS AppConfig Lambda extensionに対してリクエストを発行します。設定情報はローカルにキャッシュされているので、より高速にリターンし、AWS LambdaとAWS AppConfigのコストを削減することができます。
次にLambda関数が実行されたときに、extensionはAWS AppConfigから設定情報を取得してからの経過時間をチェックします。もし経過時間がポーリングの間隔よりも長ければ、extensionは最新の設定情報をAWS AppConfigから取得し、キャッシュを更新します。
AWS AppConfig Lambda extension自体に対する動作の設定はLambda関数に定義する以下の環境変数で行います。
環境変数 | 詳細 | デフォルト |
---|---|---|
AWS_APPCONFIG_EXTENSION_POLL_INTERVAL_SECONDS | extensionが設定情報を更新するためにAWS AppConfigをポーリングする間隔を秒数で指定 | 45 |
AWS_APPCONFIG_EXTENSION_POLL_TIMEOUT_MILLIS | extensionがキャッシュから設定情報を取得するときに待機する最大合計時間をミリ秒で指定 | 3000 |
AWS_APPCONFIG_EXTENSION_HTTP_PORT | extensionが実行するローカルHTTPサーバーのポート番号 | 2772 |
#AWS AppConfig Lambda extensionの有効化
AWS AppConfig Lambda extensionを利用するにはLambda関数のLayerを追加し、LayerのARN(Amazon Resource Name)にAWS AppConfig Lambda extensionの対象リージョンのARNを指定します。AWS AppConfig Lambda extensionのリージョンごとのARNは以下のサイトで取得できます。
#AWS AppConfig Lambda extensionの利用手順
それでは具体的にAWS AppConfig Lambda extensionの利用手順を説明します。
Lambda関数の作成
まずはAWS AppConfig Lambda extensionを利用するLambda関数を作成します。
AWS Lambdaマネジメントコンソールで [Create function]ボタンをクリックします。
Create functionのページで以下を実施します。
- [Author from scratch]を選択
- Function nameに任意の名前を入力
- RuntimeにPython 3.8を選択
- [Create function]ボタンをクリック
###Lambda Layerの追加
AWS AppConfig Lambda extensionはLambda Layerとして実行されます。Lambda関数がextensionを利用するためにLayerを追加します。作成したLambda関数のLambda ConfigurationタブでLayerを選択し、[Add a layer]ボタンをクリックします。
App layerのページで以下を実施します。
- Specify an ARNを選択
- Adding the AWS AppConfig Lambda extension のサイトで対象リージョンのARNをコピーしSpecify an ARNに貼り付け
- [Add]ボタンをクリック
###Lambda実行ロールへ権限を追加
AWS AppConfig Lambda extensionがAWS AppConfigのGetConfiguration APIを呼び出すためにLambda関数の実行ロールにアクセス権限を追加する必要があります。そのため以下の手順でAWS AppConfigに対するアクセス権限を定義したポリシーを作成し、Lambda関数の実行ロールに作成したポリシーをアタッチします。
作成したLambda関数のPermissionsタブをクリックし、Execution roleのリンクをクリックします。
IAM RoleのSummaryのページで[Attach policies]をクリックします。
Add permissionsの画面で[Create policy]をクリックします。
AppConfigを選択します。
Actionsを開き、GetConfigurationをチェックします。
Resourceを開き、All resourceを選択して[Review policy]ボタンをクリックします。
Review PolicyのページでNameに任意のポリシー名を入力し[Create policy]ボタンをクリックします。
Add permissionsのページに戻ったら、作成したポリシーを選択し[Attach policy]ボタンをクリックします。
#Lambda関数の実装
次にLambda関数を実装します。LambdaマネジメントコンソールのFunction codeの内容を以下のサンプルソースで置き換えます。
import json
import urllib.request
import os
appConfigApplication = os.getenv("APPCONFIG_APPLICATION", "extension-demo-app")
appConfigEnvironment = os.getenv("APPCONFIG_ENVIRONMENT", "dev")
appConfigConfigProfile = os.getenv("APPCONFIG_CONFIGPROFILE", "demo-app-config")
def lambda_handler(event, context):
rate = int(get_winning_rate() * 100)
return f'current winning_rate {rate}%'
def get_winning_rate():
try:
url = f'http://localhost:2772/applications/{appConfigApplication}/environments/{appConfigEnvironment}/configurations/{appConfigConfigProfile}'
config = json.loads(urllib.request.urlopen(url).read())
print(config)
return config.get("winning_rate", 0)
except:
return 0
このLambda関数はアプリケーションの設定情報から当選確率を取得して返すだけのシンプルな処理ですが、AWS AppConfig Lambda extensionの使い方が理解できるかと思います。サンプルソースの中のget_winning_rate関数内の以下のコードがextensionのローカルHTTPサーバーを呼び出している部分になります。
url = f'http://localhost:2772/applications/{appConfigApplication}/environments/{appConfigEnvironment}/configurations/{appConfigConfigProfile}'
config = json.loads(urllib.request.urlopen(url).read())
###環境変数の登録
コードの再利用を容易にするためにLambda関数が利用する環境変数を追加します。環境変数にAppConfigの情報を設定することで、AppConfig Lambda extensionを利用するアプリケーションでコードをそのまま利用できます。AppConfig Lambda extensionのローカルHTTPサーバーのポートを変更するなどのextensionに対する設定が必要な場合は、上の表に示した環境変数も追加します。
#AWS AppConfigのアプリケーション設定情報の作成
それではアプリケーションの設定情報を保持するAWS AppConfigに設定情報を作成しましょう。AWS AppConfigはアプリケーションの設定情報をAmazon S3オブジェクト、AWS Systems Manager Document Storeのドキュメント、AWS Systems Manager Parameter Storeのパラメータ、AWS CodePipelineのソースとして保存することができますが、今回はAWS AppConfigのホストするストアに保存することにします。
AWS AppConfigのホストするストアには、YAML、JSON、テキストドキュメントが利用可能ですが、今回はJSONで設定情報を保存するようにします。
###AWS AppConfigのアプリケーション設定情報作成手順
AWS Systems Managerマネジメントコンソールの左側のペインでAppConfigを選択し、表示されたページの[Create application]ボタンをクリックします。
Create applicationのページで、NameとオプションでDescriptionを入力し[Create application]ボタンをクリックします。
次に作成したアプリケーションのページで[Create environment]ボタンをクリックします。
Create environmentのページで、NameとオプションのDescriptionを入力し[Create environment]ボタンをクリックします。
アプリケーションのページに戻り、[Configuration profile]タブをクリックし[Create configuration profile]ボタンをクリックします。
Build configuration profileのページで以下を実施します。
- Nameを入力
- オプションでDescriptionを入力
- Configuration sourceでAWS AppConfig hostedを選択
- ContentでJSONを選択し以下の値を入力
{
"winning_rate": 0.1
}
- [Next]ボタンをクリック
- Add ValidatorページでJSON Schemaを選択
- 以下のJSONスキーマを入力
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"winning_rate": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"winning_rate"
]
}
- [Create configuration profile]ボタンをクリック
###AWS AppConfigのアプリケーション設定情報をデプロイ
作成したアプリケーション設定情報をデプロイします。右上の[Start deployment]ボタンをクリックします。
Start deploymentページで以下を実施します。
- Environmentに作成した環境を指定
- Hosted configuration versionに1を指定
- Deployment strategyに[AppConfig.AllAtOnce(Quick)]を選択
- オプションでDeployment descriptionを入力
- [Start deployment]ボタンをクリック
デプロイが開始されます。
#設定情報の取得
Lambdaマネジメントコンソールに戻り、作成したLambda関数を選択します。[Test]ボタンをクリックし、最初に表示されるテスト用パラメータに任意の名前を入力し保存します。(このパラメータは利用しません)
[Test]ボタンをクリックしてLambda関数を実行し出力結果を確認します。
###アプリケーション設定情報を変更し反映されることを確認
AWS AppConfigマネジメントコンソールに戻り、作成したConfiguration Profileを選択し、Hosted configuration versionsで[Create]ボタンをクリックします。アプリケーション設定情報の新しいバージョンを作成し、パラメータの値を設定します。
ContentでJSONを選択し、パラメータの値を変更し、[Create hosted configuration version]ボタンをクリックします。
再度[Start deployment]をクリックしデプロイメントを再実行します。
AWS Lambdaマネジメントコンソールに戻り[Test]ボタンをクリックしてLambda関数を実行し結果を確認します。AWS AppConfig Lambda Extensionが設定情報を更新するためにAWS AppConfigをポーリングする間隔はデフォルトで45秒なので値が更新されていない場合は少し待って再度実行してください。
#まとめ
AWS Lambda extensionsのプレビュー発表に伴って利用可能となったAWS AppConfig Lambda extensionの利用方法を紹介しました。AWS AppConfig Lambda extensionを利用するメリットの一つとしてアプリケーション設定情報をLambda関数と独立してデプロイできることが挙げられます。例えばLambda関数の環境変数を変更した場合はLambda関数が再度デプロイされてコールドスタートとなりますが、AWS AppConfig Lambda extensionを利用することでコールドスタートすることなくアプリケーションの設定情報を更新することができます。
またAWS AppConfigを利用する場合、GetConfiguration APIの呼び出し、及びその結果取得する設定情報に対して利用料金が発生します。AWS AppConfig Lambda extensionは、アプリケーション設定情報をローカルにキャッシュすることでAPI呼び出しの頻度を抑え、かつキャッシュから値を返すことで、Lambda関数の処理速度も向上し、Lambda関数の実行時間に対する料金も抑える効果が期待できます。
本稿がLambda関数を開発される開発者の皆さんにとって役立つものとなれば幸いです。