LoginSignup
1
4

More than 1 year has passed since last update.

LambdaでSecretsManagerからシークレット情報を取得してみた

Last updated at Posted at 2022-09-15

はじめに

Githubから流出したソースコードに認証情報が含まれていて
問題になったというセキュリティーインシデントを見かけることがあります。
ソースコード内には認証情報をベタ書きせずに扱う事が大切です。

Lambdaで認証情報を参照したい時のベストプラクティスとして
SecretsManagerから値を取得する方法があります。
ハンズオンとして行ってみたので記事に残したいと思います。

環境

Lambdaのランタイム:Python3.9

SecretsManagerでシークレット情報を作成する

SecretsManagerでは目的に応じたシークレット情報の作成が可能です。
今回は汎用的に使用できるように「その他のシークレットタイプ」でユーザー名とパスワードを作成しました。

スクリーンショット 2022-09-15 20.31.42.png

作成したいシークレットを保存するときにサンプルコードを取得することができます。
スクリーンショット 2022-09-15 20.38.09.png

こちらのコードを参考にLambdaで値を参照していきます。

Lambdaでシークレット情報を参照する

実際にLambdaからシークレット情報を取得してみましょう。
ランタイム Python3.9を作成します。

スクリーンショット 2022-09-15 20.42.25.png

ソースコードに先ほどのサンプルを例にしたコードを記載します

import ast
import boto3
import base64
from botocore.exceptions import ClientError


def lambda_handler(event, context):

    secret_name = "SecretsManagerで作成したシークレットの名前"
    region_name = "SecretsManagerのリージョン"

    session = boto3.session.Session()
    client = session.client(
        service_name='secretsmanager',
        region_name=region_name
    )

    try:
        get_secret_value_response = client.get_secret_value(
            SecretId=secret_name
        )
        
    except ClientError as e:
            raise e
    else:
        if 'SecretString' in get_secret_value_response:
            secret_data = get_secret_value_response['SecretString']
            secret = ast.literal_eval(secret_data)
            name = secret['name']
            pw = secret['pw']
            print(f'name:{name},pw:{pw}')
        else:
            decoded_binary_secret = base64.b64decode(get_secret_value_response['SecretBinary'])
            

Deployできたらテストから実行してみます。
CloudWatchのロググループにある実行ログを確認すると無事に参照してprint表示できていることが確認できました!
スクリーンショット 2022-09-16 7.03.26.png
このように値を取得することでデータベースや外部APIへのアクセスに利用出来ます。

解説

get_secret_value_response['SecretString']でSecretsManagerのシークレット情報にアクセスできます。
辞書形式のデータですが肝心の値の箇所が文字列になっていてそのままではアクセスが難しいです。

{'SecretString': '{"name":"hoge","pw":"fuga"}'

文字列を辞書型に変換する ast モジュールの literal_eval をつかうことで辞書として値に簡単にアクセスできます。

おわりに

クラウドネイティブな開発として大変便利だなと思いました。
どなたかの参考になれば幸いです。

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4