S3にアップロードしようとしましたが、s3バケットログのログを見ると、次のように表示されます。
mybucket-me [17/Oct/2013:08:18:57 +0000] 120.28.112.39
arn:aws:sts::778671367984:federated-user/[email protected] BB3AA9C408C0D26F
REST.POST.BUCKET avatars/dean%2540player.com/4.png "POST / HTTP/1.1" 403
AccessDenied 231 - 132 - "http://localhost:8080/ajaxupload/test.html" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17" -
アクセスが拒否されました。それが指しているところから、私が見逃しているのはバケットポリシーの追加だけだと思います。だからここに行きます。
メールを使用して、アプリにログインし、アバターをアップロードすることができました。アバターを配置するバケット名はmybucket-meであり、アバターという名前のサブバケットがあります。
-mybucket-me
-avatars
[email protected] //dynamic based on who are logged in
-myavatar.png //image uploaded
バケットポリシーを追加して、Iなどのフェデレーションにs3でのアップロードを許可するにはどうすればよいですかまたはバケットにアップロードする権限を付与できるようにバケットポリシーに追加する正しいステートメントは何ですか?
次のポリシーをバケットに添付できます。
{
"Version": "2008-10-17",
"Id": "Policy1358656005371",
"Statement": [
{
"Sid": "Stmt1354655992561",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:sts::778671367984:federated-user/[email protected]"
]
},
"Action": [
"s3:List*",
"s3:Get*"
],
"Resource": [
"arn:aws:s3:::my.bucket",
"arn:aws:s3:::my.bucket/*"
]
}
]
}
フェデレーションユーザー[email protected]に「my.bucket」への読み取り専用権限を付与します。
このポリシーは、特にこのユーザーに名前を付けるため、あまり維持できません。よりスケーラブルな方法で特定のフェデレーションユーザーのみにアクセスを許可するには、GetFederationTokenを呼び出すときにこれを行うことをお勧めします。 STSコードを投稿すると、そこにポリシーを割り当てることができますが、上記と非常によく似ています。
S3バケットにアップロードするには、次のようにIAM /グループポリシーを追加/作成する必要があります。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::test"]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": ["arn:aws:s3:::test/*"]
}
]
}
どこ arn:aws:s3:::test
はAmazonリソース名(ARN)です。
出典: IAMポリシーの記述:Amazon S3バケットへのアクセスを許可する方法
関連:
あなたは今、次のいずれかをしなければなりません:
acl: 'private'
画像をアップロードするときアイテムが非公開の場合Node.jsの例:
const upload = multer({
storage: multerS3({
s3: s3,
bucket: 'moodboard-img',
acl: 'private',
metadata: function (req, file, cb) {
cb(null, {fieldName: file.fieldname});
},
key: function (req, file, cb) {
cb(null, Date.now().toString())
}
})
})