【问题标题】:dynamoDB 'Requested resource not found' accessing cross aws accountdynamoDB“未找到请求的资源”访问跨 aws 帐户
【发布时间】:2021-07-26 20:15:45
【问题描述】:

假设我们有两个 aws 帐户,帐户名称是 devoprod。所以在 prod 我有一个 dynamoDB 表,我想使用 devo 中存在的 lambda 函数来访问它。 现在我所做的是在 prod 中创建一个策略,该策略提供对 dynamoDB 的完全访问权限,并将该策略附加到 prod 帐户中的 role 中,这使得 devo 为受信任的帐户。 在 devo 中,我创建了一个具有 lambda 完全访问权限的角色,并附加了一个内联策略,该策略允许承担 prodrole >。 此外,我可以通过在 devo 帐户中担任角色,使用 aws 控制台从 dynamoDB 获取数据。

下面是lambda函数:

const AWS = require('aws-sdk');
var cred = new AWS.CredentialProviderChain();
var sts = new AWS.STS({credentials: cred, region: 'us-east-1'});
var crd2 ;
var params = {
  RoleArn: "arn:aws:iam::123456789012:role/crossAccount", 
  RoleSessionName: "atul"
 };
 sts.assumeRole(params, function(err, data) {
   if (err) console.log(err, err.stack); // an error occurred
   else    { 
       crd2 = data;           // successful response
       console.log("Role assured");
   }
 });

const dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10', credentials: crd2, region: 'eu-west-1', endpoint: 'https://dynamodb.eu-west-1.amazonaws.com'});

exports.handler = (event, context, callback) => {
     console.log(crd2);
     console.log("**** " + JSON.stringify(dynamodb));

    dynamodb.getItem({
        TableName: "Testing",
        Key: {
            "Id": {
                S: "1121091591"
            }
        }
    }, function(err, data) {
        if (err) {
            console.log(err, err.stack);
            callback(null, {
                statusCode: '500',
                body: err
            });
        } else {
            console.log(data);
            callback(null, {
                statusCode: '200',
                body: 'Hello '
            });
        }
    })
};

这是我得到的错误:

{
    "message": "Requested resource not found",
    "code": "ResourceNotFoundException",
    "time": "2019-03-05T17:54:35.920Z",
    "requestId": "LAN0EI8B2I6I4CVI4OUH01MI3JVV4KQNSO5AEMVJF66Q9ASUAAJG",
    "statusCode": 400,
    "retryable": false,
    "retryDelay": 11.869537309323096
  }

谢谢

【问题讨论】:

  • 你是如何解决这个问题的?我也面临着类似的问题
  • @TheDominus 这是由于异步调用,我在 STS 返回凭据之前调用 ddb

标签: node.js amazon-web-services aws-lambda amazon-dynamodb amazon-iam


【解决方案1】:

我认为您的代码在 sts 调用完成之前构建 dynamodb 客户端,因为适用于 JavaScript 的 AWS 开发工具包是异步的。我认为您可以通过添加一个长睡眠命令来测试它,看看它是否可以开始工作。一旦您确定这是否是问题所在,AWS 的此页面将帮助您更改代码以正常工作

https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/calling-services-asynchronously.html

【讨论】:

    【解决方案2】:

    Lambda 不承担提供给 lambda 的所有承担角色访问权限。 需要专门要求 lambda 承担特定的角色。

    这是一个简单的 java 实现,假设 IAM 具有访问 DynamoDB 所需的权限

    final AWSSecurityTokenService stsClient =
                    AWSSecurityTokenServiceClientBuilder.standard()
                    .withRegion(REGION)
                    .withCredentials(DefaultAWSCredentialsProviderChain.getInstance())
                    .build();
    
    final AssumeRoleResult assumeRoleResult = stsClient.assumeRole(
                    new AssumeRoleRequest()
                            .withRoleArn("<DynamoDBRoleArn>")
                            .withRoleSessionName("DummyLambdaRoleSessionName"));
    
    final BasicSessionCredentials sessionCredentials = new BasicSessionCredentials(
                    assumeRoleResult.getCredentials().getAccessKeyId(),
                    assumeRoleResult.getCredentials().getSecretAccessKey(),
                    assumeRoleResult.getCredentials().getSessionToken());
    
    return AmazonDynamoDBClientBuilder.standard()
                    .withCredentials(new AWSStaticCredentialsProvider(sessionCredentials))
                    .withRegion(REGION)
                    .build();
    

    【讨论】:

      猜你喜欢
      • 2015-10-11
      • 2017-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-29
      • 1970-01-01
      • 2020-10-01
      相关资源
      最近更新 更多