如何以联邦用户身份通过Lambda查询AWS Redshift Serverless及Glue数据目录
解决Lambda中以联邦用户身份查询AWS Glue Data Catalog的问题
问题1:Lambda中联邦用户连接方式
查询Redshift Serverless关联的Glue Data Catalog,依然使用Redshift Data API(即boto3的redshift-data客户端)即可,无需额外创建联邦用户。Lambda的执行角色本身就是IAM身份,可通过Redshift的IAM身份验证机制直接访问,核心是做好权限配置而非更换连接方式。
问题2:授权时提示"IAMR:lambda-role不存在"的解决
该错误是因为Redshift无法识别单纯的角色名格式,正确的IAM身份标识符需要使用角色的完整ARN,而非仅角色名。Redshift通过ARN唯一映射IAM角色身份,仅填角色名系统无法定位到对应的IAM实体。
问题3:修正官方授权语句
将授权语句中的角色名替换为Lambda执行角色的完整ARN,示例如下:
GRANT USAGE ON DATABASE awsdatacatalog TO "IAMR:arn:aws:iam::123456789012:role/your-lambda-role-name"; -- 若需查询具体表,需补充表权限 GRANT SELECT ON TABLE awsdatacatalog.your_schema.your_table TO "IAMR:arn:aws:iam::123456789012:role/your-lambda-role-name";
完整配置步骤
Lambda执行角色权限配置
- 添加
redshift-data:ExecuteStatement和redshift-data:GetStatementResult权限 - 添加Glue Data Catalog相关权限:
glue:GetDatabase、glue:GetTable、glue:BatchGetPartition(根据查询需求调整) - 确保角色信任关系允许
lambda.amazonaws.com调用
- 添加
Redshift Serverless工作组配置
- 启用IAM身份验证
- 确保工作组的权限策略允许该Lambda角色访问
Lambda代码示例
import boto3 def lambda_handler(event, context): redshift_client = boto3.client('redshift-data') exec_response = redshift_client.execute_statement( Database='awsdatacatalog', WorkgroupName='your-workgroup-name', Sql='SELECT * FROM your_schema.your_table LIMIT 10;' ) # 获取查询结果 result = redshift_client.get_statement_result(Id=exec_response['Id']) print(result['Records']) return { 'statusCode': 200, 'records': result['Records'] }
内容的提问来源于stack exchange,提问作者bytebridger
相关产品推荐
相关产品推荐

