【问题标题】:Make a cross account call to Redshift Data API对 Redshift Data API 进行跨账户调用
【发布时间】:2021-07-29 18:48:04
【问题描述】:

问题总结:

  • 我们在账户 A 中有一个 AWS Redshift 集群,它有一个名为“产品”的数据库
  • 在账户 B 中,我们有一个 lambda 函数,它需要使用 Redshift 数据 API 针对“产品”执行 SQL 语句
  • 我们在 AWS Secrets Manager 中设置了一个新的密钥,其中包含红移集群凭证。此密钥已与账户 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});
        })
    }
});

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

【问题讨论】:

  • 您需要在账户 A 中创建一个可假定的角色,并使用它来调用数据 API。在这个网站上搜索“assume role in javascript”。
  • 太好了,谢谢。

标签: amazon-web-services api amazon-redshift


【解决方案1】:

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

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...
    }
});



    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    相关资源
    最近更新 更多