Amazon Web Services ブログ

AWS Amplify を使ってアプリに複数のストレージバケットを追加する方法

AWS Amplify を使えば、あなたのニーズに応じて複数のバケットを構成および管理できます。開発者は、Amplify Storage を活用して、単一または複数のストレージバケットにわたってコンテンツを編成・管理でき、各バケット内の個々のパス単位で詳細なアクセス ルールを適用できます。

今年の初めに、Amazon Simple Storage Service (Amazon S3) と統合し、クラウドベースのファイルストレージを管理するための直感的なアプローチを提供する、新しく改良された Amplify Storage をアナウンスしました (「Amplify Storage: Amplify のフルスタック TypeScript 開発体験から利用できる Amazon S3」)。これに加えて、バックエンド構成と JavaScript Storage API を使って、複数のストレージバケットを構成して接続できるようになったことをお知らせできて嬉しく思います。

複数のストレージバケットを持つ一般的なユースケースは、データ転送速度の向上などの最適化が必要なアプリケーションデータと長期のバックオフィスデータを分離することです。例えば、Amazon S3 Transfer Acceleration を使用してユーザー生成コンテント (写真、動画など) の高速アップロード/ダウンロード用に最適化されたバケットと、レポート、ログ、バックアップなどあまりアクセス頻度が高くない長期アーカイブデータを保存する別のバケットを設定できます。

Amplify Storage では、アップロード、ダウンロード、リスト などの API を以下に対して呼び出すことができます。

  1. Amplify バックエンドで構成されたバケット: これらは Amplify プロジェクトのバックエンド構成で定義、管理されるバケットです。amplify/storage/resource.ts ファイル内で、これらのバケットのバケット名やアクセスルールなどの設定を指定できます。
  2. 既存の S3 バケット: Amazon S3 コンソールで直接作成された Amazon S3 バケットとも連携できます。

Amplify バックエンドで構成されたストレージとアプリを接続する

1. Amplify プロジェクトの初期化

この例では、新しい Next.js プロジェクトを作成します。

npx create-next-app@latest multi-bucket-app

設定手順に従い、「Would you like to use TypeScript?」と尋ねられたら「Yes」を選んでください。

現在のフォルダに「multi-bucket-app」という名前のアプリがあります。この新しいアプリに移動し、AWS Amplify を初期化してください。

>cd multi-bucket-app 
>npm create amplify@latest

このコマンドにより、プロジェクトに以下の構造を持つ「amplify」フォルダが作成されます。

2. Amplify バックエンドでストレージバケットの定義

