🐧

Serveless Frameworkのサービスで、AWS SSMのパラメータストアからクレデンシャル情報を取得する

2022/01/14に公開

はじめに

こんにちは、クラスメソッド AWS事業本部の筧です。

Serverless Framework を使ったサービス開発をする中で、AWS Systems Manager(以降、SSM)のパラメータストアに保存したクレデンシャル情報を参照する場合があります。今回はこちらの方法をご紹介します。

実装

パラメータの作成

SSM のパラメータストアに/hello/SAMPLE_KEYという名前のパラメータを作成します。Serverless Framework の Lambda から呼び出すとhogeという文字列が返る想定です。

serverless.ymlの記述

serverless.yml には以下のコードを記述します。

  • IAM ロールの許可設定
    • provider.iamRoleStatementsssm: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 を使用した方法についても過去ブログを書いているのでご紹介しておきます。

https://dev.classmethod.jp/articles/serverless-framework-lambdafunc-secretsmanager/

それではまた!

Discussion