iOSアプリからAmazon S3へファイルアップロード

ここ最近、某iOSアプリ案件を一緒に進めているパートナー会社のエンジニアさんを、技術面で少しだけサポートさせていただいたりしています(知ってる範囲で質問に答えるだけですが)。

で、その某iOSアプリ案件、AWSとの連携があるかも…という流れになってきました。僕の担当パートではないのですが、多少興味もあったことからAmazon S3へファイルをアップロードするiOSアプリを試作してみました。

試作アプリはGitHubにアップしていますので、誤りとか、もっと良い方法とかあれば、フィードバックをいただけると嬉しいです。

以下、試作アプリをつくった手順について、簡単に解説していきます。

試作アプリの概要

アプリ内に画像ファイルやテキストファイルが混在したディレクトリを用意しておき、アップロードボタンをタップしたら同ディレクトリを圧縮したzipファイルを生成、Amazon S3へアップロードするというものです。

開発に必要なもの

  • Xcodeインストール済みのMac
  • AWS (Amazon Web Services)アカウント

開発の手順

(1) Amazon S3にバケットを作成する。

まずは、AWSにサインインして、ファイルのアップロード先となるバケットをAmazon S3に作成します。

(1)-1 [サービス]をクリック → [S3]をクリック

※画像クリックで拡大 (以下同)

(1)-2 [バケットを作成]をクリック

(1)-3 [バケット名]に適当な名前を入力 → [作成]をクリック

以上でバケットの完成です。

(2) Amazon CognitoでIDプールを作成する。

Amazon S3にバケットを作成したものの、バケットへのアップロードを許可していないため、iOSアプリからファイルをアップロードすることができません。iOSアプリからAmazon S3へファイルをアップロードできるように、Amazon CognitoでIDプールを作成します。

(2)-1 [サービス]をクリック → 検索ボックスに”cog”と入力 → 検索結果に表示される[Cognito]をクリック

(2)-2 [フェデレーテッドアイデンティティの管理]をクリック

(2)-3 [新しいIDプールの作成]をクリック

(2)-4 [IDプール名]に適当な名前を入力 → [認証されていないIDに対してアクセスを有効にする]をチェック → [プールの作成]をクリック

ちなみに、[認証されていないIDに対してアクセスを有効にする]とは、言い換えると”ゲストユーザのアクセスを有効にする”という意味です。ゲストユーザにアクセスさせたくないときは、同チェックを外して、すぐ下にある[認証プロバイダー]の設定や、IAMでIDプロバイダーの作成などを行う必要があります(この記事では解説しません)。

(2)-5 [詳細を表示]をクリック

認証されたロールの設定欄と、認証されていないロールの設定欄が表示されます。

(2)-6 認証されたロールの[ポリシードキュメントを表示]をクリック

認証されたロールのポリシードキュメントが表示されます。

(2)-7 [編集]をクリック

[ポリシーの編集]ダイアログボックスが表示されます。

(2)-8 [Documentation]を参照 → [OK]をクリック

これで認証されたロールのポリシードキュメントが編集できるようになります。

(2)-9 認証されたロールのポリシードキュメントにAmazon S3へのアップロードを許可する記述を入力

これで認証されたロールの設定ができました。認証されていないロールについても(2)-6〜(2)-9と同様の手順で設定を行います。

(2)-10 認証されていないロールのポリシードキュメントにAmazon S3へのアップロードを許可する記述を入力 → [許可]をクリック

以上で、AWSでの設定は完了です。これ以降、(1)で作成したAmazon S3のバケットに対して、Amazon Cognito経由でアクセスしたユーザにのみ、ファイルアップロードが許可されることになります。

このあと、Amazon Cognito認証情報プロバイダーを初期化するためのサンプルコードが表示されます。

(2)-11 [プラットフォーム]で”iOS – Swift”を選択 → 表示されたサンプルコードを控えておく

(3) Xcodeプロジェクトに外部ライブラリを追加する。

ここからは、Xcodeプロジェクトでの作業になります。まずはPodfileを作成し、Amazon S3とAmazon Cognitoを扱うライブラリAWSS3とAWSCognitoを追加。加えて、Amazon S3にファイルをアップロードする際はデータサイズをできるだけ小さくしたいので、ファイル圧縮ライブラリSSZipArchiveも追加します。

上記コードの9〜11行目がライブラリ追加の記述になります(ライブラリのインストール方法等の詳細は割愛)。

(4) Amazon Cognito認証情報プロバイダーを初期化する。

次に、Amazon S3へアクセスする際に必要となる証明書の提供を受けるため、Amazon Cognito認証情報プロバイダーを初期化します。具体的には、AppDelegate.swiftでAWSCognitoをインポートし、application:didFinishLaunchingWithOptions:メソッド内に手順(2)-11で控えておいたサンプルコードを追加します。

上記コードの13〜15行目の各パラメータ値は、各自の設定によって異なります。

(5) 対象ディレクトリを圧縮、Amazon S3へアップロードする。

あとは、ViewController.swiftに、zipファイルの生成やAmazon S3へのアップロード等の処理を実装して完了です。SSZipArchiveとAWSS3のインポートを忘れずに。

今回の試作アプリでは、アップロードボタンがタップされたら確認ダイアログを表示 → パスワード付きzipファイル生成 → zipファイルをAmazon S3へアップロード → アップロード完了のダイアログを表示、という流れになっています。

上記コードの89行目でセットしているバケット名は、手順(1)-3で入力した名前を使います。また、123〜126行目のエラー処理は、エラーメッセージのコンソール出力のみ行っています。できればアラートを表示するなどして、ユーザに異常を知らせるようにしたいところです。

以上、iOSアプリからAmazon S3へファイルをアップロードする方法の解説でした。

(参考URL)

Comments