Python 使用AWS机密管理器连接到Postgres数据库
想要使用AWS Secrets manager登录到postgres,而不使用用户名和密码作为纯文本。我不确定这是否可行,如果不行,请原谅我。目前,我正在使用psycopg2登录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中存储了用户名和密码,但不知
import psycopg2
conn = psycopg2.connect(host="hostname",port='5432',database="db", user="admin", password="12345")
我已经在secrets manager中存储了用户名和密码,但不知道如何在这里使用它。请帮助您应该使用以下过程:
导入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集成的文档:
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控制台中创建的秘密
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)