Lambda调用Redshift无执行动作问题排查求助
问题描述
使用boto3的redshift-data API调用Redshift集群执行批量SQL语句时,CloudWatch返回HTTP 200成功响应,但Redshift集群未产生任何变更或执行动作,请求协助排查原因。
响应内容
{'ClusterIdentifier': 'redshift-chan-dev', 'CreatedAt': datetime.datetime(2022, 12, 28, 8, 57, 9, 208000, tzinfo=tzlocal()), 'Database': 'dev', 'Id': '5d5c7b4c-31e6-41c3-991e-f76383d46775', 'SecretArn': 'REDSHIFT/dev/chan', 'ResponseMetadata': {'RequestId':'5d5c7b4c-31e6-41c3-991e-f76383d46775', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amzn-requestid': '5d5c7b4c-31e6-41c3-991e-f76383d46775', 'content-type':'application/x-amz-json-1.1', 'content-length': '163', 'date': 'Wed, 28 Dec 2022 08:57:09 GMT'}, 'RetryAttempts': 0}}
boto3执行代码
response = REDSHIFT_CLIENT.batch_execute_statement( Database = "dev", SecretArn = 'REDSHIFT/dev/chan', ClusterIdentifier = 'redshift-chan-dev', Sqls = [ drop_tmp_table, create_tmp_table, copy_to_tmp_table, load_tmp_to_winloss, ] )
相关SQL语句
create_tmp_table
create_tmp_table = """CREATE TABLE dev.schema.table( id INT, transaction_code VARCHAR, "type" VARCHAR, org_id SMALLINT, region VARCHAR, .."""
copy_to_tmp_table
copy_to_tmp_table = """COPY dev.schema.table FROM 's3://{bucket}/{TMP_PREFIX}/{file_name}.csv' iam_role 'arn:aws:iam::560762403195:role/redshift_copyS3' FORMAT AS CSV IGNOREHEADER 1"""
排查步骤
确认语句实际执行状态:HTTP 200仅代表请求已成功提交到Redshift Data API,不代表SQL已执行成功。调用
describe_statementAPI查询任务ID的具体状态和错误信息:status_res = REDSHIFT_CLIENT.describe_statement(Id='5d5c7b4c-31e6-41c3-991e-f76383d46775') print("执行状态:", status_res['Status']) print("错误信息:", status_res.get('Error', '无错误记录'))常见状态包括
FAILED(执行失败)、ABORTED(被终止)、PENDING(等待执行),错误信息会直接指出问题根源。检查SQL语句有效性:
- 确认
drop_tmp_table是否包含IF EXISTS,若目标表不存在且未加该关键字,会导致第一条语句失败,后续批量语句可能中断执行。 - 检查
create_tmp_table是否完整,示例中末尾的..属于未完成语法,实际执行会触发语法错误。 - 验证
copy_to_tmp_table中的S3路径变量{bucket}、{TMP_PREFIX}、{file_name}是否已替换为真实值,无效路径会导致COPY操作失败。 - 确认表名
dev.schema.table中的schema存在,且执行SQL的用户拥有该schema的访问权限。
- 确认
排查权限问题:
- 检查
SecretArn对应的凭证关联的IAM实体,是否拥有redshift-data:BatchExecuteStatement权限,以及Redshift集群的访问权限。 - 验证COPY语句使用的IAM角色
arn:aws:iam::560762403195:role/redshift_copyS3是否具备S3桶的s3:GetObject权限,同时确认Redshift集群有权限assume该角色(需在角色信任策略中添加Redshift服务主体)。 - 执行SQL的数据库用户是否拥有
DROP TABLE、CREATE TABLE、COPY等操作权限。
- 检查
查看Redshift集群日志:
- 登录Redshift控制台,进入查询历史页面,搜索任务ID
5d5c7b4c-31e6-41c3-991e-f76383d46775,查看具体执行日志和报错详情。 - 检查集群状态是否正常,排除维护、暂停等异常状态导致的执行阻塞。
- 登录Redshift控制台,进入查询历史页面,搜索任务ID
确认批量执行逻辑:
batch_execute_statement按顺序执行SQL语句,若某一条语句执行失败,后续语句默认不会继续执行,需逐个验证每条语句的正确性。- 确认是否存在事务控制语句(如
BEGIN),若未手动提交事务,变更不会持久化到集群。
内容的提问来源于stack exchange,提问作者Christian Balanquit
相关产品推荐
相关产品推荐

