ストレージの設定
このガイドでは、Amplify アプリでストレージを設定する方法を学びます。バックエンドリソースを設定し、ファイルの一覧表示、アップロード、ダウンロードを有効にします。
まだ Amplify アプリを作成していない場合は、クイックスタートガイドをご覧ください。
Amplify Storage は、Amazon Simple Storage Service(Amazon S3)の上に構築されたファイルストレージおよび管理機能をフロントエンド Web およびモバイルアプリにシームレスに統合します。コアファイル操作用の直感的な API と UI コンポーネントを提供し、開発者がクラウドサービスの複雑さに対処することなく、スケーラブルで安全なファイルストレージソリューションを構築できるようにします。
ストレージバックエンドの構築
最初に、amplify/storage/resource.ts ファイルを作成します。このファイルは、ストレージバックエンドを設定する場所です。defineStorage 関数を使用してストレージをインスタンス化し、ストレージバケットの name を指定します。この name はバックエンド設定でバケットを識別するためのフレンドリー名です。Amplify は UUID を使用してアプリの一意の識別子を生成します。name 属性はアプリで使用するためのものです。
import { defineStorage } from '@aws-amplify/backend';
export const storage = defineStorage({ name: 'amplifyTeamDrive'});バックエンド定義を含む amplify/backend.ts ファイルにストレージ定義をインポートします。defineBackend にストレージを追加します。
import { defineBackend } from '@aws-amplify/backend';import { auth } from './auth/resource';import { storage } from './storage/resource';
defineBackend({ auth, storage});npx ampx sandbox を実行するか、Amplify にアプリをデプロイすると、ファイルが保存される Amazon S3 バケットが設定されます。ストレージ内のファイルをアプリケーションでアクセスする前に、ストレージアクセスルールを設定する必要があります。
これらの変更をデプロイするには、変更を git にコミットし、変更をアップストリームにプッシュします。Amplify の CI/CD システムが自動的に変更を検出し、ビルドとデプロイを実行します。
git commit -am "add storage backend"git pushファイルパスアクセスの定義
デフォルトでは、ユーザーやその他のプロジェクトリソースはストレージバケット内のファイルにアクセスできません。アクセスは defineStorage 内の access コールバックを使用して明示的に許可する必要があります。
アクセスコールバックはオブジェクトを返します。このオブジェクトの各キーはファイルパスであり、各値はそのパスに適用されるアクセスルールの配列です。
以下の例は、一般的な写真共有アプリのファイルストレージ構造を設定する方法を示しています。ここでは、
- ゲストはすべてのプロフィール画像を表示でき、プロフィール画像をアップロードしたユーザーのみが置き換えまたは削除できます。ユーザーはこの場合、Identity Pool ID(identityID)で識別されます。
- すべてのユーザーが画像を送信できる一般的なプールもあります。
export const storage = defineStorage({ name: 'amplifyTeamDrive', access: (allow) => ({ 'profile-pictures/{entity_id}/*': [ allow.guest.to(['read']), allow.entity('identity').to(['read', 'write', 'delete']) ], 'picture-submissions/*': [ allow.authenticated.to(['read','write']), allow.guest.to(['read', 'write']) ], })});追加のストレージバケットを設定する
Amplify Storage は、複数のストレージリソースを自動的にプロビジョニングおよび管理するようにバックエンドを設定する柔軟性を提供します。
同じ defineStorage 関数を使用して追加のストレージバケットを定義し、ストレージバケットを識別するための一意の説明的な name を指定できます。この name をストレージ API に渡して、アクションを実行するバケットを指定できます。定義したストレージバケット間でこの name 属性が一意であることを確認して、正しいバケットを確実に識別し、競合を防いでください。
追加のストレージバケットが定義されている場合、そのうちの 1 つを isDefault フラグでデフォルトとしてマークする必要があります。
export const firstBucket = defineStorage({ name: 'firstBucket', isDefault: true, // デフォルトストレージバケットを識別(必須)});
export const secondBucket = defineStorage({ name: 'secondBucket', access: (allow) => ({ 'private/{entity_id}/*': [ allow.entity('identity').to(['read', 'write', 'delete']) ] })})バックエンド定義に追加のストレージリソースを追加します。
import { defineBackend } from '@aws-amplify/backend';import { auth } from './auth/resource';import { firstBucket, secondBucket } from './storage/resource';
defineBackend({ auth, firstBucket, secondBucket});ストレージバケットクライアントの使用
追加のストレージバケットは、Amplify Storage API に bucket オプションを渡すことでアプリケーションコードから参照できます。Amplify Backend で割り当てられたターゲットバケットの名前を指定できます。
StorageBucket secondBucket = StorageBucket.fromOutputs("secondBucket");StorageDownloadFileOptions options = StorageDownloadFileOptions.builder().bucket(secondBucket).build();Amplify.Storage.downloadFile( StoragePath.fromString("public/example"), new File(getApplicationContext().getFilesDir() + "/download.txt"), options, result -> Log.i("MyAmplifyApp", "Successfully downloaded: " + result.getFile().getName()), error -> Log.e("MyAmplifyApp", "Download Failure", error));val secondBucket = StorageBucket.fromOutputs("secondBucket")val options = StorageDownloadFileOptions.builder().bucket(secondBucket).build()val file = File("${applicationContext.filesDir}/download.txt")Amplify.Storage.downloadFile(StoragePath.fromString("public/example"), file, option, { Log.i("MyAmplifyApp", "Successfully downloaded: ${it.file.name}") }, { Log.e("MyAmplifyApp", "Download Failure", it) })val secondBucket = StorageBucket.fromOutputs("secondBucket")val options = StorageDownloadFileOptions.builder().bucket(secondBucket).build()val file = File("${applicationContext.filesDir}/download.txt")val download = Amplify.Storage.downloadFile(StoragePath.fromString("public/example"), file, options)try { val fileName = download.result().file.name Log.i("MyAmplifyApp", "Successfully downloaded: $fileName")} catch (error: StorageException) { Log.e("MyAmplifyApp", "Download Failure", error)}StorageBucket secondBucket = StorageBucket.fromOutputs("secondBucket");StorageDownloadFileOptions options = StorageDownloadFileOptions.builder().bucket(secondBucket).build();RxProgressAwareSingleOperation<StorageDownloadFileResult> download = RxAmplify.Storage.downloadFile( StoragePath.fromString("public/example"), new File(getApplicationContext().getFilesDir() + "/download.txt"), options );
download .observeResult() .subscribe( result -> Log.i("MyAmplifyApp", "Successfully downloaded: " + result.getFile().getName()), error -> Log.e("MyAmplifyApp", "Download Failure", error) );また、コンソールからバケット名とリージョンを指定してオブジェクトを渡すこともできます。各 Amplify Storage API ページで追加の使用例を確認してください。
BucketInfo bucketInfo = new BucketInfo("second-bucket-name-from-console", "us-east-2");StorageBucket secondBucket = StorageBucket.fromBucketInfo(bucketInfo);StorageDownloadFileOptions options = StorageDownloadFileOptions.builder().bucket(secondBucket).build();Amplify.Storage.downloadFile( StoragePath.fromString("public/example"), new File(getApplicationContext().getFilesDir() + "/download.txt"), options, result -> Log.i("MyAmplifyApp", "Successfully downloaded: " + result.getFile().getName()), error -> Log.e("MyAmplifyApp", "Download Failure", error));val bucketInfo = BucketInfo("second-bucket-name-from-console", "us-east-2")val secondBucket = StorageBucket.fromBucketInfo(bucketInfo)val options = StorageDownloadFileOptions.builder().bucket(secondBucket).build()val file = File("${applicationContext.filesDir}/download.txt")Amplify.Storage.downloadFile(StoragePath.fromString("public/example"), file, options, { Log.i("MyAmplifyApp", "Successfully downloaded: ${it.file.name}") }, { Log.e("MyAmplifyApp", "Download Failure", it) })val bucketInfo = BucketInfo("second-bucket-name-from-console", "us-east-2")val secondBucket = StorageBucket.fromBucketInfo(bucketInfo)val options = StorageDownloadFileOptions.builder().bucket(secondBucket).build()val file = File("${applicationContext.filesDir}/download.txt")val download = Amplify.Storage.downloadFile(StoragePath.fromString("public/example"), file, options)try { val fileName = download.result().file.name Log.i("MyAmplifyApp", "Successfully downloaded: $fileName")} catch (error: StorageException) { Log.e("MyAmplifyApp", "Download Failure", error)}BucketInfo bucketInfo = new BucketInfo("second-bucket-name-from-console", "us-east-2");StorageBucket secondBucket = StorageBucket.fromBucketInfo(bucketInfo);StorageDownloadFileOptions options = StorageDownloadFileOptions.builder().bucket(secondBucket).build();RxProgressAwareSingleOperation<StorageDownloadFileResult> download = RxAmplify.Storage.downloadFile( StoragePath.fromString("public/example"), new File(getApplicationContext().getFilesDir() + "/download.txt"), options, );
download .observeResult() .subscribe( result -> Log.i("MyAmplifyApp", "Successfully downloaded: " + result.getFile().getName()), error -> Log.e("MyAmplifyApp", "Download Failure", error) );ストレージ削除動作の設定
デフォルトでは、ストレージリソースを削除するか Amplify アプリを削除するときに、Amplify は S3 バケットとそのすべてのオブジェクトを削除します。バケットとそのデータを保持するには、keepOnDelete を true に設定します。
export const storage = defineStorage({ name: 'myProjectFiles', // リソースが削除されたときにバケットを保持する keepOnDelete: true,});| 設定 | 動作 |
|---|---|
keepOnDelete: false(デフォルト) | バケットとそのすべてのオブジェクトは削除時に削除されます。 |
keepOnDelete: true | バケットは削除時に保持されます。不要になった場合は手動で削除する必要があります。 |
アプリコードをストレージバックエンドに接続する
Amplify Storage ライブラリは、定義したバックエンドリソースに接続するクライアント API を提供します。
前提条件
- Android API レベル 24(Android 7.0)以上を対象とする Android アプリケーション
- Android プロジェクトの作成の完全な例については、クイックスタートガイドに従ってください。
Amplify ライブラリをインストールする
Gradle Scripts を展開し、build.gradle (Module: app) を開きます。クイックスタートガイドの手順に従って Amplify をすでに設定しているはずです。
以下のライブラリを dependencies ブロックに追加します。
android { compileOptions { // 最新の Java 機能のサポート isCoreLibraryDesugaringEnabled = true }}
dependencies { // Amplify API 依存関係 implementation("com.amplifyframework:aws-storage-s3:ANDROID_VERSION") implementation("com.amplifyframework:aws-auth-cognito:ANDROID_VERSION") // ... その他の依存関係 coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:ANDROID_DESUGAR_VERSION")}aws-auth-cognito は Amazon S3 への認証を提供するために使用されます。
今すぐ同期 をクリックします。
プロジェクトで Amplify を設定する
Amplify.addPlugin() を呼び出して Amplify Storage を初期化します。初期化を完了するには、Amplify.configure() を呼び出します。
アプリケーションクラスの onCreate() メソッドに以下のコードを追加します。
import android.util.Log;import com.amplifyframework.auth.cognito.AWSCognitoAuthPlugin;import com.amplifyframework.core.Amplify;import com.amplifyframework.core.configuration.AmplifyOutputs;import com.amplifyframework.storage.s3.AWSS3StoragePlugin;Amplify.addPlugin(new AWSCognitoAuthPlugin());Amplify.addPlugin(new AWSS3StoragePlugin());クラスは次のようになります。
public class MyAmplifyApp extends Application { @Override public void onCreate() { super.onCreate();
try { // これらの行を追加して、AWSCognitoAuthPlugin と AWSS3StoragePlugin プラグインを追加します Amplify.addPlugin(new AWSCognitoAuthPlugin()); Amplify.addPlugin(new AWSS3StoragePlugin()); Amplify.configure(AmplifyOutputs.fromResource(R.raw.amplify_outputs), getApplicationContext());
Log.i("MyAmplifyApp", "Initialized Amplify"); } catch (AmplifyException error) { Log.e("MyAmplifyApp", "Could not initialize Amplify", error); } }}import android.util.Logimport com.amplifyframework.auth.cognito.AWSCognitoAuthPluginimport com.amplifyframework.core.Amplifyimport com.amplifyframework.core.configuration.AmplifyOutputsimport com.amplifyframework.storage.s3.AWSS3StoragePluginAmplify.addPlugin(AWSCognitoAuthPlugin())Amplify.addPlugin(AWSS3StoragePlugin())クラスは次のようになります。
class MyAmplifyApp : Application() { override fun onCreate() { super.onCreate()
try { // これらの行を追加して、AWSCognitoAuthPlugin と AWSS3StoragePlugin プラグインを追加します Amplify.addPlugin(AWSCognitoAuthPlugin()) Amplify.addPlugin(AWSS3StoragePlugin()) Amplify.configure(AmplifyOutputs(R.raw.amplify_outputs), applicationContext) Log.i("MyAmplifyApp", "Initialized Amplify") } catch (error: AmplifyException) { Log.e("MyAmplifyApp", "Could not initialize Amplify", error) } }}import android.util.Log;import com.amplifyframework.auth.cognito.AWSCognitoAuthPlugin;import com.amplifyframework.core.configuration.AmplifyOutputs;import com.amplifyframework.rx.RxAmplify;import com.amplifyframework.storage.s3.AWSS3StoragePlugin;RxAmplify.addPlugin(new AWSCognitoAuthPlugin());RxAmplify.addPlugin(new AWSS3StoragePlugin());クラスは次のようになります。
public class MyAmplifyApp extends Application { @Override public void onCreate() { super.onCreate();
try { // これらの行を追加して、AWSCognitoAuthPlugin と AWSS3StoragePlugin プラグインを追加します RxAmplify.addPlugin(new AWSCognitoAuthPlugin()); RxAmplify.addPlugin(new AWSS3StoragePlugin()); RxAmplify.configure(AmplifyOutputs.fromResource(R.raw.amplify_outputs), getApplicationContext());
Log.i("MyAmplifyApp", "Initialized Amplify"); } catch (AmplifyException error) { Log.e("MyAmplifyApp", "Could not initialize Amplify", error); } }}ストレージカテゴリは認証を必要とするため、ストレージカテゴリの機能を使用する前に、ゲストアクセスを設定するか、ユーザーをサインインさせる必要があります。
最初のファイルをアップロードする
次に、picture-submissions/ パスに写真をアップロードしましょう。
private void uploadFile() { File exampleFile = new File(getApplicationContext().getFilesDir(), "myPhoto.png");
try { BufferedWriter writer = new BufferedWriter(new FileWriter(exampleFile)); writer.append("Example file contents"); writer.close(); } catch (Exception exception) { Log.e("MyAmplifyApp", "Upload failed", exception); }
Amplify.Storage.uploadFile( StoragePath.fromString("picture-submissions/myPhoto.png"), exampleFile, result -> Log.i("MyAmplifyApp", "Successfully uploaded: " + result.getPath()), storageFailure -> Log.e("MyAmplifyApp", "Upload failed", storageFailure) );}private fun uploadFile() { val exampleFile = File(applicationContext.filesDir, "myPhoto.png") exampleFile.writeText("Example file contents")
Amplify.Storage.uploadFile(StoragePath.fromString("picture-submissions/myPhoto.png"), exampleFile, { Log.i("MyAmplifyApp", "Successfully uploaded: ${it.path}") }, { Log.e("MyAmplifyApp", "Upload failed", it) } )}private suspend fun uploadFile() { val exampleFile = File(applicationContext.filesDir, "myPhoto.png") exampleFile.writeText("Example file contents")
val upload = Amplify.Storage.uploadFile(StoragePath.fromString("picture-submissions/myPhoto.png"), exampleFile) try { val result = upload.result() Log.i("MyAmplifyApp", "Successfully uploaded: ${result.path}") } catch (error: StorageException) { Log.e("MyAmplifyApp", "Upload failed", error) }}private void uploadFile() { File exampleFile = new File(getApplicationContext().getFilesDir(), "myPhoto.png");
try { BufferedWriter writer = new BufferedWriter(new FileWriter(exampleFile)); writer.append("Example file contents"); writer.close(); } catch (Exception exception) { Log.e("MyAmplifyApp", "Upload failed", exception); }
RxProgressAwareSingleOperation<StorageUploadFileResult> rxUploadOperation = RxAmplify.Storage.uploadFile(StoragePath.fromString("picture-submissions/myPhoto.png"), exampleFile);
rxUploadOperation .observeResult() .subscribe( result -> Log.i("MyAmplifyApp", "Successfully uploaded: " + result.getPath()), error -> Log.e("MyAmplifyApp", "Upload failed", error) );}Amplify コンソールでのファイル管理
ストレージバックエンドをデプロイし、プロジェクトをクライアント API に接続した後、Amplify コンソールでファイルとフォルダを管理できます。コンソールの Storage タブでアップロード、ダウンロード、コピーなどのオンデマンドアクションを実行できます。詳細については、Amplify コンソールでのファイル管理ガイドを参照してください。
まとめ
おめでとうございます!Amplify Storage の設定ガイドを完了しました。このガイドでは、バックエンドリソースを設定して接続し、ファイルパスとアクセス定義をカスタマイズし、アプリケーションをバックエンドに接続してファイルのアップロードとダウンロードなどの機能を実装しました。
次のステップ
Amplify アプリでストレージの設定が完了したので、ファイル管理機能をアプリに追加できます。以下のガイドを使用してアップロード機能とダウンロード機能を実装するか、左側のナビゲーションからさらに多くの機能にアクセスできます。