Boto3を使ってAWS Secrets Managerのバイナリ/暗号化形式のシークレットをプレーンテキストで取得する方法
課題
Pythonのboto3ライブラリを使用して、AWS Secrets Managerにバイナリ/暗号化形式で保存されているシークレットキーを、プレーンテキスト(平文)として取得する方法を解説します。
解決までの手順・アルゴリズム
ステップ1: 例外処理のために、boto3およびbotocore.exceptionsの例外クラスをインポートします。
ステップ2: シークレットが保存されている場所を示すsecret_stored_locationは必須パラメータです。
ステップ3: boto3ライブラリを使ってAWSセッションを作成します。デフォルトプロファイルにregion_nameが設定されているか確認してください。設定されていない場合は、セッション作成時に明示的にregion_nameを指定する必要があります。
ステップ4: secretmanager向けのAWSクライアントを作成します。
ステップ5: get_secret_valueを呼び出し、secret_stored_locationをSecretIdとして渡します。
ステップ6: 取得したレスポンスがプレーンテキスト(SecretString)か、暗号化されたバイナリ形式(SecretBinary)かを判定します。
ステップ7: バイナリ形式の場合は、base64.b64decodeを使ってデコードします。
ステップ8: 指定した場所に保存されたすべてのシークレットが、復号化されたプレーンテキストとして返されます。
ステップ9: 値の取得中に予期しない問題が発生した場合に備え、汎用的な例外ハンドリングを行います。
サンプルコード
AWS Secrets Managerから復号化済みのプレーンテキストシークレットを取得するには、以下のコードを使用します。
import boto3
import base64
from botocore.exceptions import ClientError
def get_decrypted_secret_details(secret_stored_location):
session = boto3.session.Session()
secrets_client = session.client('secretmanager')
try:
response = secrets_client.get_secret_value(SecretId=secret_stored_location)
if 'SecretString' not in response:
# バイナリ形式の場合はBase64でデコード
decoded_secret_values = base64.b64decode(response['SecretBinary'])
else:
decoded_secret_values = response['SecretString']
return decoded_secret_values
except ClientError as e:
raise Exception("boto3 client error in get_decrypted_secret_details: " + str(e))
except Exception as e:
raise Exception("Unexpected error in get_decrypted_secret_details: " + str(e))
a = get_decrypted_secret_details('/secrets/aws')
print(a)なお、元のコードにはimport base64が欠けているため、上記では追記しています。また、SecretStringが存在する場合にも値を正しく返せるよう、分岐処理を補完しています。
実行結果
{"user":"SERVICE_USER","accesskey":"I**************"}このように、SecretBinaryフィールドに格納されたBase64エンコード済みのデータをデコードすることで、シークレットを安全に平文として取得できます。本番環境では、取得したシークレットをログなどに出力せず、必要な箇所でのみ利用するよう注意してください。
-
Boto3を使ってAWS Glueクローラーのメトリクスを1つまたは複数取得する方法【Pythonコード例】
はじめにこの記事では、Pythonのboto3ライブラリを使用して、AWS Glueデータカタログに登録された指定したクローラーのメトリクスを取得する方法を解説します。単一のクローラーだけでなく、複数のクローラーを一度に指定することも可能です。課題: Pythonのboto3ライブラリを使って、指定されたクローラーのメトリクスを取得する。例: クローラー「crawler_for_s3_file_job」のメトリクスを取得する。解決のためのアプローチ以下の手順で、指定されたクローラーのメトリクスを取得できます。ステップ1: 例外処理のためにboto3とbotocore.exceptions(Cl
-
Boto3を使用して移行操作のステータスを取得する方法
課題の概要 Pythonのboto3ライブラリを使用して、AWS Glueデータカタログの移行(インポート)操作のステータスを取得します。 例: アカウント内で実行された移行操作のステータスを取得します。 解決のためのアプローチと手順 ステップ1: 例外処理のために、boto3とbotocore.exceptionsをインポートします。 ステップ2: 移行ステータスを確認したい対象の catalog_id をパラメータとして渡します。なお、このパラメータは省略可能です。指定しなかった場合は、デフォルトでログイン中のユーザーアカウントに対して、移行が進行中か完了済みかが確認されます。catal