Flutter で AWS のサービス・リソースにアクセスするときに使うライブラリは、公式には Amplify Flutter に集約されてきており、S3 へのアクセスも amplify_storage_s3 を使うのがスタンダードです。
ただ、アプリケーションで内部的なデータバックアップ目的に S3 を使うなど、
- Cognito の認証は必要ない
- かといってゲストアクセス可能な状態では使いたくない
- アクセスキー・シークレットアクセスキーで手軽に使いたい
というニーズには合いません。
そのような場合に使える Flutter のライブラリもいくつかあるようですが、今回は S3 互換ストレージとして有名な Minio の非公式クライアントライブラリ minio(3.0.0)を使ってみました。
※こちらのアプリケーションに組み込んで使っています。
- hmatsu47/maptool(GitHub)
使い方
ほぼサンプルページにあるとおりですが、東京リージョンの S3 バケットを使う場合は、
- エンドポイントの指定を東京リージョンに合わせる
- リージョンを指定する
必要があります。
※最初に試したとき、サンプルに書かれていなかったのでリージョンの指定を忘れていて時間を溶かしました。
pubspec.yaml
dependencies:
minio: ^3.0.0
初期化
import 'package:minio/io.dart';
import 'package:minio/minio.dart';
final minio = Minio(
endPoint: 's3-ap-northeast-1.amazonaws.com',
region: 'ap-northeast-1',
accessKey: '【アクセスキー】',
secretKey: '【シークレットアクセスキー】',
useSSL: true,
);
前述のとおり、エンドポイントとリージョンの指定がポイントです。
2022/11/3 追記:
minio
の代わりに最新ライブラリに対応したminio_new
が提供されるようになりました。
基本的な使い方に変更はありません。
pubspec.yaml
dependencies:
minio_new: ^1.0.1
- 初期化
import 'package:minio_new/io.dart';
import 'package:minio_new/minio.dart';
アップロード
await minio.fPutObject('【S3バケット名】', '【S3オブジェクトキー名】', '【アップロードするファイルのパス名】');
ダウンロード
import 'dart:io';
final stream = await minio.getObject('【S3バケット名】', '【S3オブジェクトキー名】');
await stream.pipe(File('【ダウンロード先のファイルパス名】').openWrite());
ダウンロードは単純にfGetObject()
ではできないようですね。
その他
残念ながら現時点(3.0.0)では大阪リージョンには対応していないようなので(それ以前にソウルリージョンなども未対応)、大阪リージョンで使いたい場合はこのファイルの内容を書き換える必要がありそうです。