Cognito ユーザーが S3 バケットに書き込むことを許可する IAM ポリシーを作成しましたが、Cognito ID に基づいてフォルダーに書き込みを制限したいと考えています。ここでAmazon の指示に従い、次のようなポリシーを作成しました。
{
"Effect": "Allow",
"Action": ["s3:PutObject","s3:GetObject"],
"Resource": [
"arn:aws:s3:::mybucket/myappfolder/${cognito-identity.amazonaws.com:sub}*"
]
}
しかし、AWS iOS SDK の v2 を使用してアップロードしようとすると、アクセス拒否エラーが発生します。
リソースの最後のパス コンポーネントを変更して、SDK から取得し${cognito-identity.amazonaws.com:sub}
た明示的な値に置き換えると、機能します。identityId
AWSCognitoCredentialsProvider
{
"Effect": "Allow",
"Action": ["s3:PutObject","s3:GetObject"],
"Resource": [
"arn:aws:s3:::mybucket/myappfolder/us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx*"
]
}
私の理解では、これらは同じものに等しいはずです。ポリシーに何か不足がありますか? それとも、アップロード リクエストで別のパスを使用する必要がありますか?
**更新**
私はもともとiOSでこの問題を抱えていたので、今夜、node.jsで同じことを試してみましたが、結果は同じです。ノードで使用している簡単なコードは次のとおりです。
var s3 = new AWS.S3();
AWS.config.region = 'us-east-1';
AWS.config.credentials = new AWS.CognitoIdentityCredentials(AWSParams);
AWS.config.credentials.get(function (err) {
if (!err) {
console.log("Cognito Identity Id: " + AWS.config.credentials.identityId);
var bucketName = 'ch123_test_bucket';
var keyName = AWS.config.credentials.identityId + '.txt';
var params = {Bucket: bucketName, Key: keyName, Body: 'Hello World!'};
s3.putObject(params, function (err, data) {
if (err)
console.log(err)
else
console.log("Successfully uploaded data to " + bucketName + "/" + keyName);
});
}
そして、iOS で得られるのと同じ結果が得られます。IAM ポリシーで明示的な cognito ID を提供しない限り、API は 403 で応答します。
IAM ポリシーを最小限に抑えました。これは機能しません:
{
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:PutObject","s3:GetObject"],
"Resource": [
"arn:aws:s3:::ch123_test_bucket/${cognito-identity.amazonaws.com:sub}*"
]
}
]
}
これは次のことを行います。
{
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:PutObject","s3:GetObject"],
"Resource": [
"arn:aws:s3:::ch123_test_bucket/us-east-1:68a5dc49-6cc7-4289-8257-d3d5636f7034*"
]
}
]
}
ここに何が欠けているのかわかりません...私が見つけることができた唯一のドキュメントは、私が使用してきたのと同じリソース値の例を常に示しています。