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
EXPERTE
gefragt vor 5 Monaten50 Aufrufe
1 Antwort
0

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

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

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

谢谢。

profile picture
EXPERTE
beantwortet vor 5 Monaten

Du bist nicht angemeldet. Anmelden um eine Antwort zu veröffentlichen.

Eine gute Antwort beantwortet die Frage klar, gibt konstruktives Feedback und fördert die berufliche Weiterentwicklung des Fragenstellers.

Richtlinien für die Beantwortung von Fragen