S3 存储桶 Lambda 事件:无法验证以下目标配置

新手上路,请多包涵

我正在尝试创建一个 S3 存储桶并立即为其分配一个 lambda 通知事件。

这是我编写的节点测试脚本:

 const aws = require('aws-sdk');
const uuidv4 = require('uuid/v4');

aws.config.update({
  accessKeyId: 'key',
  secretAccessKey:'secret',
  region: 'us-west-1'
});

const s3 = new aws.S3();

const params = {
  Bucket: `bucket-${uuidv4()}`,
  ACL: "private",
  CreateBucketConfiguration: {
    LocationConstraint: 'us-west-1'
  }
};

s3.createBucket(params, function (err, data) {
  if (err) {
    throw err;
  } else {
    const bucketUrl = data.Location;

    const bucketNameRegex = /bucket-[a-z0-9\-]+/;
    const bucketName = bucketNameRegex.exec(bucketUrl)[0];

    const params = {
      Bucket: bucketName,
      NotificationConfiguration: {
        LambdaFunctionConfigurations: [
          {
            Id: `lambda-upload-notification-${bucketName}`,
            LambdaFunctionArn: 'arn:aws:lambda:us-west-1:xxxxxxxxxx:function:respondS3Upload',
            Events: ['s3:ObjectCreated:CompleteMultipartUpload']
          },
        ]
      }
    };

    // Throws "Unable to validate the following destination configurations" until an event is manually added and deleted from the bucket in the AWS UI Console
    s3.putBucketNotificationConfiguration(params, function(err, data) {
      if (err) {
        console.error(err);
        console.error(this.httpResponse.body.toString());
      } else {
        console.log(data);
      }
    });
  }
});

创建工作正常,但从 --- 调用 s3.putBucketNotificationConfiguration aws-sdk 会抛出:

 { InvalidArgument: Unable to validate the following destination configurations
    at Request.extractError ([...]/node_modules/aws-sdk/lib/services/s3.js:577:35)
    at Request.callListeners ([...]/node_modules/aws-sdk/lib/sequential_executor.js:105:20)
    at Request.emit ([...]/node_modules/aws-sdk/lib/sequential_executor.js:77:10)
    at Request.emit ([...]/node_modules/aws-sdk/lib/request.js:683:14)
    at Request.transition ([...]/node_modules/aws-sdk/lib/request.js:22:10)
    at AcceptorStateMachine.runTo ([...]/node_modules/aws-sdk/lib/state_machine.js:14:12)
    at [...]/node_modules/aws-sdk/lib/state_machine.js:26:10
    at Request.<anonymous> ([...]/node_modules/aws-sdk/lib/request.js:38:9)
    at Request.<anonymous> ([...]/node_modules/aws-sdk/lib/request.js:685:12)
    at Request.callListeners ([...]/node_modules/aws-sdk/lib/sequential_executor.js:115:18)
  message: 'Unable to validate the following destination configurations',
  code: 'InvalidArgument',
  region: null,
  time: 2017-11-10T02:55:43.004Z,
  requestId: '9E1CB35811ED5828',
  extendedRequestId: 'tWcmPfrAu3As74M/0sJL5uv+pLmaD4oBJXwjzlcoOBsTBh99iRAtzAloSY/LzinSQYmj46cwyfQ=',
  cfId: undefined,
  statusCode: 400,
  retryable: false,
  retryDelay: 4.3270874729153475 }

<?xml version="1.0" encoding="UTF-8"?>
<Error>
    <Code>InvalidArgument</Code>
    <Message>Unable to validate the following destination configurations</Message>
    <ArgumentName1>arn:aws:lambda:us-west-1:xxxxxxxxxx:function:respondS3Upload, null</ArgumentName1>
    <ArgumentValue1>Not authorized to invoke function [arn:aws:lambda:us-west-1:xxxxxxxxxx:function:respondS3Upload]</ArgumentValue1>
    <RequestId>9E1CB35811ED5828</RequestId>
    <HostId>tWcmPfrAu3As74M/0sJL5uv+pLmaD4oBJXwjzlcoOBsTBh99iRAtzAloSY/LzinSQYmj46cwyfQ=</HostId>
</Error>

