概要
boto3でのSecretsManagerの操作。
バージョン情報
- boto3==1.19.10
clientの生成
import boto3 session = boto3.session.Session() client = session.client( service_name='secretsmanager', )
secretの生成
初回はcreate_secretで生成するところから。
client.create_secret( Name='foobar', SecretString="foo_bar", )
既に生成済みの場合は例外が発生する
botocore.errorfactory.ResourceExistsException: An error occurred (ResourceExistsException) when calling the CreateSecret operation: The operation failed because the secret foobar already exists.
値の取得
登録したName(foobar)で値を取得する。
value = client.get_secret_value( SecretId="foobar" ) print(value)
結果。値自体はDictで返り SecretString
で取れる。
{ 'ARN': 'arn:aws:secretsmanager:ap-northeast-1:052 (以下略)', 'Name': 'foobar', 'VersionId': '7131c (以下略)', 'SecretString': 'foo_bar', 'VersionStages': ['AWSCURRENT'], 'CreatedDate': datetime.datetime(2022, 6, 25, 21, 14, 35, 340000, tzinfo=tzlocal()), 'ResponseMetadata': (以下略) }
SecretsManagerは値の保存方法に SecretString
(str) と SecretBinary
(byes)の指定ができる。
上記ではSecretStringで作成した値を取っているが、binaryで設定した場合はSecretBinaryで返る。
client.create_secret( Name='foobar_bin', SecretBinary=b"foo_bar", ) value = client.get_secret_value( SecretId="foobar_bin" ) print(value)
結果。SecretStringではなくSecretBinaryで値が返っている。
{ 'ARN': 'arn:aws:secretsmanager:ap-northeast-1:052 (以下略)', 'Name': 'foobar', 'VersionId': '7131c (以下略)', 'SecretBinary': b'foo_bar', 'VersionStages': ['AWSCURRENT'], 'CreatedDate': datetime.datetime(2022, 6, 25, 21, 14, 35, 340000, tzinfo=tzlocal()), 'ResponseMetadata': (以下略) }
存在しないSecretIdを指定するとエラー。
value = client.get_secret_value(
SecretId="hogefuga"
)
botocore.errorfactory.ResourceNotFoundException: An error occurred (ResourceNotFoundException) when calling the GetSecretValue operation: Secrets Manager can't find the specified secret.
値の更新
put_secret_valueで値を更新する。
client.put_secret_value( SecretId="foobar", SecretString="hoge_fuga", ) value = client.get_secret_value( SecretId="foobar" ) print(value)
{ 'ARN': 'arn:aws:secretsmanager:ap-northeast-1:052 (以下略)', 'Name': 'foobar', 'VersionId': '7131c (以下略)', 'SecretString': 'hoge_fuga', 'VersionStages': ['AWSCURRENT'], 'CreatedDate': datetime.datetime(2022, 6, 25, 21, 14, 35, 340000, tzinfo=tzlocal()), 'ResponseMetadata': (以下略) }
バージョンの取得
response = client.list_secret_version_ids( SecretId="foobar", ) for version in response["Versions"]: print(f"{version['VersionStages']}, {version['CreatedDate'].strftime('%Y-%m-%d %H:%M')}, {version['VersionId']}")
結果
['AWSPREVIOUS'], 2022-06-26 10:41, c492df(以下略) ['AWSCURRENT'], 2022-06-26 10:43, bea104(以下略)
上で取れたバージョンIDから値を引いてみる。
response = client.list_secret_version_ids( SecretId="foobar", ) for version in response["Versions"]: # VersionIdを指定してget_secret_value value = client.get_secret_value( SecretId="foobar", VersionId=version['VersionId'] ) print(f"{version['VersionStages']}, {value['SecretString']})")
結果
['AWSPREVIOUS'], foo_bar) ['AWSCURRENT'], hoge_fuga)
Secretsの一覧取得
最大100件まで表示する例。
response = client.list_secrets( MaxResults=100 ) for secret in response["SecretList"]: print(secret)
ランダムパスワードの取得
boto3にはget_random_passwordという機能が入っていて、secretsmanager:GetRandomPasswordを呼び出しているらしい。
response = client.get_random_password( PasswordLength=13, ) print(response["RandomPassword"])
結果
Onc}f[9:W':m\
Secretの削除
RecoveryWindowInDays=7
で7日間はリカバリ可能な設定で削除実行。
client.delete_secret( SecretId="foobar", RecoveryWindowInDays=7 )
すぐに消したい場合は ForceDeleteWithoutRecovery=True
を指定。
RecoveryWindowInDays に指定できるのは7〜30の間でそれ以外の数値を設定するとエラーになる。
botocore.errorfactory.InvalidParameterException: An error occurred (InvalidParameterException) when calling the DeleteSecret operation: The RecoveryWindowInDays value must be between 7 and 30 days (inclusive).