はじめに
Githubから流出したソースコードに認証情報が含まれていて
問題になったというセキュリティーインシデントを見かけることがあります。
ソースコード内には認証情報をベタ書きせずに扱う事が大切です。
Lambdaで認証情報を参照したい時のベストプラクティスとして
SecretsManagerから値を取得する方法があります。
ハンズオンとして行ってみたので記事に残したいと思います。
環境
Lambdaのランタイム:Python3.9
SecretsManagerでシークレット情報を作成する
SecretsManagerでは目的に応じたシークレット情報の作成が可能です。
今回は汎用的に使用できるように「その他のシークレットタイプ」でユーザー名とパスワードを作成しました。
作成したいシークレットを保存するときにサンプルコードを取得することができます。
こちらのコードを参考にLambdaで値を参照していきます。
Lambdaでシークレット情報を参照する
実際にLambdaからシークレット情報を取得してみましょう。
ランタイム Python3.9を作成します。
ソースコードに先ほどのサンプルを例にしたコードを記載します
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表示できていることが確認できました!
このように値を取得することでデータベースや外部APIへのアクセスに利用出来ます。
解説
get_secret_value_response['SecretString']でSecretsManagerのシークレット情報にアクセスできます。
辞書形式のデータですが肝心の値の箇所が文字列になっていてそのままではアクセスが難しいです。
{'SecretString': '{"name":"hoge","pw":"fuga"}'
文字列を辞書型に変換する ast モジュールの literal_eval をつかうことで辞書として値に簡単にアクセスできます。
おわりに
クラウドネイティブな開発として大変便利だなと思いました。
どなたかの参考になれば幸いです。