AWS跨账户Postgres RDS IAM身份验证

时间:2020-09-02 16:42:20

标签: postgresql amazon-web-services amazon-iam amazon-ecs aws-fargate

我正在尝试设置跨帐户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文档吗?

1 个答案:

答案 0 :(得分:0)

我设法在AWS支持人员的帮助下进行了整理。这些是我必须要做的动作:

  1. 将以下策略添加到应用于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” } ] }

  2. 在用于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” } ] }

  3. 更新在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))