転送を使用して、ユーザーに固有のフォルダからAWS S3からiOSモバイルアプリにファイルをダウンロードしようとしていますManagerは、そのよう:
@IBAction func download() {
let transferManager = AWSS3TransferManager.default()!
let downloadingFileURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("disney1.jpg")
let downloadRequest = AWSS3TransferManagerDownloadRequest()!
downloadRequest.bucket = "sidestreamx"
// user's UUID/disney1
downloadRequest.key = "631d121f-b294-4318-b3cd-36b3b74ebdff/disney1"
downloadRequest.downloadingFileURL = downloadingFileURL
transferManager.download(downloadRequest).continue(with: AWSExecutor.mainThread(), with: {
(task: AWSTask<AnyObject>) -> Any? in
if let error = task.error as? NSError {
// handle error
return nil
}
self.imageView.image = UIImage(contentsOfFile: downloadingFileURL.path)
return nil
})
}
マイIAMロール権限ポリシーはthis AWS docから得て、次のようである:私が得る
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "GetBucketListIfRequestIsForUser",
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::sidestreamx"
],
"Condition": {
"StringLike": {
"s3:prefix": [
"${cognito-identity.amazonaws.com:sub}/*"
]
}
}
},
{
"Sid": "S3GetObjects",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::sidestreamx/${cognito-identity.amazonaws.com:sub}/*"
]
}
]
}
応答
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>E1F205B58EF4A670</RequestId>
<HostId>dUWI8PfVZL3mJmykjhXRqvFd1yt/CqDFNlwgwD3kmLk2vrMBP6JvVgezMYSROt3KyE3dx0+3eDE=</HostId>
</Error>
です
ユーザーは、AWS Cognito User Pool & Cognito Federated Identitiesで認証されます。デバッグしてJWTトークンを抽出し、sub = "631d121f-b294-4318-b3cd-36b3b74ebdff"
を確認しました。私も、要求/応答を見るためにCharlesを使用しました。私はarn:aws:s3:::sidestreamx/631d121f-b294-4318-b3cd-36b3b74ebdff/*
を取得するために631d121f-b294-4318-b3cd-36b3b74ebdff
で最後の文S3GetObjects
で${cognito-identity.amazonaws.com:sub}
を交換あれば
は動作しません。最初のステートメントは引き続きポリシー変数を持つことができ、それでも動作します。私は最初のステートメントを完全に削除すればうまくいくでしょう!それは、ポリシー変数を最後のステートメントに追加するときです。
私はこのStack Overflowの質問とthis oneをチェックアウトしましたが、役に立たないです。だから私は知らない。私はほぼ9時間以上働いていたので、どんな援助も誠実に感謝するだろう。
混乱して申し訳ありません。はい、ポリシー変数は、Cognito Federated IdentityのアイデンティティIDを参照します。ユーザープールのフィールドではなく、間違った用語が重複しています。 –
ありがとうございました!それは私のCognitoユーザーの属性の 'サブ'と一致しなかった 'サブ'を認識するのに半日かかりました。そして、GitHubの問題の1つの記事の反対だった。 – PeterB