🔏

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