Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
8
Help us understand the problem. What are the problem?

posted at

updated at

AWS AppConfig Lambda extensionでLambda関数の設定情報を取得する

はじめに

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のプロキシーの役割を果たします。

AppConfig extensionの動作

  1. AWS AppConfig Lambda extensionをLambda関数のLayerとして構成します。

  2. extensionはGetConfigurationリクエストをLambda関数から受け取り、ローカルキャッシュをチェックします。ローカルキャッシュの実態はローカルのHTTPサーバーです。

  3. キャッシュが空なのでextensionはSDKコールの処理を実行してAWS AppConfigサービスを呼び出します。

  4. サービスから設定情報を取得し、extensionは取得した設定情報をローカルキャッシュに保存した上で、Lambda関数に結果を返します。

  5. 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]ボタンをクリックします。
Lambda関数の作成

Create functionのページで以下を実施します。

  • [Author from scratch]を選択
  • Function nameに任意の名前を入力
  • RuntimeにPython 3.8を選択
  • [Create function]ボタンをクリック

Lambda関数の作成入力

Lambda Layerの追加

AWS AppConfig Lambda extensionはLambda Layerとして実行されます。Lambda関数がextensionを利用するためにLayerを追加します。作成したLambda関数のLambda ConfigurationタブでLayerを選択し、[Add a layer]ボタンをクリックします。
Layerの追加

App layerのページで以下を実施します。

Layerの追加入力

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を選択します。

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]ボタンをクリック

設定プロファイルの作成入力1
設定プロファイルの作成入力2
設定プロファイルの作成入力3

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関数を実行し出力結果を確認します。

Test実施1
Test実施2

アプリケーション設定情報を変更し反映されることを確認

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秒なので値が更新されていない場合は少し待って再度実行してください。

Functions_-_Lambda28.png

まとめ

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関数を開発される開発者の皆さんにとって役立つものとなれば幸いです。

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
8
Help us understand the problem. What are the problem?