簡體   English   中英

在 Fargate 容器中,為什么我可以 CRUD S3 但無法創建預簽名帖子

[英]In Fargate container why can I CRUD S3 but can't create a presigned post

我在 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 操作沒有失敗。 我接近這個權利嗎?

將 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM