【问题标题】:In Fargate container why can I CRUD S3 but can't create a presigned post在 Fargate 容器中,为什么我可以 CRUD S3 但无法创建预签名帖子
【发布时间】:2022-03-16 21:43:15
【问题描述】:

我在 docker 容器中使用节点,并且在本地使用我的 IAM 密钥来创建、读取和删除文件到 S3 存储桶以及创建预签名的帖子。在 Fargate 容器上启动时,我创建一个 taskRole 并附加一个策略,使其能够完全访问 S3。

    taskRole.attachInlinePolicy(
      new iam.Policy(this, `${clientPrefix}-task-policy`, {
        statements: [
          new iam.PolicyStatement({
            effect: iam.Effect.ALLOW,
            actions: ['S3:*'],
            resources: ['*'],
          }),
        ],
      })
    );

有了这个角色,我可以毫无问题地创建、读取和删除 API 文件。但是,当 API 尝试创建预签名帖子时,我收到错误消息:

Error: Unable to create a POST object policy without a bucket, region, and credentials

我可以运行其他操作对我来说似乎非常奇怪,但它会因 presignedPOST 而失败,特别是因为我的 S3 操作都被允许。

    const post: aws.S3.PresignedPost = await s3.createPresignedPost({
      Bucket: bucket,
      Fields: { key },
      Expires: 60,
      Conditions: [['content-length-range', 0, 5242880]],
    });

这是我使用的代码。我正在记录存储桶和密钥,所以我很肯定它们是有效值。我的一个想法是在本地运行时,我将运行 aws.configure 来设置我的密钥,但在 Fargate 中我故意省略了这一点。我认为它获得了正确的密钥,因为其他 s3 操作正常工作。我接近这个了吗?

【问题讨论】:

    标签: amazon-s3 amazon-iam aws-fargate


    【解决方案1】:

    在将 IAM 角色凭证与 AWS sdk 一起使用时,您必须使用 createPresignedPost 的异步(回调)版本,或保证在调用此方法的 await 版本之前已解析您的凭证。

    这样的事情将适用于基于 IAM 的凭据:

    const s3 = new AWS.S3()
    
    const _presign = params => {
      return new Promise((res, rej) => {
        s3.createPresignedPost(params, (err, data) => {
          if (err) return rej(err)
          return res(data)
        })
      })
    }
    
    // await _presign(...)  <- works
    // await s3.createPresignedPost(...)  <- won't work
    
    

    参考:https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#createPresignedPost-property

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-10
      • 2021-12-28
      • 2019-11-06
      • 1970-01-01
      • 2020-06-06
      • 2019-11-19
      • 2020-07-01
      相关资源
      最近更新 更多