はじめに
AWS Amplifyを用いることでバックエンドの構成をほぼ意識することなくAPI, 認証、データベースなどをAWS環境に構築し、フロントエンドアプリケーションから呼び出すことができます。
REST APIを作成すると、Amazon API GatewayとAWS Lambdaを用いたイベント駆動型の環境を構築できます。ですが、ユースケースによってはイベント駆動ではなく、常駐型のサーバが適切な場合もあるかと思います。
AWS Amplifyではプロジェクト設定を変更することで、このようなケースにコンテナを用いて対応することができます。
今回は、AWS Amplifyを用いてコンテナREST APIをデプロイし、iOSアプリと通信したいと思います。
環境
Amplify CLI: v10.0.0
Xcode: v14.0.1
手順
- Xcodeプロジェクトを作成します。
- Xcodeプロジェクトディレクトリ直下でAmplify CLIを用いて
amplify init
でAmplify プロジェクトを初期化します。 - Amplify CLIを用いて
amplify configure project
を実行し、container-based deploymentsを有効にします。
上記の手順を実施することで、コンテナREST APIをデプロイする準備が整います。
iOSアプリからコンテナREST APIに通信する
コンテナREST APIをデプロイした場合もiOSアプリとAPIのインターフェイスは、Amazon API Gatewayです。
これは、AWS Amplify標準のREST API (Amazon API Gateway, AWS Lambda)と同じ構成です。
ですので、iOSアプリからのリクエストはAmplifyライブラリのAPIカテゴリを用いることができます。
// デプロイしたREST APIのパスを指定する
let request = RESTRequest(path: "/")
Amplify.API.post(request: request) { result in
switch result {
case .success(let data):
let str = String(decoding: data, as: UTF8.self)
print("Success \(str)")
case .failure(let apiError):
print("Failed", apiError)
}
}
コンテナREST APIの実態
AWS AmplifyでコンテナAPIを有効にすることで実際には以下のAWSリソースがデプロイ・利用されています。
- Amazon VPC
- Amazon API Gateway
- AWS Fargate (Amazon ECSがコントロールプレーン)
- Amazon ECR
- AWS Cloud Map
- AWS CodePipeline
- AWS CodeBuild
Tips
-
amplify configure project
を実行し、container-based deploymentsを有効にするとamplify/.config/project-config.json
のfrontend
keyの値がjavascriptに変更されてしまいます。そのため、Amplify + iOSプロジェクトに必要なawsconfiguration.json
とamplifyconfiguration.json
が消えてしまいます。amplify configure project
を再度実行し、必要なファイルを再生成する必要がありました。 -
amplify env remove <env-name>
で環境を削除してもAmazon ECR上のリポジトリは削除されませんでした。手動で削除するなどの対応が必要です。
Graviton2を指定できないのカナ!?
AmplifyのコンテナAPIはAWS Fargateをデータプレーンとします。既定のCPUアーキテクチャはx86_64です。ARMプロセッサ環境で問題なくコンテナが動作するようであれば、性能と価格が優れているAWS Gravitonプロセッサを選択したいです。ただ、Amplify CLIで作成したCloudFormationテンプレートを編集して再デプロイ等試してみましたが、AWS FargateにGraviton2を指定することができませんでした。有識者の方やり方あったら教えてください。