Python 使用AWS机密管理器连接到Postgres数据库

Python 使用AWS机密管理器连接到Postgres数据库,python,amazon-web-services,psycopg2,aws-secrets-manager,Python,Amazon Web Services,Psycopg2,Aws Secrets Manager,想要使用AWS Secrets manager登录到postgres,而不使用用户名和密码作为纯文本。我不确定这是否可行,如果不行,请原谅我。目前,我正在使用psycopg2登录postgres: import psycopg2 conn = psycopg2.connect(host="hostname",port='5432',database="db", user="admin", password="12345") 我已经在secrets manager中存储了用户名和密码,但不知

想要使用AWS Secrets manager登录到postgres,而不使用用户名和密码作为纯文本。我不确定这是否可行,如果不行,请原谅我。目前,我正在使用psycopg2登录postgres:

 import psycopg2

conn = psycopg2.connect(host="hostname",port='5432',database="db", user="admin", password="12345")

我已经在secrets manager中存储了用户名和密码,但不知道如何在这里使用它。请帮助

您应该使用以下过程:

  • 连接到AWS机密管理器
  • 重新输入用户名和密码。您需要以存储在secrets manager中的方式映射它
  • 将其存储在变量中,并将其传递给连接字符串 下面是由提供的python脚本示例:

    导入boto3
    导入base64
    从botocore.exceptions导入ClientError
    def get_secret():
    secret_name=“”
    region_name=“”
    #创建一个Secrets Manager客户端
    session=boto3.session.session()
    client=session.client(
    服务\u name='secretsmanager',
    地区名称=地区名称
    )
    #在此示例中,我们仅处理“GetSecretValue”API的特定异常。
    #看https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html
    #默认情况下,我们重新显示异常。
    尝试:
    get\u secret\u value\u response=client.get\u secret\u value(
    SecretId=秘密名称
    )
    除ClientError作为e外:
    如果e.response['Error']['Code']=='DecryptionFailureException':
    #机密管理器无法使用提供的KMS密钥解密受保护的机密文本。
    #在此处处理例外情况,和/或根据您的判断重新选择。
    提高e
    elif e.response['Error']['Code']=='InternalServiceErrorException':
    #服务器端发生错误。
    #在此处处理例外情况,和/或根据您的判断重新选择。
    提高e
    elif e.response['Error']['Code']=='InvalidParameterException':
    #您为参数提供的值无效。
    #在此处处理例外情况,和/或根据您的判断重新选择。
    提高e
    elif e.response['Error']['Code']=='InvalidRequestException':
    #您提供的参数值对于资源的当前状态无效。
    #在此处处理例外情况,和/或根据您的判断重新选择。
    提高e
    elif e.response['Error']['Code']=='ResourceNotFoundException':
    #我们找不到您要求的资源。
    #在此处处理例外情况,和/或根据您的判断重新选择。
    提高e
    其他:
    #使用关联的KMS CMK解密机密。
    #根据机密是字符串还是二进制,将填充其中一个字段。
    如果get\u secret\u value\u响应中的“SecretString”:
    secret=get\u secret\u value\u响应['SecretString']
    其他:
    decoded_binary_secret=base64.b64解码(获取_secret_value_响应['SecretBinary'])
    #你的密码在这里。
    
    您可以使用控制台在SecretsManager中存储凭据(用户名/密码)。 例如,您可以将它们存储为键值对-

    { "username": "admin", "password": "12345" }
    
    要在Python脚本中使用它,可以执行以下操作-

    session = boto3.session.Session()
    client = session.client(
        service_name='secretsmanager',
        region=< region_name >
    )
    secret = client.get_secret_value(
             SecretId=secret_name
    )
    secret_dict = json.loads(secret['SecretString'])
    
    username = secret_dict['username']
    passw = secret_dict['password']
    
    conn = psycopg2.connect(host="hostname",port='5432',database="db", user=username, password=passw)
    
    session=boto3.session.session()
    client=session.client(
    服务\u name='secretsmanager',
    地区=
    )
    secret=client.get\u secret\u值(
    SecretId=秘密名称
    )
    secret\u dict=json.load(secret['SecretString'])
    用户名=密码[用户名]
    passw=secret_dict['password']
    conn=psycopg2.connect(host=“hostname”、port=“5432”、database=“db”、user=username、password=passw)
    

    请注意,这是一个没有错误处理的简化示例。您还需要填写正确的区域来代替示例中的

    我创建了一个名为
    pysecret
    的开放源代码库,它使API非常干净且易于使用。以下是AWS Secret Manager集成的文档:

  • 手动将您的机密值放入json或使用
    pysecret
    创建一个
  • 从pysecret导入AWSSecret
    aws\u profile=“我的aws\u profile”
    aws=AWSSecret(配置文件名称=aws\U配置文件)
    机密\u id=“我的示例机密”
    机密数据={
    “主机”:“www.example.com”,
    “端口”:1234,
    “数据库”:“mydatabase”,
    “用户名”:“管理员”,
    “密码”:“我的密码”,
    }
    aws.deploy_secret(name=secret\u id,secret\u data=secret\u data)#或者,如果您创建了自定义kms密钥,则可以传递kms_key\u id
    
    然后,您应该能够看到在aws控制台中创建的秘密

  • 在lambda函数或任何python代码中读取机密值
  • aws=AWSSecret(profile\u name=aws\u profile)#在lambda代码中,不需要``profile\u name=aws\u profile``
    username=aws.get_secret_value(secret_id=“my example secret”,key=“password”)#admin
    password=aws.get_secret_value(secret_id=“my example secret”,key=“password”)#mypassword
    
    如果您正在为Lambda函数编写代码,您可以在这里查看我的另一个答案


    希望这能回答您的问题。

    您共享的代码,我在secrets manager中找到了它,我的问题是如何将用户名和密码传递到新变量中,并在连接字符串中使用它。我应该先执行上面的代码并将密钥传递给用户名和密码字段吗?rds=json.dumps(client.get_secret_value(SecretId=“postgres”)['SecretString'])是的,执行上面的代码,下面的一行将该值存储在变量secret..secret=get_secret_value_response['SecretString']中。。。将变量secret用作postgres连接字符串的参数。如果使用控制台和键/值对创建该秘密,它将存储为JSON blob。您必须首先将JSON解析为dict,然后访问键/值对。见Parimal'
    session = boto3.session.Session()
    client = session.client(
        service_name='secretsmanager',
        region=< region_name >
    )
    secret = client.get_secret_value(
             SecretId=secret_name
    )
    secret_dict = json.loads(secret['SecretString'])
    
    username = secret_dict['username']
    passw = secret_dict['password']
    
    conn = psycopg2.connect(host="hostname",port='5432',database="db", user=username, password=passw)