この記事は、ニフティグループ Advent Calendar 2023 3日目の記事です。
はじめに
こんにちは。ニフティ株式会社の並木です。
今回は、Lambdaで「AWS Secrets Manager」を使う方法をご紹介いたします。
AWS Secrets Managerとは
AWSのサービスの一つで、APIキーなどの他人に知られては困る情報を管理してくれます。
LambdaでAPIを叩くにあたってAPIキーの設定が必要になったのですが、APIキーをハードコーディングせずに管理する方法はないかと考えていた時に、Secrets Managerの存在を知りました。
導入までの手順は大きく分けて以下の3つになります。
①シークレットを作成する
②シークレットにアクセスするためのリソースポリシーを追加する
③Lambdaでシークレットを使う
①シークレットを作成する
まずは、APIキーなどの隠したい情報をSecrets Managerに保存していきます。
公式ドキュメントはこちらです。
今回は、APIキーを保存するにあたり、以下の値を設定しました。
・シークレットのタイプ:「その他のシークレットのタイプ」を選択。
・キー:任意の名前。後にLambdaで情報を取り出す時にここで付けた名前を使います。
・値:隠したい情報。今回の場合はAPIキーを設定します。
・暗号化キー:「aws/secretsmanager」を選択。
「次」を押下すると、以下のページが出てきます。
・シークレットの名前:任意の名前。後にLambdaで情報を取り出す時にここで付けた名前を使います。
・説明:シークレットの説明を書いておくことができます。日本語も使えました。
・リソースのアクセス許可:このタイミングでも設定可能ですが、今回は「②シークレットにアクセスするためのリソースポリシーを追加する」で設定するので飛ばします。
さらに「次」を押下すると、シークレットの自動ローテーションの設定ページが出てきます。
今回は設定せずにそのまま「次へ」を押下します。(後から設定することも可能です)
これでシークレットの作成は完了です!
②シークレットにアクセスするためのリソースポリシーを追加する
①で作成したシークレットをLambdaで呼び出すためには、リソースポリシーの追加が必要になります。
そのためには「Lambdaの実行ロールのARN」が必要となるので、まずはそちらを取得していきます。
Lambdaの管理画面のアクセス権限を表示します。
ロール名のリンクを押下すると、Lambdaの実行ロールの管理画面に飛びます。
Lambdaの実行ロールの管理画面に記載されているARNをメモしておきます。
これで「Lambdaの実行ロールのARN」が取得できました!
次に、①で作成したシークレットの管理画面を表示し、「許可を編集」を押下します。
公式ドキュメントに記載されている以下の「mypolicy.json」の定義をコピーして使います。
ARN部分のみ、先ほど取得してきた「Lambdaの実行ロールのARN」に置き換えて保存します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:role/MyRole" }, "Action": "secretsmanager:GetSecretValue", "Resource": "*" } ] } |
これでリソースポリシーの追加は完了です!
③Lambdaでシークレットを使う
Lambdaでシークレットを使うには、レイヤーの追加が必要になります。
「AWS Parameters and Secrets Lambda Extension」を選択し、「追加」を押下します。
シークレットを呼び出すためのコードをLambdaに書いていきます。
①で作成したシークレットの管理画面にサンプルコードが表示されているので、それを活用します。
言語がいくつか選択できますが、今回はPythonのサンプルコードを使用します。
サンプルコードをベースに、コードを書いてみました。
サンプルコードには「secret = get_secret_value_response[‘SecretString’]」までしか書かれていなかったため、その後どのようにして値を取り出せばよいのか分からず、個人的にはここで少し詰まりました。
「ast.literal_eval()」を使うと良いようです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
import ast import boto3 from botocore.exceptions import ClientError def get_secret(): secret_name = "①で設定したシークレットの名前" region_name = "リージョン名" # Create a Secrets Manager client 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: # For a list of exceptions thrown, see # https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html raise e # Decrypts secret using the associated KMS key. secret = get_secret_value_response['SecretString'] # Your code goes here. secret_list = ast.literal_eval(secret) value = secret_list['①で設定したキー'] |
おわりに
他人に知られては困る情報の管理や呼び出しが簡単にできて便利だと感じました。
ハードコーディングを防ぐためには欠かせないサービスだと思いますので、ぜひ利用してみてください。
明日は、nahiro_tusさんの「Notionの作図機能についてまとめる」です。 お楽しみに!