まず、ユーザープロフィール写真のようなユーザー生成コンテンツを保存するバケットを作成します。認証済みのユーザーが assets/photos/* パスに読み書きできるようにしつつ、ゲストユーザーにはこのパスから読み取りのみできるようにします。

amplify/storage/ の下に新しい resource.ts ファイルを作成します。このファイルで最初のストレージバケットの設定を定義できます。

import { defineStorage } from '@aws-amplify/backend';

 export const userDataBucket = defineStorage({
  name: 'user-data-bucket'
  access: (allow) => ({
    'assets/photos/*': [ 
      allow.guest.to(['read']),
      allow.authenticated.to(['read','write']),
    ] 
  })
});

次に、amplify/backend.ts ファイルで Amplify バックエンド定義にストレージバケットの設定を追加してください。


import { defineBackend } from '@aws-amplify/backend';
import { auth } from './auth/resource';
import { userDataBucket } from './storage/resource';

defineBackend({
 auth,
 userDataBucket 
});

この例では、アプリがユーザー生成コンテンツバケットに対して頻繁に呼び出しを行い、エンドユーザーに関連する写真を表示します。これらの写真をクライアントに素早く配信できるよう、このバケットで Amazon S3 Transfer Acceleration を有効化します。

: Amazon S3 Transfer Acceleration は、大きなオブジェクトの長距離転送時に、Amazon S3 への転送と Amazon S3 からの転送の両方を最大 50~500 % 高速化できます。詳細については、S3 Transfer Acceleration を参照してください。


import { defineBackend } from '@aws-amplify/backend';
import { auth } from './auth/resource';
import { userDataBucket } from './storage/resource';

defineBackend({
 auth,
 userDataBucket 
});

 const { cfnBucket } = backend.userDataBucket.resources.cfnResources ;

 cfnBucket.accelerateConfiguration = {
  accelerationStatus: "Enabled"
}

npx ampx sandbox コマンドを実行すると、Amplify バックエンドのローカルサンドボックス環境が起動するので、アプリをローカルでテストできます。同様に、より多くのストレージバケットを定義する場合は、amplify/storage/resource.ts ファイル内で同じ defineStorage メソッドを使用できます。

import { defineStorage } from '@aws-amplify/backend';

export const userDataBucket = defineStorage({
 name: 'user-data-bucket',
 isDefault: true,
 access: (allow) => ({
   'assets/photos/*': [ 
     allow.guest.to(['read']),
     allow.authenticated.to(['read','write']),
   ] 
 })
});

export const reportingDataBucket = defineStorage({
  name: 'reporting-data-bucket',
  access: (allow) => ({
   'reportingData/logs/*': [ 
     allow.groups(['admins']).to(['read','write']),
   ],
   'reportingData/performance/*': [ 
     allow.groups(['admins']).to(['read','write']),
   ] 
 })
});

複数のストレージバケットを扱う場合は、1 つをデフォルトのバケットに指定する必要があります。そのためには、amplify/storage/resource.ts ファイル内のストレージバケット定義の 1 つで、isDefault プロパティを true に設定します。この指定したデフォルトのバケットは、特定のバケットが提供されていない場合に、Amplify Storage API によって自動的に使用されます。

新しいリソースを amplify/backend.ts にあるバックエンド構成にインポートしてください。


import { defineBackend } from '@aws-amplify/backend';
import { auth } from './auth/resource';
import { userDataBucket, reportingDataBucket } from './storage/resource';

defineBackend({
 auth,
 userDataBucket,
 reportingDataBucket 
});

const { cfnBucket } = backend.userDataBucket.resources.cfnResources ;

cfnBucket.accelerateConfiguration = {
 accelerationStatus: "Enabled"
}

3. Amplify Storage ライブラリを使用して特定のバケットにファイルをアップロード

ストレージバケットにアップロードするには、既存の Amplify Storage API を引き続き使用できます。amplify/storage/resource.ts ファイルで定義されたバケット名を渡してください。バケット名が指定されていない場合は、同じ resource.ts ファイルで構成された既定のバケットにファイルがアップロードされます。

import { uploadData } from 'aws-amplify/storage';

//Set the file variable to the file you want to upload 
 const file: File 

 const { result } = await uploadData({
  path: 'reportingData/logs/08222024.txt',
  data: file,
  options: {
    bucket: 'reporting-data-bucket'
  }
});

他の API のようにダウンロードデータ、リスト、コピーなどで使う S3 バケットも bucket オプションで指定できます。その他の Amplify Storage API については、Amplify Storage のドキュメンテーションを参照してください。

既存の S3 バケットへのアプリケーションの接続

別の方法として、バケット名とリージョンを指定して、既存の Amazon S3 バケットに直接ファイルをアップロードすることもできます。この方法を使えば、Amplify バックエンド構成で定義されていない、カスタム S3 バケットと Amplify Storage ライブラリを併用できます。

既存の S3 バケットにファイルをアップロードするには、Amplify Storage API のオプションとして、実際のバケット名 (Amazon S3 コンソールで確認できるもの) と対応する AWS リージョンを渡してください。Amplify Storage API でカスタム Amazon S3 バケットを使用する手順をご参照ください。

import { uploadData } from 'aws-amplify/storage';

//Set the file variable to the file you want to upload 
 const file: File 

 const { result } = await uploadData({
    path: 'reportingData/logs/08222024.txt',
    data: file,
    options: {
        bucket:{
            bucketName: 'bucket-name-from-s3-console',
            region: 'us-east-2'
        }
    }
});

まとめ

AWS Amplify を使えば、複数のストレージバケットを設定・管理することで、アプリのコンテンツをより適切に整理し分離できるようになりました。ストレージバケットの設定方法の詳細については、Amplify Storage ドキュメントを参照してください。Amplify はオープンソースプロジェクトであり、私たちは常にコミュニティからのフィードバックを求めています。私たちのいずれかのチャネルで皆様からご意見をお聞かせください。Discord で議論に参加するか、GitHub プロジェクトに機能リクエストや不具合報告をお寄せください。

本記事は「Add multiple storage buckets to your app using AWS Amplify – NEW」を翻訳したものです。

翻訳者について

Photo of author

稲田 大陸

AWS Japan で働く筋トレが趣味のソリューションアーキテクト。普段は製造業のお客様を中心に技術支援を行っています。好きな AWS サービスは Amazon Location Service と AWS Amplify で、日本のお客様向けに Amazon Location Service の解説ブログなどを執筆しています。