Slide 1

Slide 1 text

Lambda関数からExtensions APIを通して ParameterStoreのSecureString を取得してみた 2022/10/26 高木 建太朗 @frommiddle1 1

Slide 2

Slide 2 text

目次 • 背景と目的 • ことはじめ • Lambdaからのパラメータ取得方法を考えてみる • パラメータストアから情報を取得する(従来) • Lambda Extension • 実際に実装してみた • まとめと気になること 2

Slide 3

Slide 3 text

背景と目的 • この資料は、以下のアナウンスを試してみることが目的です。 Announcing AWS Parameters and Secrets Lambda Extension (Posted On: Oct 18, 2022) (https://aws.amazon.com/jp/about-aws/whats-new/2022/10/aws-parameters-secrets-lambda-extension/) • 面白そうな機能で新しいアナウンスなので実施報告に価値があると思いきや… 1. AWS Parameters and Secrets Lambda Extension つかってみた(10/19) https://qiita.com/hayao_k/items/a0b547a901a69e8118f7 2. [アップデート] Lambdaから直接Parameter Store/Secrets Managerから値を取得できるようになりました!(10/20) https://dev.classmethod.jp/articles/lambda-get-paramater/ 3. AWS Parameters and Secrets Lambda Extensionのパフォーマンスへの影響を確認してみた(10/21) https://dev.classmethod.jp/articles/aws-parameters-and-secrets-lambda-extension-performance/ # AWS界隈のアウトプットは早すぎて舌を巻きますね • N番煎じネタですがご容赦ください… 3

Slide 4

Slide 4 text

トヨタ自動車は2022年10月7日、テレマティクスサービス「T- Connect」の契約者29万6019人分の個人情報が漏洩した可能性があ ると発表した。同サービスのソースコードの一部がソースコード共有 サービス「GitHub」上に誤って公開され、T-Connectのデータを格 納するサーバーにアクセスできる状態になっていた。 漏洩した可能性があるのはメールアドレスと顧客管理番号。現時点 で不正利用は確認されていないという。氏名や電話番号、クレジット カードなどの情報については漏洩の可能性はないとしている。 ことはじめ 最近のインシデントからインパクトが大きかったものを抜粋 想像するにアプリケーションのソースに種々の認証情報などが バインドされていた? 4 https://xtech.nikkei.com/atcl/nxt/news/18/13882/

Slide 5

Slide 5 text

Lambdaからのパラメータ取得方法を考えてみる • Lambda関数コードでパラメータを扱う方法は何通りかある。 方法 リソース 暗号化 結合具合 コードに埋め込む Lambdaのみでよい できない コードと密に結合 環境変数 Lambdaのみでよい AWS KMS key or カスタマー管理のキーで 暗号化可能 コードとは切り離されて いるが、Lambda関数に紐 づく AWS Systems Manager Parameter Store or AWS Secrets Manager Lambda以外に 別途リソースが必要 AWS KMS key or カスタマー管理のキーで 暗号化可能 コードからもLambdaから も独立して扱える • 表内の赤字がLambda関数からパラメータを外だしするメリット。 • ここではパラメータストアに着目して話を進める 5

Slide 6

Slide 6 text

パラメータストアから情報を取得する(従来) • Lambda関数に権限設定し、SDKを利用するとパラメータを取得可能 AWS Systems Manager Parameter Store AWS Lambda SDK Lambda function Role AWS Identity and Access Management (IAM) AWS Key Management Service (AWS KMS) 取得 暗号化 認可 "Effect": "Allow", "Action": [ "kms:Decrypt", "ssm:GetParameter" ] import boto3 ssm = boto3.client('ssm', region) response = ssm.get_parameter( Name=key, WithDecryption=True, ) 複合化 6

Slide 7

Slide 7 text

パラメータストアから情報を取得する(従来) • 暗号化したパラメータ取得には1万回取得毎に約0.08USD必要 AWS Systems Manager Parameter Store AWS Lambda SDK Lambda function Role AWS Identity and Access Management (IAM) AWS Key Management Service (AWS KMS) 取得 暗号化 認可 "Effect": "Allow", "Action": [ "kms:Decrypt", "ssm:GetParameter" ] import boto3 ssm = boto3.client('ssm', region) response = ssm.get_parameter( Name=key, WithDecryption=True, ) 複合化 1 万回ごとに 0.05 USD 1万回ごとに0.03USD 7

Slide 8

Slide 8 text

パラメータストアから情報を取得する(従来) • パラメータをLambdaでキャッシュできれば料金低下が可能となる AWS Systems Manager Parameter Store AWS Lambda SDK Lambda function Role AWS Identity and Access Management (IAM) AWS Key Management Service (AWS KMS) 取得 暗号化 認可 "Effect": "Allow", "Action": [ "kms:Decrypt", "ssm:GetParameter" ] import boto3 ssm = boto3.client('ssm', region) response = ssm.get_parameter( Name=key, WithDecryption=True, ) 複合化 1 万回ごとに 0.05 USD 1万回ごとに0.03USD 8

Slide 9

Slide 9 text

AWS Parameters and Secrets Lambda Extension • Lambda Extension の1種。 • AWS Parameters and Secrets Lambda Extension を利用するとLambda 側でパラメータストアから取得した値をキャッシュしてくれる。 • キャッシュでAPIコール数や、パラメータ再取得時間の削減が期待 できる。 • そもそもLambda Extensionとはなんでしょうか…? 9

Slide 10

Slide 10 text

Lambda Extension • Lambdaの実行環境で独立したプロセス(やスレッド)で動作して Lambda関数を拡張する機構。 • Parameters and Secrets Lambda Extensionにおいては、 Lambda関数からExtension間はHTTPによりリクエストします。 Ref) https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/runtimes-extensions-api.html AWS Systems Manager Parameter Store 取得/ キャッシュ HTTP 10

