【AWS】機密データの管理 ~ Secrets Manager / boto3 編 ~

■ はじめに

https://dk521123.hatenablog.com/entry/2020/03/12/220717

の続き。

 Secrets Manager に含まれている情報を、
boto3 でアクセスして、ごにょごにょする必要ができたので
調べて、メモを残しておく。

目次

【1】API仕様
 1)get_secret_value()
【2】サンプル
 例1:RDS認証情報をboto3 APIで取得する
【3】トラブル
 1)boto3 API時にタイムアウトエラーが発生する

【1】API仕様

* 以下を参照のこと。

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager.html

1)get_secret_value()

* Secrets Managerで管理されている認証情報を取得するAPI
* 以下「Returns / Response Syntax」の「SecretString」に
 JSON形式で認証情報が入っている(ない場合は「SecretBinary」を使用)

Request Syntax

response = client.get_secret_value(
    SecretId='string',
    VersionId='string',
    VersionStage='string'
)

Returns / Response Syntax

{
    'ARN': 'string',
    'Name': 'string',
    'VersionId': 'string',
    'SecretBinary': b'bytes', # ★注目★
    'SecretString': 'string', # ★注目★
    'VersionStages': [
        'string',
    ],
    'CreatedDate': datetime(2015, 1, 1)
}

【2】サンプル

例1:RDS認証情報をboto3 APIで取得する

import ast
import json
import base64
import boto3
from botocore.exceptions import ClientError

# 定数
TARGET_SECREAT_ID = "sample-rds-key"
TARGET_REGION_NAME = "ap-northeast-1"

print(f"Start. {TARGET_SECREAT_ID}")

secrets_manager_client = boto3.client(
  'secretsmanager',
  region_name=TARGET_REGION_NAME)

try:
  response = secrets_manager_client.get_secret_value(
    SecretId=TARGET_SECREAT_ID
  )
  if 'SecretString' in response:
    secret = response['SecretString']
  else:
    secret = base64.b64decode(response['SecretBinary'])

  # astモジュールについては、下記の関連記事を参照
  # https://dk521123.hatenablog.com/entry/2021/10/01/000000
  secret_info = ast.literal_eval(secret)

  user_name = secret_info["username"]
  user_password = secret_info["password"]

  print(f"user_name={user_name}, user_password={user_password}")

  print("Done")
except ClientError as ex:
  print(f"Error : {ex}")
  raise ex

【3】トラブル

1)boto3 API時にタイムアウトエラーが発生する

boto3 API時に以下「エラー内容」のようなタイムアウトエラーが発生する

エラー内容

urllib3.exceptions.ConnectTimeoutError:
(<botocore.awsrequest.AWSHTTPSConnection object at 0xXXXXXXXXX>,
 'Connection to secretsmanager.us-west-1.amazonaws.com
 timed out. (connect timeout=60)')

解決案
https://yohei-a.hatenablog.jp/entry/20200107/1578365127

より抜粋
~~~~~~~~~~~~~~
1. Secrets Manager の VPCエンドポイントを作成する。
2. VPCエンドポイントの Security Groupで 
 Python Shell のジョブの Security Group からのアクセスを許可する。
~~~~~~~~~~~~~~

参考文献

https://dev.classmethod.jp/articles/secrets_manager_tips_get_api_key/

関連記事

機密データの管理 ~ Secrets Manager 編 ~
https://dk521123.hatenablog.com/entry/2020/03/12/220717
CodeBuild で パラメータストア / Secrets Manager を使う
https://dk521123.hatenablog.com/entry/2020/02/18/230358
AWS Glue ~ Boto3 / Glue connection編 ~
https://dk521123.hatenablog.com/entry/2020/01/29/224525
Python ~ 基本編 / astモジュール ~
https://dk521123.hatenablog.com/entry/2021/10/01/000000
Lambda ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2017/04/05/235618
Lambda ~ Python / 入門編 ~
https://dk521123.hatenablog.com/entry/2021/10/07/103317