📝

AWS Secrets Manager のキャッシュコンポーネント aws-secretsmanager-caching を使ってみた

に公開

Python とクライアント側のキャッシュを使用して、Secrets Manager のシークレット値を取得する - AWS Secrets Manager

シークレットを取得するときに、Secrets Manager の Python ベースのキャッシュコンポーネントを使用して、将来使用するためにキャッシュすることができます。

Python 用のキャッシュコンポーネントを使ってみました。

1. シークレットの作成

以下の設定で作成しました。

  • シークレット名: mysecret
  • シークレットタイプ: その他のシークレットのタイプ
  • シークレットの値
    • シークレットキー: username
    • シークレットの値: testuser

上記以外はデフォルト設定です。

2. EC2 インスタンスの作成

以下の設定で作成しました。

  • AMI: Amazon Linux 2023
  • ネットワーク
    • デフォルト VPC
    • デフォルトサブネット
    • セキュリティグループ: インバウンド、アウトバウンドすべて開放
  • キーペア: なし
    • インスタンスコネクトで接続します
  • IAM インスタンスプロファイル: AdministratorAccess 権限を付与した IAM ロール

3. EC2 インスタンス内での設定

インスタンスコネクトで SSH 接続してコマンドを実行します。

$ sudo yum update -y
$ sudo yum install -y python3 python3-pip
$ pip3 install boto3 aws-secretsmanager-caching

$ cat > test_secrets_cache.py << 'EOF'
import botocore.session
from aws_secretsmanager_caching import SecretCache, SecretCacheConfig
import time

client = botocore.session.get_session().create_client('secretsmanager', region_name='ap-northeast-1')
cache_config = SecretCacheConfig()
cache = SecretCache(config=cache_config, client=client)

def get_secret_with_cache(secret_name, run_number):
    start_time = time.time()
    
    try:
        secret = cache.get_secret_string(secret_name)
        end_time = time.time()
        execution_time = (end_time - start_time) * 1000
        
        print(f"実行 {run_number}: 成功 | 実行時間: {execution_time:.2f}ms")
        return execution_time
    except Exception as e:
        print(f"実行 {run_number}: エラー | {str(e)}")
        return None

if __name__ == "__main__":
    secret_name = 'mysecret'
    
    print("=" * 50)
    print("Secrets Manager キャッシュ動作確認")
    print("=" * 50)
    print(f"シークレット名: {secret_name}\n")

    for i in range(1, 6):
        get_secret_with_cache(secret_name, i)
        time.sleep(0.5)  # 0.5 秒待機
    
    print("\n" + "=" * 50)
    print("※ 1 回目は遅く、2 回目以降は速いはずです")
    print("=" * 50)
EOF

4. 動作確認

$ python3 test_secrets_cache.py

==================================================
Secrets Manager キャッシュ動作確認
==================================================
シークレット名: mysecret

実行 1: 成功 | 実行時間: 99.39ms
実行 2: 成功 | 実行時間: 0.22ms
実行 3: 成功 | 実行時間: 0.22ms
実行 4: 成功 | 実行時間: 0.22ms
実行 5: 成功 | 実行時間: 0.23ms

==================================================
 1 回目は遅く、2 回目以降は速いはずです
==================================================

2 回目以降は実行時間が短くなっていることを確認できました。
また、CloudTrail には 1 回のみ GetSecretValue が記録されていたため、2 回目以降はキャッシュが利用されていることも確認できました。

まとめ

今回は AWS Secrets Manager のキャッシュコンポーネント aws-secretsmanager-caching を使ってみました。
どなたかの参考になれば幸いです。

参考資料

Discussion