对 Redshift Data API 进行跨账户调用

问题描述 投票:0回答:1

问题总结:

  • 我们在账户 A 中有一个 AWS Redshift 集群,其中有一个名为“产品”的数据库
  • 在账户 B 中,我们有一个 lambda 函数,需要使用 Redshift Data API 对“产品”执行 SQL 语句
  • 我们在 AWS Secrets Manager 中设置了一个新密钥,其中包含 redshift 集群凭证。此密钥已与账户 B 共享。我们已确认账户 B 可以从 AWS Secrets Manager 访问此信息。

当我们调用 Redshift Data API 操作“executeStatement”时,我们收到以下错误:

ValidationException: Cluster doesn't exist in this region.
at Request.extractError (C:\git\repositories\sandbox\redshift\node_modules\aws-sdk\lib\protocol\json.js:52:27)
at Request.callListeners (C:\git\repositories\sandbox\redshift\node_modules\aws-sdk\lib\sequential_executor.js:106:20)
at Request.emit (C:\git\repositories\sandbox\redshift\node_modules\aws-sdk\lib\sequential_executor.js:78:10)
at Request.emit (C:\git\repositories\sandbox\redshift\node_modules\aws-sdk\lib\request.js:688:14)
at Request.transition (C:\git\repositories\sandbox\redshift\node_modules\aws-sdk\lib\request.js:22:10)
at AcceptorStateMachine.runTo (C:\git\repositories\sandbox\redshift\node_modules\aws-sdk\lib\state_machine.js:14:12)
at C:\git\repositories\sandbox\redshift\node_modules\aws-sdk\lib\state_machine.js:26:10
at Request.<anonymous> (C:\git\repositories\sandbox\redshift\node_modules\aws-sdk\lib\request.js:38:9)
at Request.<anonymous> (C:\git\repositories\sandbox\redshift\node_modules\aws-sdk\lib\request.js:690:12)
at Request.callListeners (C:\git\repositories\sandbox\redshift\node_modules\aws-sdk\lib\sequential_executor.js:116:18)

错误消息表明它可能不会发送到正确的帐户,因为秘密包含我希望它知道的信息。

代码示例:

这是我的代码:

var redshiftdata = new aws.RedshiftData({ region: 'eu-west-2'});

const params : aws.RedshiftData.ExecuteStatementInput = {
  ClusterIdentifier: '<clusteridentifier>',
  Database: 'products',
  SecretArn: 'arn:aws:secretsmanager:<region>:<accountNo>:secret:<secretname>',
        Sql: `select * from product_table where id = xxx`,
        StatementName: 'statement-name',
        WithEvent: true
    };

redshiftdata.executeStatement(params, 
    async function(err, data){
    if (err) console.log(err, err.stack); 
    else {
        const resultParams : aws.RedshiftData.GetStatementResultRequest = { Id: data.Id! };
        redshiftdata.getStatementResult(resultParams, function(err, data){
            if (err) console.log(err, err.stack); 
            else     console.dir(data, {depth: null});
        })
    }
});

任何建议或指示将不胜感激。

amazon-web-services amazon-redshift
1个回答
2
投票

感谢帕西法尔的回答。这是工作解决方案的代码片段。

import aws from "aws-sdk";

var roleToAssume = {RoleArn: 'arn:aws:iam::<accountid>:role/<rolename>',
                    RoleSessionName: 'example',
                    DurationSeconds: 900,};

var sts = new aws.STS({ region: '<region>'});

sts.assumeRole(roleToAssume, function(err, data) {
    if (err) 
    {
      console.log(err, err.stack);
    }
    else
    {
      aws.config.update({
          accessKeyId: data.Credentials?.AccessKeyId,
          secretAccessKey: data.Credentials?.SecretAccessKey,
          sessionToken: data.Credentials?.SessionToken
      })
    
      // Redshift code here...
    }
});



    

© www.soinside.com 2019 - 2024. All rights reserved.