ファイルアクセスレベル
Storageモジュールは、guest、protected、private の3つの異なるアクセスレベルでファイルを管理できます。Amplify CLIは、ストレージバケット上に3つの異なるアクセスレベル(guest、protected、private)を構成します。amplify add storage を実行すると、CLIはCognito IDプールロールを使用して、バケット上に適切なIAMポリシーを構成します。CRUDベースの権限(Create/Update、Read、Delete)を追加するオプションも用意されているため、認証済みユーザーとゲストユーザーには、これらのレベル内で制限された権限が付与されます。
プロジェクトで amplify add auth を実行してユーザーサインインを以前に有効にしていた場合、ポリシーはIDプール の Authenticated Role に接続されます。これは、各ユーザーIDのバケット内のオブジェクトにスコープされた権限を持っています。ユーザーサインインを構成していない場合、各ユニークなユーザー/デバイスの組み合わせに Unauthenticated Role が割り当てられますが、これでもそのオブジェクトのみにスコープされた権限を持っています。
- Guest: アプリのすべてのユーザーがアクセスできます。ファイルはS3バケット内の
public/パスに保存されます。 - Protected: すべてのユーザーが読み取り可能ですが、作成したユーザーのみが書き込み可能です。ファイルは
protected/{user_identity_id}/に保存され、user_identity_idはそのユーザーの一意のAmazon Cognito Identity IDに対応します。 - Private: 個々のユーザーのみがアクセスできます。ファイルは
private/{user_identity_id}/に保存され、user_identity_idはそのユーザーの一意のAmazon Cognito Identity IDに対応します。
AuthモジュールとStorageモジュールを一緒に使用する場合、/{user_identity_id}/ を手動で構築する必要はありません。ライブラリは、ユーザー/デバイス用に構成されたCognito Identity IDとアクション用に構成されたアクセスレベルを使用します。これには、Storage操作の前に fetchAuthSession を呼び出すUnAuthenticated アクセスが含まれます。詳細については、認証 を参照してください。
アクセスレベルは、Storageオブジェクト上でグローバルに構成できます。または、個別の関数呼び出しでアクセスレベルを設定できます。
Storageモジュールのデフォルトアクセスレベルは
guestです。Storageを別途構成しない限り、アップロードされたすべてのファイルはすべてのユーザーに公開されます。
Storageオブジェクト上のアクセスレベル構成:
import { getUrl } from 'aws-amplify/storage';
await getUrl({ key: 'welcome.png', options: { level: 'guest' } }); // Gets welcome.png in public spaceデフォルトのアクセスレベルは guest です:
import { getUrl } from 'aws-amplify/storage';
await getUrl({ key: 'welcome.png' }); // Get welcome.png in public spaceカスタマイズ(非推奨)
オブジェクトキーパスのカスタマイズ(非推奨)
プレフィックスリゾルバーを定義することで、キーパスをカスタマイズできます:
import amplifyconfig from './amplifyconfiguration.json';
Amplify.configure(amplifyconfig, { Storage: { S3: { prefixResolver: async ({ accessLevel, targetIdentityId }) => { if (accessLevel === 'guest') { return 'myPublicPrefix/'; } else if (accessLevel === 'protected') { return `myProtectedPrefix/${targetIdentityId}/`; } else { return `myPrivatePrefix/${targetIdentityId}/`; } } } }});たとえば、パス myPublicPrefix/ の下のすべてのオブジェクトに対して、読み取り、書き込み、削除の操作を有効にする場合は、IAMポリシーで宣言します:
"Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::your-s3-bucket/myPublicPrefix/*", ] }]myPrivatePrefix/ のようなカスタム private パスプレフィックスを使用する場合は、IAMポリシーに追加する必要があります:
"Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::your-s3-bucket/myPrivatePrefix/${cognito-identity.amazonaws.com:sub}/*" ] }]これにより、認証済みユーザーのみがパスの下のオブジェクトにアクセスできることが保証されます。