AWSでLambda関数のSecrets Managerを使用しようとしています。マネージャーがSnowflakeへのデータベース資格情報(ユーザー名、パスワード)を格納するために使用される秘密。
いくつかのキーと値のペアを含むシークレットマネージャーでシークレットを設定することに成功しました(たとえば、1つはユーザー名用、もう1つはパスワード用)。
Python関数コードでこれらの値を参照しようとしています。AWSドキュメントには、次のスニペットが用意されています。
_import boto3
import base64
from botocore.exceptions import ClientError
def get_secret():
secret_name = "MY/SECRET/NAME"
region_name = "us-west-2"
# Create a Secrets Manager client
session = boto3.session.Session()
client = session.client(
service_name='secretsmanager',
region_name=region_name
)
# In this sample we only handle the specific exceptions for the 'GetSecretValue' API.
# See https://docs.aws.Amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html
# We rethrow the exception by default.
try:
get_secret_value_response = client.get_secret_value(
SecretId=secret_name
)
except ClientError as e:
if e.response['Error']['Code'] == 'DecryptionFailureException':
# Secrets Manager can't decrypt the protected secret text using the provided KMS key.
# Deal with the exception here, and/or rethrow at your discretion.
raise e
Elif e.response['Error']['Code'] == 'InternalServiceErrorException':
# An error occurred on the server side.
# Deal with the exception here, and/or rethrow at your discretion.
raise e
Elif e.response['Error']['Code'] == 'InvalidParameterException':
# You provided an invalid value for a parameter.
# Deal with the exception here, and/or rethrow at your discretion.
raise e
Elif e.response['Error']['Code'] == 'InvalidRequestException':
# You provided a parameter value that is not valid for the current state of the resource.
# Deal with the exception here, and/or rethrow at your discretion.
raise e
Elif e.response['Error']['Code'] == 'ResourceNotFoundException':
# We can't find the resource that you asked for.
# Deal with the exception here, and/or rethrow at your discretion.
raise e
else:
# Decrypts secret using the associated KMS CMK.
# Depending on whether the secret is a string or binary, one of these fields will be populated.
if 'SecretString' in get_secret_value_response:
secret = get_secret_value_response['SecretString']
else:
decoded_binary_secret = base64.b64decode(get_secret_value_response['SecretBinary'])
# Your code goes here.
_
後でdef lambda_handler(event, context)
関数で、データベースへの接続を確立するための次のスニペットを用意しました。
_ conn = snowflake.connector.connect(
user=USERNAME,
password=PASSWORD,
account=ACCOUNT,
warehouse=WAREHOUSE,
role=ROLE
)
_
ただし、get_secret()
関数を使用してUSERNAME
やPASSWORD
などのパラメーターの値を返す方法を理解できません。
どうすればこれを達成できますか?お手伝いありがとう!
私はpysecretと呼ばれるオープンソースライブラリを作成しました。これはAWS Secret Manager統合のドキュメントです: https://github.com/MacHu-GWU/pysecret-project#aws-key-management-service-and-secret- manager-integration
そのための最も簡単な方法をご紹介します。
pysecret
で作成します。from pysecret import AWSSecret
aws_profile = "my_aws_profile"
aws = AWSSecret(profile_name=aws_profile)
secret_id = "my-example-secret"
secret_data = {
"Host": "www.example.com",
"port": 1234,
"database": "mydatabase",
"username": "admin",
"password": "mypassword",
"metadata": {
"creator": "Alice"
}
}
aws.deploy_secret(name=secret_id, secret_data=secret_data) # or you can pass kms_key_id if you created a custom kms key
その後、awsコンソールで作成されたシークレットを確認できるはずです。
aws = AWSSecret(profile_name=aws_profile) # in lambda code, don't need ``profile_name=aws_profile``
password = aws.get_secret_value(secret_id="my-example-secret", key="password") # mypassword
creator = aws.get_secret_value(secret_id="my-example-secret", key="metadata.creator") # Alice
注、シークレットにアクセスするためのLambda関数のIAMロール要件
aws kms create-grant
コマンドを使用して、暗号化のためにkmsキーにアクセスするためのLambda関数IAMロールを付与する必要があります。方法は次のとおりです https://docs.aws .Amazon.com/cli/latest/reference/kms/create-grant.htmlこれがあなたの質問に答えることを願っています。
この問題が解決しない場合は、プロジェクトにスターを付けてください https://github.com/MacHu-GWU/pysecret-project 。
SecretString
またはSecretBinary
を使用する価値がある secrets_client = boto3.client('secretsmanager')
secret_arn = 'arn:aws:secretsmanager:eu-west-2:xxxxxxxxxxxx:secret:dashboard/auth_token'
auth_token = secrets_client.get_secret_value(SecretId=secret_arn).get('SecretString')
SecretString
またはSecretBinary
のコンテンツを、指定されたバージョンのシークレットから、コンテンツを含む方から取得します。secretsmanager:GetSecretValue
kms:Decrypt
お客様が管理するAWS KMSキーを使用してシークレットを暗号化する場合にのみ必要です。 Secrets ManagerのアカウントのデフォルトのAWS管理CMKを使用するために、このアクセス許可は必要ありません。