AWS Secrets Managerで管理しているAPIキーを取得する方法
はじめに
現在、個人開発しているWebアプリでAWS LambdaからLINE通知を送る処理を実装中です。 LINE通知するにはLINE Notify APIのアクセストークンが必要で、今まで環境変数にAPIのアクセストークンを設定していました。ですが、今回はせっかくAWSに乗っかっているので、AWS Secrets ManagerでAPIのアクセストークンを管理することにしました。
AWS Secrets ManagerへAPIのアクセストークンを登録
AWS Secrets Managerでシークレットの新規作成をします。
今回は事前に取得したLINE Notify APIのアクセストークンを登録するので、「その他のシークレット」を選択します。
今回はLINE通知するため、シークレット名をLINE_NOTIFY
にしました。
ローテーションの設定は何も設定せずに次へをクリック
アクセストークンの登録が完了すると画面下部にサンプルコードが表示されます。基本的にはこのコードを使えばAWS Secrets Managerに登録したAPIのアクセストークンを取得できるみたいです。
今回はPythonで実装しているためPythonのサンプルコードを利用したいと思います。
# Use this code snippet in your app.
# If you need more information about configurations
# or implementing the sample code, visit the AWS docs:
# https://aws.amazon.com/developer/language/python/
import boto3
from botocore.exceptions import ClientError
def get_secret():
secret_name = "LINE_NOTIFY"
region_name = "ap-northeast-1"
# 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
secret = get_secret_value_response['SecretString']
# Your code goes here.
サンプルコードを実行して取得結果の中身を確認してみた
上記のサンプルコードを確認するとsecret
という変数にAWS Secrets Managerからの取得結果が入ってるみたいなので、実際にサンプルコードを実行してsecret
変数の中身を確認してみました。
{'LINE_NOTIFY_ACCESS_TOKEN': 'XXXXXXXXXX'}
ちゃんと登録したLINE Notify APIのアクセストークンが取得できていることを確認できました。
あとはsecret
変数からkeyを指定してしてアクセストークンの文字列を取得すればいいだけかと思いましたが、実はこのsecret
変数は辞書型ではなく文字列型であることが判明したので、このままではkeyを指定してもAPIのアクセストークンが取得できません。
そのため、secret
変数を文字列型から辞書型にキャストする必要があります。
取得結果を文字列型から辞書型にキャスト
- 文字列型から辞書型に変換するために
json
ライブラリをインポート。 - AWS Secrets Managerからの取得結果をjson.loads()メソッドで文字列型から辞書型に変換。
- keyを指定してLINE Notify APIのアクセストークを取得
これでアクセストークンを取得できるので、LINE Notify APIを使ったLINE通知処理が実装できそうです。
# Use this code snippet in your app.
# If you need more information about configurations
# or implementing the sample code, visit the AWS docs:
# https://aws.amazon.com/developer/language/python/
import json
import boto3
from botocore.exceptions import ClientError
def get_secret():
secret_name = "LINE_NOTIFY"
region_name = "ap-northeast-1"
# Create a Secrets Manager client
session = boto3.session.Session()
client = session.client(
service_name='secretsmanager',
region_name=region_name
)
try:
get_secret_value_response: dict[str] = 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
# AWS Secrets Managerからの取得結果を文字列型から辞書型にキャスト
secret: dict = json.loads(get_secret_value_response['SecretString'])
# LINE Notify APIのアクセストークンを表示
print(secret["LINE_NOTIFY_ACCESS_TOKEN"])
# Your code goes here.
get_secret()
最後に
これでAWS Secrets Managerで管理しているAPIのアクセストークンを取得できました。もしよかったら参考にしてみてください!
Discussion