在 Fargate 容器中,为什么我可以 CRUD S3 但无法创建预签名帖子



我在docker容器中使用node,在本地我使用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

对我来说,我可以运行其他操作似乎非常奇怪,但它在预签名POST时失败了,尤其是因为我的S3操作都是允许的。

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

这是我使用的代码。我正在记录bucket和key,所以我确信它们是有效的值。我的一个想法是,在本地运行时,我会运行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-属性

最新更新