Secrets Managerとは
AWS Secrets Managerは、データベースの認証情報、APIキー、その他の機密情報を安全に保存、管理するためのサービスです。
従来、秘密情報(シークレット)は、アプリケーションコードや設定ファイルにハードコードされることがあり、セキュリティ上問題があります。Secrets Managerは、このような機密情報を暗号化して安全に保存し、アクセス制御や自動更新を提供することで、機密データの管理を安全に扱うことが可能になります。
また、IAM(Identity and Access Management)と連携して、誰がどのシークレットにアクセスできるかを細かく制御できます。IAMユーザーやIAMロールに対して適切なアクセス権限を設定することで、特定のユーザーやアプリケーションだけがシークレットにアクセスできるようにし、不正なアクセスを防ぐことが可能です。
シークレットの設定
ここでは適当なAPIキーを保存するシナリオを想定し、設定を行います。
シークレットの作成
例として、OpenAIやAnthropicのAPIキーを保存すると仮定します。
まずはシークレットタイプを「その他のシークレットタイプ」にします。(DB情報などを保存したい場合は適宜ほかのオプションを選択します。)
キーと値のペアを作成したら、「次」を押します。

適当なシークレットの名前を決めます。「タグ」や「リソースのアクセス許可」などは今回は設定しないためスキップします。

自動ローテーションの有無を設定します。今回は設定しないこととします。
自動ローテーション機能は、データベースのパスワードやAPIキーなどのシークレットを定期的に自動で更新し、セキュリティを強化する仕組みです

これでシークレットの設定は完了です。
IAMの設定
設定は完了しましたが、セキュリティ上当然このままではアクセスできないようになっています。次は、IAMを設定して適切なユーザやロールに対してアクセスできるように設定します。
ここでは、最低限の権限としてシークレットの読み込み専用のIAMユーザを作成することとします。
IAMポリシーの作成
IAMの管理画面で、「アクセス管理」>「ポリシー」>「ポリシーの作成」からポリシーのエディタ(JSON)で次のような設定を書き込みます。
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"secretsmanager:GetSecretValue"
			],
			"Resource": [
				"*"
			]
		}
	]
}
IAMユーザの作成
先ほど作成したポリシーを適用するIAMユーザを作成します。(すでにIAMユーザを作成しており、そのユーザにポリシーをアタッチする場合はIAMユーザ作成する必要はありません。)

「ポリシーを直接アタッチする」で先ほど作成したポリシーを選択します。適宜「次」を押してIAMユーザを作成します。

これでSecrets Managerを利用準備が完了しました。
作成したIAMユーザのアクセスキーを取得し、コマンドラインなどでシークレットが取得できるかを確認します。
シークレットの取得
ここからは実際にSecrets Managerからシークレットを取得する手順を記載します。
AWS CLIでシークレットを取得
まず、上記で作成したIAMのアクセスキーを設定します。
aws configure
AWS Access Key ID [None]: 
AWS Secret Access Key [None]: 
Default region name [None]:
Default output format [None]:
下記のコマンドでシークレットを取得できます。
aws secretsmanager get-secret-value --secret-id arn:aws:secretsmanager:{Region}:{Account}:secret:{SecretId}
次のような返り値が取得できます。
{
    "ARN": "arn:aws:secretsmanager:{Region}:{Account}:secret:{SecretId}",
    "Name": "APIKEYS",
    "VersionId": "xxxxxxxxxxxxxxxxxx",
    "SecretString": "{\"openai\":\"YOUR_OPENAI_API_KEY\",\"anthropic\":\"YOUR_API_KEY\"}",
    "VersionStages": [
        "AWSCURRENT"
    ],
    "CreatedDate": "2024-09-18T22:00:25.472000+09:00"
}
Pythonでシークレット取得
AWS CLIで認証情報を保存しているパターン
認証している場合は下記コードで
import boto3
from botocore.exceptions import ClientError
def get_secret():
    secret_name = (
        "arn:aws:secretsmanager:{Region}:{Account}:secret:{SecretId}"
    )
    region_name = "your-region"
    # 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.
    print(secret)
def main():
    get_secret()
if __name__ == "__main__":
    main()
AWS CLI認証情報を保存していないパターン
import boto3
from botocore.exceptions import ClientError
def get_secret():
    aws_access_key_id = "your-aws-access-key-id"
    aws_secret_access_key = "your-aws-secret-access-key"
    region_name = "your-region"
    session = boto3.session.Session(
        aws_access_key_id=aws_access_key_id,
        aws_secret_access_key=aws_secret_access_key,
        region_name=region_name,
    )
    secret_name = "arn:aws:secretsmanager:{Region}:{Account}:secret:{SecretId}"
    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
    secret = get_secret_value_response["SecretString"]
    print(secret)
def main():
    get_secret()
if __name__ == "__main__":
    main()
まとめ
この記事ではAWS Secrets Managerを紹介しました。AWS Secrets Managerは、APIキーやデータベースの認証情報など、機密情報を安全に管理するためのサービスです。暗号化や自動ローテーション機能により、セキュリティリスクを最小化できます。また、IAMを使ったアクセス制御を組み合わせることで、特定のユーザーやアプリケーションのみがシークレットにアクセスできるように設定可能です。

 
					