【以下的问题经过翻译处理】 相同的代码在一个账户中能正常工作,但在另一个账户中不能工作。
在一个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']
}