🐧
Serveless Frameworkのサービスで、AWS SSMのパラメータストアからクレデンシャル情報を取得する
はじめに
こんにちは、クラスメソッド AWS事業本部の筧です。
Serverless Framework を使ったサービス開発をする中で、AWS Systems Manager(以降、SSM)のパラメータストアに保存したクレデンシャル情報を参照する場合があります。今回はこちらの方法をご紹介します。
実装
パラメータの作成
SSM のパラメータストアに/hello/SAMPLE_KEY
という名前のパラメータを作成します。Serverless Framework の Lambda から呼び出すとhoge
という文字列が返る想定です。
serverless.ymlの記述
serverless.yml には以下のコードを記述します。
- IAM ロールの許可設定
-
provider.iamRoleStatements
でssm:GetParameter
を許可 -
Resource
はサービスに応じて適切に制限してください
-
- Lambda の環境変数に作成したパラメータ名を設定
-
functions.{関数名}.environment
に記述
-
serverless.yml(抜粋)
service: test-sls
frameworkVersion: "2"
provider:
name: aws
runtime: python3.9
lambdaHashingVersion: 20201221
stage: ${opt:stage, 'dev'}
region: ${opt:region, "ap-northeast-1"}
memorySize: 256
timeout: 30
iamRoleStatements:
- Effect: "Allow"
Action:
- "ssm:GetParameter"
- "sts:AssumeRole"
Resource:
- "*"
functions:
hello:
handler: src/handlers/handler.hello
environment:
SAMPLE_KEY: /hello/SAMPLE_KEY
Lambdaの記述
fetch_ssm_param関数を利用することで、SSM パラメータから情報を取得します。引数の param_name
には serverless.yml で設定した環境変数名を入れてください。
src/handlers/handler.py
import logging
import os
from typing import Optional
import boto3
logger = logging.getLogger()
logger.setLevel(logging.INFO)
TOKYO = "ap-northeast-1"
def fetch_ssm_param(param_name: str) -> Optional[str]:
ssm = boto3.client("ssm", region_name=TOKYO)
resp = ssm.get_parameter(Name=param_name)["Parameter"]["Value"]
return resp
def hello(event, context):
SAMPLE_KEY = fetch_ssm_param(os.environ["SAMPLE_KEY"])
response = {"statusCode": 200}
return response
あとがき
セキュリティリスクをなくすためにも、クレデンシャル情報は適切に管理しましょう!
AWS Secrets Manager を使用した方法についても過去ブログを書いているのでご紹介しておきます。
それではまた!
Discussion