我已经使用分配给 lambda 的角色运行它,我认为这是它需要的所有策略。我可能会遗漏一些东西。我正在使用我的根访问密钥来运行此脚本。

角色

我认为这可能是一个计时错误,S3 在添加事件之前需要时间来创建存储桶,但我等了一会儿,硬编码存储桶名称,然后再次运行我的脚本,这会引发相同的错误。

奇怪的是,如果我在 S3 UI 中创建事件挂钩并立即将其删除,如果我将存储桶名称硬编码到其中,我的脚本就可以工作。似乎在 UI 中创建事件会增加一些所需的权限,但我不确定 SDK 或控制台 UI 中会是什么。

S3 事件配置

有什么想法或事情可以尝试吗?谢谢你的帮助

原文由 Scotty Waggoner 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 809
2 个回答

您收到此消息是因为您的 s3 存储桶缺少调用 lambda 函数的权限。

根据 AWS 文档!需要两种类型的权限:

  1. 您的 Lambda 函数调用服务的权限
  2. Amazon S3 调用您的 Lambda 函数的权限

您应该创建一个“AWS::Lambda::Permission”类型的对象,它看起来应该类似于:

 {
  "Version": "2012-10-17",
  "Id": "default",
  "Statement": [
    {
      "Sid": "<optional>",
      "Effect": "Allow",
      "Principal": {
        "Service": "s3.amazonaws.com"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "<ArnToYourFunction>",
      "Condition": {
        "StringEquals": {
          "AWS:SourceAccount": "<YourAccountId>"
        },
        "ArnLike": {
          "AWS:SourceArn": "arn:aws:s3:::<YourBucketName>"
        }
      }
    }
  ]
}

原文由 davor.obilinovic 发布,翻译遵循 CC BY-SA 3.0 许可协议

时隔一年终于又看了一遍。这是我们重新审视的去年的黑客马拉松项目。 @davor.obilinovic 的回答非常有助于指出我需要添加的 Lambda 权限。仍然花了我一点时间来弄清楚我需要它看起来像什么。

这是 AWS JavaScript SDK 和 Lambda API 文档 https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html#addPermission-property https://docs.aws.amazon.com/lambda/latest /dg/API_AddPermission.html

JS SDK 文档有这一行:

 SourceArn: "arn:aws:s3:::examplebucket/*",

我无法让它工作很长时间并且仍然收到 Unable to validate the following destination configurations 错误。

将其更改为

SourceArn: "arn:aws:s3:::examplebucket",

解决了那个问题。 /* 显然是错误的,我应该更仔细地查看我在这里得到的答案,但我试图遵循 AWS 文档。

在开发了一段时间并创建了许多存储桶、Lambda 权限和 S3 Lambda 通知之后,调用 addPermission 开始抛出一个 The final policy size (...) is bigger than the limit (20480). 为每个存储桶添加新的、单独的权限将它们添加到 Lambda 函数策略的底部并且显然该政策有最大尺寸。

该策略在 AWS 管理控制台中似乎不可编辑,因此我很乐意使用 SDK 删除每个条目。我复制了策略 JSON,拉出 Sid 并在循环中调用 removePermission (这引发了速率限制错误,我不得不多次运行它)。

最后,我发现省略 SourceArn 密钥将授予 Lambda 对所有 S3 存储桶的权限。

这是我使用 SDK 添加所需权限的最终代码。我只是为我的功能运行了一次。

 const aws = require('aws-sdk');

aws.config.update({
  accessKeyId:     process.env.AWS_ACCESS,
  secretAccessKey: process.env.AWS_SECRET,
  region:          process.env.AWS_REGION,
});

// Creates Lambda Function Policy which must be created once for each Lambda function
// Must be done before calling s3.putBucketNotificationConfiguration(...)
function createLambdaPermission() {
  const lambda = new aws.Lambda();

  const params = {
    Action:        'lambda:InvokeFunction',
    FunctionName:  process.env.AWS_LAMBDA_ARN,
    Principal:     's3.amazonaws.com',
    SourceAccount: process.env.AWS_ACCOUNT_ID,
    StatementId:   `example-S3-permission`,
  };

  lambda.addPermission(params, function (err, data) {
    if (err) {
      console.log(err);
    } else {
      console.log(data);
    }
  });
}

原文由 Scotty Waggoner 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题