iMind Developers Blog

iMind開発者ブログ

boto3でSecretsManagerへの値の登録と取得

概要

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).