繁体   English   中英

将 AWS Secrets Manager 与 Python 结合使用(Lambda 控制台)

Using AWS Secrets Manager with Python (Lambda Console)

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在尝试在 AWS 中使用 Secrets Manager 一个 Lambda 函数。 管理器用于将数据库凭据存储到 Snowflake(用户名、密码)的机密。

我设法在 Secrets Manager 中设置了一个秘密,其中包含几个键/值对(例如一个用于用户名,另一个用于密码)。

现在我试图在我的 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()函数返回USERNAMEPASSWORD等参数的值。

如何做到这一点? 感谢您的帮助!

5 个回复

将 get_secret() 的最后一部分更新为:

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:
            secret = base64.b64decode(get_secret_value_response['SecretBinary'])

return json.loads(secret)  # returns the secret as dictionary

这将返回一个字典,其中包含您在 AWS Secret Manager 控制台中指定的密钥。

  • 以下是我如何使用 arn 使用它, 遵循这个集团希望对您有所帮助。
  • 值得检查您曾经存储的内容并相应地使用一个SecretStringSecretBinary
    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')
  • boto3 文档
  • get_secret_value从密钥的指定版本中检索加密字段SecretStringSecretBinary的内容,以包含内容的为准。
  • 根据使用的内容,您的 lambda 角色应具有以下权限
    • secretsmanager:GetSecretValue
    • kms:Decrypt仅当您使用客户管理的 AWS KMS 密钥加密密钥时才需要。 您不需要此权限即可将账户的默认 AWS 托管 CMK 用于 Secrets Manager。

嗨@Prashanth kumar 你的意思是这样的:def get_secret():

secret_name = "MySecretForRedshift"
region_name = "us-east-1"

# 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 = json.loads(get_secret_value_response['SecretString'])
    else:
        secret = json.loads(base64.b64decode(get_secret_value_response['SecretBinary']))
return secret

我创建了一个名为 pysecret 的开源库,这里是 AWS Secret Manager 集成的文档: https : //github.com/MacHu-GWU/pysecret-project#aws-key-management-service-and-secret-manager-integration

我可以引导您完成最简单的方法:

  1. 手动将您的秘密值放入 json 或使用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 控制台中创建的秘密。

  1. 在 lambda 函数或任何 Python 代码中读取您的秘密值
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 角色要求

  1. 您的 Lambda IAM 角色必须具有 Secret Manager 读取权限。 aws 内置的策略 arn:aws:iam::aws:policy/SecretsManagerReadWrite 有读和写,如果你偷懒,可以使用它。 但我建议您创建一个只有读取访问权限的自定义策略。
  2. 如果您使用自动生成的 kms 密钥作为您的密钥,则必须使用aws kms create-grant命令授予 Lambda 函数 IAM 角色访问 kms 密钥以进行加密,方法如下https://docs.aws.amazon.com /cli/latest/reference/kms/create-grant.html
  3. 如果您使用自定义 kms 密钥,您应该能够编辑 kms 密钥的用户,在您的 aws 控制台中选择 Lambda 函数 IAM 角色。

希望这能回答你的问题。

如果这有帮助,请为我的项目https://github.com/MacHu-GWU/pysecret-project 加星标。

AWS 为一些受支持的数据库引擎(例如 MySQL 等)提供了一些模板,请查看此模板

对于不受支持的数据库,检查这个

上面提供的模板将为您提供自定义功能的示例。

2 AWS中的Lambda开发-? 在当地发展? 或使用AWS Web控制台

人们通常如何发展? 他们使用无服务器之类的东西还是使用AWS Lambda(AWS平台上的Web控制台)。 我在本地测试(尤其是模拟Lambda和SES的SQS触发)方面面临挑战。 我正在开发一个生态系统,其中的API将向SQS发送消息。 SQS将触发Lambda功能,该功能将发送客 ...

5 AWS 控制台到 github

我想知道我是否可以将我的 git 存储库用于 AWS 控制台? 事实上,我在 AWS 控制台上做了一个 rails 项目,但我没有找到如何将它转移到我的 Github 存储库 ...

6 Couchbase控制台-AWS

我使用了本教程: https : //docs.couchbase.com/server/6.0/install/rhel-suse-install-intro.html#installing-using-code-class-cmd-yum-code 要在aws ec2实例上安装coun ...

9 如何使用Python写入Python控制台

有一个运行uPython(Micropython)的设备,该设备通过串行连接连接到我的计算机。 当我使用Moba XTerm在COM19上打开控制台时,我可以执行uPython命令,例如2+3 : 关键是,我想执行脚本而不是在控制台中“实时”开发脚本。 所以我想我写了一个Pyth ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM