前提

・スクリプトの実行環境をAWS CloudShellとします。
・Secretの作成権限を持つユーザで作成すること

Secretの作成スクリプト

aws_create_secret.py

# -*- coding: utf-8 -*-

import boto3
import sys

if(len(sys.argv) <= 1):
    print('Please enter arguments!')
    print('Example:filename.py "secret_name"')
    sys.exit()
# ここに到達できていれば sys.argv[1]は必ず存在するので、安全にアクセスできます。
first_argv = str(sys.argv[1])
print('input first argument is', first_argv)

def aws_create_secret(secret_name):
    """シークレット作成"""

    try:
        print('シークレット:[' + secret_name +']の作成を行います。')
        rt = None

        # シークレット作成
        secretsmanager_client = boto3.client('secretsmanager')

        password = secretsmanager_client.get_random_password(
            PasswordLength=8,
            ExcludeCharacters='@\'"<>`\\', 
            # 次の句読文字をパスワードから除外するかどうかを指定します。 
            # ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~ 
            RequireEachIncludedType=True
        )
        print('RandomPassword:')
        print(password['RandomPassword'])

        response = secretsmanager_client.create_secret(
            Description='test secret created with python',
            Name=secret_name,
            SecretString=password['RandomPassword'],
        )
        print(response)

    # except Exception:
    except Exception as e:
        print ('[SecretsManager_CreateUser] create secret exception error.')
        print("error: " + str(e))
        rt=None
    print('シークレット:[' + secret_name +']の作成を完了しました。')

    return rt        

# 呼び出しのテスト
aws_create_secret(first_argv)

動作確認

1.Pythonのバージョン確認

Python3のバージョン確認コマンド:
python3 –version或いはpython3 -V

実行例:

[cloudshell-user@ip-10-0-116-255 ~]$ python3 --version
Python 3.7.10
[cloudshell-user@ip-10-0-116-255 ~]$ python3 -V
Python 3.7.10
[cloudshell-user@ip-10-0-116-255 ~]$ 

2.PythonのスクリプトをCloudShellにアップロードする

AWS CloudShell画面右上の「Actions」⇒「Uplodad file」より.Pythonのスクリプト(aws_create_secret.py)をアップロードする

3.Pythonのスクリプトを実行してみる

コマンド:
python3 file名 第一引数
aws_create_secret.py "Secret名"

実行例:
python3 aws_create_secret.py "test1"

Secret名が存在しない場合の例:

[cloudshell-user@ip-10-0-72-182 ~]$ python3 aws_create_secret.py "test1"
input first argument is test1
シークレット:[test1]の作成を行います。
RandomPassword:
Ow$rUf1x
{'ARN': 'arn:aws:secretsmanager:ap-northeast-1:xxxxxxxxxxxx:secret:test1-SnrwBc', 'Name': 'test1', 'VersionId': '7a405490-aa88-44de-99cd-741b218e7e62', 'ResponseMetadata': {'RequestId': 'a5769a3f-5f26-4ef5-bf2c-6b886597d48a', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amzn-requestid': 'a5769a3f-5f26-4ef5-bf2c-6b886597d48a', 'content-type': 'application/x-amz-json-1.1', 'content-length': '146', 'date': 'Sat, 11 Jun 2022 20:59:40 GMT'}, 'RetryAttempts': 0}}
シークレット:[test1]の作成を完了しました。
[cloudshell-user@ip-10-0-72-182 ~]$ 

Secret名が既に存在する場合の例:

[cloudshell-user@ip-10-0-72-182 ~]$ python3 aws_create_secret.py "test1"
input first argument is test1
シークレット:[test1]の作成を行います。
RandomPassword:
IeN2k{uQ
[SecretsManager_CreateUser] create secret exception error.
error: An error occurred (ResourceExistsException) when calling the CreateSecret operation: The operation failed because the secret test1 already exists.
シークレット:[test1]の作成を完了しました。
[cloudshell-user@ip-10-0-72-182 ~]$ 

まとめ

パスワードを生成してAWS Secrets Managerにシークレットを作成するPythonスクリプトを紹介しました。

Secret名が既に存在する場合、下記のエラーが出力されました。
error: An error occurred (ResourceExistsException) when calling the CreateSecret operation: The operation failed because the secret test1 already exists.

AWSコンソール上でSecret名を削除して、同じSecret名で作成すると、下記のエラーが出力されました。
error: An error occurred (InvalidRequestException) when calling the CreateSecret operation: You can’t create this secret because a secret with this name is already scheduled for deletion.

次回、Python3でSecretを削除し、同じSecret名で作成できるスクリプトを実装したいと思います。

お役に立てれば幸いです。

参考

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager.html#SecretsManager.Client.get_random_password

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager.html#SecretsManager.Client.create_secret

Last modified: 2022-06-12

Author