我正在尝试设置跨帐户Postgres RDS IAM身份验证。我的用例是一个由ECS引擎顶部的AWS Batch容器化并执行的python代码,该代码连接到另一个AWS账户中的Postgres RDS。我尝试遵循描述为here的路由(在数据库连接所源自的帐户中的单个角色),但连接失败并显示以下信息:
2020-06-12 19:41:10,363-根-错误-从数据DB读取数据时发生错误:致命:用户“ db_user”的PAM身份验证失败
我还找到了this one,并尝试设置类似的内容(每个帐户一个角色,但没有EC2实例作为连接源)。不幸的是,它失败并出现相同的错误。有人知道其他与我的用例匹配的AWS文档吗?
答案 0 :(得分:0)
我设法在AWS支持人员的帮助下进行了整理。这些是我必须要做的动作:
将以下策略添加到应用于AWS Batch任务(AWS账户A)的IAM角色:
{ “ Version”:“ 2012-10-17”, “声明”:{ “效果”:“允许”, “ Action”:“ sts:AssumeRole”, “资源”:“ arn:aws:iam :: ACCOUNT_B_ID:role / ecsTaskExecutionRole” } }
使用以下信任策略:
{ “ Version”:“ 2008-10-17”, “声明”:[ { “ Sid”:“”, “效果”:“允许”, “校长”:{ “服务”:“ ecs-tasks.amazonaws.com” }, “动作”:“ sts:AssumeRole” } ] }
在用于RDS托管的AWS账户(AWS账户B)中添加以下IAM角色:
{ “ Version”:“ 2012-10-17”, “声明”:[ { “效果”:“允许”, “动作”:[ “ rds-db:connect” ], “资源”:[ “ arn:aws:rds-db :: ACCOUNT_B_ID:dbuser:{rds-resource-id} / {batch-user}” ] } ] }
使用以下信任策略:
{ “ Version”:“ 2008-10-17”, “声明”:[ { “ Sid”:“”, “效果”:“允许”, “校长”:{ “ AWS”:“ arn:aws:iam :: ACCOUNT_A_ID:root”, “服务”:“ ecs-tasks.amazonaws.com” }, “动作”:“ sts:AssumeRole” } ] }
更新在AWS Batch容器中执行的代码:
sts_client = boto3.client('sts') 假定的_role_object = sts_client.assume_role( RoleArn =“ arn:aws:iam :: ACCOUNT_B_ID:role / ROLE_TO_BE_ASSUMED”, RoleSessionName =“ AssumeRoleSession1” )
credentials = assumed_role_object ['Credentials'] 客户端= boto3.client( 'rds', aws_access_key_id =凭证['AccessKeyId'], aws_secret_access_key =凭证['SecretAccessKey'], aws_session_token =凭证['SessionToken'], region_name = REGION)
#client = boto3.client('rds')
令牌= client.generate_db_auth_token(DBHostname = ENDPOINT,Port = PORT,DBUsername = USR,Region = REGION)
尝试: conn = psycopg2.connect(主机= ENDPOINT,端口= PORT,数据库= DBNAME,用户= USR,密码=令牌) cur = conn.cursor() cur.execute(“”“”立即选择()“”“”) query_results = cur.fetchall() 打印(query_results) 例外,例如e: print(“由于{}”,数据库连接失败。.format(e))