Slide 11

Slide 11 text

実際に実装してみた(パラメータ用意) • Parameter StoreにKMSで暗号化したSecureStringを作成 This is encrypted value for Jaws-UG. (この文字列が取得できればOK) 11

Slide 12

Slide 12 text

実際に実装してみた(Lambda関数) • Lambda関数のコード(Python)は以下 import json import os import requests end_point = 'http://localhost:2773' path = '/systemsmanager/parameters/get/?name=/encrypt/key&withDecryption=true' def lambda_handler(event, context): url = '{}{}'.format(end_point,path) headers = { 'X-Aws-Parameters-Secrets-Token': os.environ['AWS_SESSION_TOKEN'] } r = requests.get(url,headers=headers) ret_json = json.loads(r.text) print("My Parameter : {}".format(ret_json["Parameter"]["Value"])) 12

Slide 13

Slide 13 text

実際に実装してみた(Lambda Layer) • AWS Parameters and Secrets Lambda Extension はLayerとして登録 13

Slide 14

Slide 14 text

実際に実装してみた(Lambda Layer) • AWS Parameters and Secrets Lambda Extension はLayerとして登録します。 14

Slide 15

Slide 15 text

実行結果 Function Logs [AWS Parameters and Secrets Lambda Extension] 2022/10/25 16:03:32 PARAMETERS_SECRETS_EXTENSION_LOG_LEVEL is not present. Log level set to info. [AWS Parameters and Secrets Lambda Extension] 2022/10/25 16:03:32 INFO Systems Manager Parameter Store and Secrets Manager Lambda Extension 1.0.94 [AWS Parameters and Secrets Lambda Extension] 2022/10/25 16:03:32 INFO Serving on port 2773 EXTENSION Name: AWSParametersAndSecretsLambdaExtension State: Ready Events: [INVOKE,SHUTDOWN] START RequestId: cd17720e-ddd7-450c-9fae-b99d9148c30d Version: $LATEST [AWS Parameters and Secrets Lambda Extension] 2022/10/25 16:03:32 INFO ready to serve traffic My Parameter : This is encrypted value for Jaws-UG. END RequestId: cd17720e-ddd7-450c-9fae-b99d9148c30d REPORT RequestId: cd17720e-ddd7-450c-9fae-b99d9148c30d Duration: 587.36 ms Billed Duration: 588 ms Memory Size: 128 MB Max Memory Used: 65 MB Init Duration: 271.40 ms • 無事Lambda Extensionから値を取得することができました。 15

Slide 16

Slide 16 text

まとめ • AWS Parameters and Secrets Lambda Extensionの説明を行いました。 • AWS Parameters and Secrets Lambda Extensionを利用してLambda関 数からParameter Store のSecureStringを取得することができました。 気になること • HTTPリクエストやキャッシュ有無の確認などのオーバーヘッドでパ フォーマンスでないのでは? • そもそもLambda関数のメモリ内でキャッシュした方がいいのでは? ⇒上記2つにはクラメソさんがブログをUPしてくれています。 気になる方は参考にしてみてください。 # AWS Parameters and Secrets Lambda Extensionのパフォーマンスへの影響を確認してみた 16