Lambda - Redshift - status = Query does not exist

0

【以下的问题经过翻译处理】 相同的代码在一个账户中能正常工作,但在另一个账户中不能工作。 在一个step function中,lambda调用Redshift查询,返回结果后下一步调用get status。 lambda可以返回,但status call出错,错误消息为“Query does not exist”。 上一步中的查询已成功运行,并返回了Statement ID。 只有status call失败。 在相同模式下使用相同get status lambda的步骤中的其他lambda正确工作。 这些其他步骤使用与失败步骤相同的get status lambda。 普通item是在前一步中调用Redshift查询。 只要使用它,status call就会失败。 但是: 查询能正确执行,同一个lambda在另一个账户的相同step function中可正常工作。 其他注意事项: Redshift集群是使用CloudFormation模板构建的,并应该是相同的。 整个Step Function(除了帐号之外未更改)在另一个帐户中工作正常。 为确保它们相同,已手动复制并粘贴来自工作账户的lambda。 是否有人有任何建议,因为所有明显的检查都已完成。 为了完整起见,Redshift查询调用的代码如下,但如上所述,这在另一个账户中可以工作。

import json
import boto3
import base64
import urllib.parse
import botocore.session as bc
from botocore.exceptions import ClientError

ssm_client = boto3.client('ssm')

def lambda_handler(event, context):

    environment             = event['environment']
    source_bucket           = event['source_bucket']
    processed_bucket        = event['processed_bucket']
    role                    = event['role']
    region                  = event['region']
    database_name           = event['database_name']
    secret_name             = event['secret_name']
    secret_arn              = event['secret_arn']
    cluster_id              = event['cluster_id']
    proc_name               = event['proc_name']
    
    ssm_redshift_proc_name  = ssm_client.get_parameter(Name=proc_name, WithDecryption=True)
    redshift_proc_name      = ssm_redshift_proc_name['Parameter']['Value']
    query_str               = "call "+redshift_proc_name+"();"

    bc_session = bc.get_session()
    session = boto3.Session(
            botocore_session    = bc_session,
            region_name         = region,
        )
        
    client_redshift = session.client("redshift-data")
    res = client_redshift.execute_statement(
            Database            = database_name,
			SecretArn           = secret_arn,
			Sql                 = query_str,
			ClusterIdentifier   = cluster_id
		)

    return {
		'environment': environment,
		'source_bucket': source_bucket,
		'processed_bucket': processed_bucket,
		'role': role,
		'region': region,
		'database_name': database_name,
		'secret_name': secret_name,
		'secret_arn': secret_arn,
		'cluster_id': cluster_id,
        'statementid': res['Id']
    }

profile picture
专家
已提问 5 个月前44 查看次数
1 回答
0

【以下的回答经过翻译处理】 您好,

您检查过所使用的IAM角色了吗?在两个账户中它们是否完全相同?

在所使用的IAM角色中是否附加了DescribeStatementExecuteStatement权限?

谢谢。

profile picture
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则