![](/img/trans.png)
[英]Can't access S3 bucket from within Fargate container (Bad Request and unable to locate credentials)
[英]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.