Storeとはまとめ参考サイトはじめにこんにちは。データサイエンスチームのmotchieです。2018の11日目の記事です。先日、ラスベガスで開催されたre:Invent2018に参加してきました。イベントの規模の大きさと怒涛の新サービス発表、そしてホテルの朝食・昼食の美味しさに感動しました。ベネチアンのメキシコ料理、来年もぜひ食べに行きたいです......。ご飯だけでなく、セッションやワークショップにも参加してきました。セッションの中から、特に使ってみたいと感じたLambdaのtipsをご紹介します。Storeを使った設定情報の管理と、Lambdaの環境変数による環境の切り替えについて、実際の実装方法にも触れつつ、詳しく見ていきたいと思います。セッションは、スライドと動画が公開されています。セッション全体の内容が気になる方は、ぜひこちらも見てみてください。Servicesセッションでは、Lambda関数の実装や実行環境に関して、様々なtipsが挙げられていました。(SRV401-R2)のスライドp71において、全体のtipsがまとめられています。この記事では主に、Functionのtipsの上から3つ目、シークレット情報の扱いについて、詳しくご紹介したいと思います。Storeこの記事の内容この記事では、セッションの内容を紹介しつつ、tipsにしたがって実際のコードを修正していく中で、デプロイ環境ごとに、関数の設定を動的に切り替える設定情報やシークレットの値を一元管理し、複数の関数で値を共有するといった方法を具体的にご紹介できればと思います。記事の流れは以下の通りです。Store:複数の関数からアクセスする設定・シークレットの値を一元管理するLambdaのBlueprint:Slackへのアラート通知アプリについてLambdaでは関数の作成支援のため、事前設定されたコードのテンプレートがBlueprintとして公開されています。この記事では、Lambdaのcloudwatch-alarm-to-slack-python3というBlueprintをベースに、紹介するLambdaのtipsによって、このコードがどのように修正できるのか、見ていきたいと思います。Blueprintを使ってCloudWatchのアラートをSlackに通知するには、以下の手順が必要になります。URLの値は後で必要なのでコピーしておく。この記事では、Lambda実装のtipsの紹介が目的なため、各リソースのセットアップ手順については詳しく触れません。詳細を知りたい場合には各自でご確認をお願いします。それでは、セッションのtipsに従って、Lambda関数の中身を変更してみたいと思います。Lambdaの環境変数:デプロイ環境ごとに設定を切り替えるLambdaでは、key-valueの形式で関数ごとに環境変数を設定することが出来ます。セッションでは、Lambdaの環境変数を使って、デプロイ環境(Dev/Test/Prod/etc)ごとに異なる設定情報を指定するというtipsが紹介されていました。DBの接続情報など、デプロイ環境によって異なる値を環境変数から取得することで、デプロイ環境ごとに関数のコードを書き換える必要がなくなります。Service(KMS)によって暗号化することが可能です。して環境変数に登録して使用しています。KMSによる暗号化は、Lambdaのマネジメントコンソール上で簡単に行うことが出来ます(暗号化の設定->伝送中の暗号化のためのヘルパーの有効化->暗号化ボタンで環境変数を暗号化)。同じ設定情報を複数のLambdaで使う場合は、上記の方法では、Lambda関数の数だけ同じ環境変数を設定する必要があります。変数の値を後から変更する場合、関数の数だけ修正が必要になり、管理が大変です。Storeで管理することがオススメされていました。Storeで一元管理する形に変更し、複数のLambda関数から設定情報にアクセスできるようにしてみたいと思います。Storeは、設定データや機密データを安全に一元管理するためのストレージです。パスワード、データベース文字列、ライセンスコードなど、設定情報・シークレットの値を、パラメータ値として保存することができます。パラメータの値は、KMSを使って暗号化して保存することが出来ます。)を使用してパスを区切ることで、パラメータに階層構造を持たせることが出来ます。これらによって、パラメータのセキュアな管理とアクセス権限の制御が行いやすいという利点があります。Storeで管理することが出来ます。PowerShell、マネジメントコンソールを使って行うことが出来ます。CLIの場合、以下のようなコマンドになります。LambdaのBlueprintに従い、ChannelNameは平文で、HookUrlは暗号化して格納しています。部分で暗号化を指定しています。SecureString暗号化に用いる鍵(CMK)を指定しない場合、自動的に作成されるデフォルトのCMK(aws/ssm)が使用されます。パラメータの作成・確認は、マネジメントコンソール上でも行うことが出来ます。パラメータの取得・値の復号化のための権限をLambdaに付与する必要があります。新しくIAMロールを作成し、ポリシーを指定します。下記の例は、パラメータを東京リージョン(ap-northeast-1)で作成し、暗号化にデフォルトのCMKを使い、本番環境(/Prod)のパラメータにアクセスする場合のIAMポリシーになります。値は自身のAWSアカウントIDの値に置き換えてください。始まるリソースにだけに制限しています。このように、パラメータ名に階層構造を持たせることで、デプロイ環境やアプリケーションによって、シークレットのアクセス権限を制御しやすいというメリットがあります。Storeにアクセスする際、sts:AssumeRoleの許可が必要になります。slackChannelとkmsEncryptedHookUrlは削除した上で、関数を作成します。関数のコードの内容を以下のように変更します。Storeからこれらの値を取得するようにしています(21-34行目、36-44行目)。Storeで一括して行うことが出来ます。Storeのパラメータ名を登録しておきます。Storeから取得することができ、デプロイ環境ごとにコードを書き換える必要がなくなります。Storeにて、デプロイ環境ごとにパスを階層化し、KMSで暗号化して、作成・管理する。Storeから取得し、処理に用いる。いう形にすることで、複数のLambda関数でのシークレットの値の共有、設定情報やシークレットの値の一元管理、デプロイ環境ごとの関数の設定切り替えを行うことが出来ます。Storeを使った設定情報・シークレット情報の一元管理の方法についてご紹介しました。皆さんもぜひ試してみてください。re:Invent#Python#セキュリティmotchie2017年4月、NHNテコラスに新卒入社。データサイエンスチームに所属し、AWSを活用したデータ分析サービスの設計開発を担当。注力分野は自然言語処理、好きなAWSサービスはEMR、SageMaker。