はじめに
Next.jsのデプロイ先として一番最初に上がる選択肢はVercel
になるかと思います。
Next.jsの最新の機能も使えるため非常に便利ですが、企業によってはプラットフォームをAWSやAzureに寄せているケースがあり、Vercel
は使えないケースも多々あるかと思います。
Next.jsをAWSにデプロイすることは以前から可能となっていましたが、デプロイする先にはさまざまなサービスが候補として挙げられます。
ただ、デプロイするとなるとそれなりにAWSの知識を要することとなり、フロントエンドをメインに担当しているエンジニアには少し敷居が高くなります。
今回は比較的簡単にAWSの知識が薄くてもデプロイが可能なAWS Amplifyを使ってNext.jsのデプロイを行います。
公式ドキュメント
AWS Amplifyの公式ドキュメントにNext.js App Routerのはじめ方が記載されています。
こちらのドキュメントをベースにデプロイ作業を進めていきます。
そして、こちらが今回使うAWS Amplify Next.js (App Router) Starter Template
となります。
2024/11月現在だとNext.jsはVersion 14を使っているようです。
Amplifyにデプロイするためのいくつかの設定ファイルがありますが、詳しい解説は必要となったタイミングで行います。
今回のゴール
AWS公式が用意しているNext.jsテンプレートのリポジトリを使ってAWS Amplifyにデプロイし実際にアクセスできることを確認します。
その後にローカル環境でNext.jsのコード修正を行い、再びAmplifyにデプロイし修正内容が反映されているところまで確認します。
下記のようなTodoを管理するアプリをデプロイしていきます。
AWS Amplifyを利用するための事前準備
- ローカル環境で開発するために、
git
やnode.js
が使える状態であること - AWS アカウントを持っていること
デプロイ手順
それでは早速、デプロイ作業を開始していきます。
まずはテンプレートアプリを自分のリポジトリにコピーします。
公式ドキュメントの「Create repository from template」をクリックするとコピーできます。
AWS Amplifyの画面でGitHubを選択
先ほど作成したリポジトリを選択。
アプリの設定をすることが可能です。
まずはデプロイできることを最優先ということで、そのままでいきます。
設定内容の最終確認です。
画面に記載がありますが、初回のデプロイには2〜5分程度かかります。
デプロイが完了するとアクセス可能なURLがAWSから割り当てられます。
アクセスして下記のような画面が出ましたらデプロイ完了です。
今回提供されているテンプレートアプリはTodoアプリのようです。
+new
をクリックして出てきたダイアログに書き込むとTodoが記録されます。
「宿題をやる」というTodoを追加しました。(1件ブランクのTodoを追加したので謎の空白が発生しています。後ほど消します)
以上、簡単ではありましたがデプロイ手順となります。
デプロイ時間によって多少前後しますが、10分もあれば説明を読みながらでも十分完了したかと思います。
これだけでは開発現場で役に立たない。という方に向けていくつか実践的な内容をご紹介していきます。
ローカル環境で開発
ローカル環境で開発する手順をご紹介していきます。
今回は公式ドキュメントに書いてある削除ボタンの追加を行ってみようと思います。
リポジトリのローカルにコピー
まずは最初にコピーしたリポジトリをローカルに落としてきます。
そして、必要なパッケージをダウンロードします。
git clone git@github.com:shinagawa-web/amplify-next-template.git
cd amplify-next-template && npm install
バックエンドの設定情報をダウンロード
一旦、Amplifyの画面に戻ります。
Deployed backend resources
というタブを開くと、Download amplify_outputs.json file
というボタンが現れますのでクリックしてjsonファイルをダウンロードします。
amplify_outputs.json
について少し解説します。
{
"auth": {
"user_pool_id": "ap-northeast-1_GWrP6bLZW",
"aws_region": "ap-northeast-1",
"user_pool_client_id": "4i56nhb28ftc251lp6fdn92r6e",
"identity_pool_id": "ap-northeast-1:743f1a0f-b4dc-4f91-89e3-bd10b01f700e",
"mfa_methods": [],
"standard_required_attributes": [
"email"
],
"username_attributes": [
"email"
],
"user_verification_types": [
"email"
],
"mfa_configuration": "NONE",
"password_policy": {
"min_length": 8,
"require_lowercase": true,
"require_numbers": true,
"require_symbols": true,
"require_uppercase": true
},
"unauthenticated_identities_enabled": true
},
"data": {
"url": "https://jx3glrsb7na3dfhorqyb3hl5ne.appsync-api.ap-northeast-1.amazonaws.com/graphql",
"aws_region": "ap-northeast-1",
"api_key": "xxx-xxxxxxxxxxxxxxxxxxxxxxxxxx",
"default_authorization_type": "API_KEY",
"authorization_types": [
"AMAZON_COGNITO_USER_POOLS",
"AWS_IAM"
],
"model_introspection": {
"version": 1,
"models": {
"Todo": {
"name": "Todo",
"fields": {
"id": {
"name": "id",
"isArray": false,
"type": "ID",
"isRequired": true,
"attributes": []
},
"content": {
"name": "content",
"isArray": false,
"type": "String",
"isRequired": false,
"attributes": []
},
"createdAt": {
"name": "createdAt",
"isArray": false,
"type": "AWSDateTime",
"isRequired": false,
"attributes": [],
"isReadOnly": true
},
"updatedAt": {
"name": "updatedAt",
"isArray": false,
"type": "AWSDateTime",
"isRequired": false,
"attributes": [],
"isReadOnly": true
}
},
"syncable": true,
"pluralName": "Todos",
"attributes": [
{
"type": "model",
"properties": {}
},
{
"type": "auth",
"properties": {
"rules": [
{
"allow": "public",
"provider": "apiKey",
"operations": [
"create",
"update",
"delete",
"read"
]
}
]
}
}
],
"primaryKeyInfo": {
"isCustomPrimaryKey": false,
"primaryKeyFieldName": "id",
"sortKeyFieldNames": []
}
}
},
"enums": {},
"nonModels": {}
}
},
"version": "1.1"
}
これは今回私がデプロイした時の設定情報なのですが、jsonファイルは大きく2つの構成になっています。
- auth: AWSの認証サービスである
Cognito
に関する設定情報 - data: AWSのGraphQLサービスである
App Sync
に関する設定情報
このようにAmplifyで構築したバックエンドサービスの設定情報をダウンロードしておくことで、
ローカル環境でNext.jsを起動したときもバックエンドサービスにアクセスして開発できるようになります。
※api_keyに関してはダミーに置き換えています。
/app/page.tsx
ファイルを開くと下記のコードが確認できます。
import outputs from "@/amplify_outputs.json";
(※一部省略)
Amplify.configure(outputs);
これらによってNext.jsからAmplifyのバックエンドサービスに接続が可能となっています。
このファイル自体はデプロイ時には必要ないため、.gitignore
ファイルに登録されています。
# amplify
.amplify
amplify_outputs*
amplifyconfiguration*
画面に削除ボタンをつける
ローカル環境で開発する準備が整いました。
/app/page.tsx
ファイルを開いてコード書いていきます。
(※一部省略)
function createTodo() {
client.models.Todo.create({
content: window.prompt("Todo content"),
});
}
+ function deleteTodo(id: string) {
+ client.models.Todo.delete({ id });
+ }
return (
<main>
<h1>My todos</h1>
<button onClick={createTodo}>+ new</button>
<ul>
{todos.map((todo) => (
- <li key={todo.id}>{todo.content}</li>
+ <li key={todo.id} style={{ display: 'flex', justifyContent: 'space-between' }}>
+ {todo.content}
+ <button onClick={() => deleteTodo(todo.id)}>delete</button>
+ </li>
))}
</ul>
<div>
🥳 App successfully hosted. Try creating a new todo.
<br />
<a href="https://docs.amplify.aws/nextjs/start/quickstart/nextjs-app-router-client-components/">
Review next steps of this tutorial.
</a>
</div>
</main>
);
}
削除用のボタンを作成し、削除ボタンがクリックされると、deleteTodo
にて対象のIDのTodoを削除します。
動作確認
削除ボタンが作成できましたのでNext.jsをローカルで起動して動作確認を行います。
npm run dev
下記の画面のようにdelete
をクリックして削除されればOKです。(ブランクのTodoもこのタイミングで削除しておきました)
本番環境に反映
ローカル環境で動作確認できましたので本番環境に反映します。
リポジトリとAWS Amplifyは既に連携されていて、mainブランチの内容が常に本番環境になる状態です。
ですので下記コマンドでmainブランチにコミットするだけで本番環境に反映される仕組みとなっています。
git add .
git commit -m "add delete button"
git push origin HEAD
一旦、Amplifyの画面に戻るとデプロイ中であることがわかります。
Amplifyの画面ではデプロイ履歴なるものも用意されています。
ようやく終わったようです。5分。。。意外とかかりました。
本番環境のURLにアクセスして同じようにdelete
ボタンが表示され、クリックすると削除されればOKです。
データの管理
AWS Amplifyで便利な機能を少しだけご紹介します。
Data manager
というページでは先ほどNext.jsで表示していたTodoをこちらでも確認できるようになっています。(確認だけでなく追加、削除も可能)
開発を行なっていく中でサンプルデータが必要なケースが多々あるかと思いますが、こちらで作成してから開発を進めることができます。
また、API playground
というページでは、GraphQLのコードを書いてデータを取得することも可能となっています。
ローカル環境で開発を進める前にこちらでデータ取得のクエリを試すことが可能です。
サンプルアプリの削除
継続して起動しているとAWSの費用が発生しますので今回は削除しておきます。
左メニューの「General settings」を選択するとアプリ削除の画面が表示されます。
さいごに
今回は公式ドキュメントに従ってAWS Amplifyを使ってNext.jsのデプロイを実施しました。
AWSに精通していなくとも比較的短時間、少ない知識でもデプロイできることがイメージできたかと思います。
PoCなど新規アプリ開発の際にはAWS Amplifyを活用して素早くデモ画面を提供できるかと思います。
AmplifyにはCognitoとの連携も簡単にできるようになっておりますのでAmplifyを使った認証の仕組みについても別の記事で今後ご紹介できればと思います。
関連する技術ブログ
GraphQL・REST API の堅牢な認可設計:RBAC・ABAC・OAuth 2.0 のベストプラクティス
GraphQL & REST API の堅牢な認可設計を構築する方法とは?RBAC・ABAC の活用、Rate Limiting、API Gateway、監視のベストプラクティスをまとめました。
shinagawa-web.com
開発業務の自動化紹介:ETL (Python)、Bot (Slack/Discord)、CI/CD (GitHub Actions)、監視 (Sentry/Datadog) まで徹底解説
開発業務の効率化を加速する自動化テクニックを網羅的に解説。データ処理の自動化(ETLスクリプト)、Slack / Discord Bot による定型業務の効率化、Terraform / Pulumi を活用したインフラ管理、CI/CD の最適化、Sentry / Datadog によるエラーハンドリングなど、多方面にわたる自動化の実践例を紹介します。さらに、Pull Request の自動管理、ログ監視、テスト、警告通知の自動化まで、開発のスピードと品質を向上させるためのベストプラクティスを詳しく解説します。
shinagawa-web.com
キャッシュ戦略完全ガイド:CDN・Redis・API最適化でパフォーマンスを最大化
Webアプリの高速化には、適切なキャッシュ戦略が不可欠。本記事では、CDN(Cloudflare / AWS CloudFront)による静的コンテンツ配信、Redis / Memcached を活用したデータベース負荷軽減、APIレスポンスキャッシュ(GraphQL / REST API)など、キャッシュを駆使してパフォーマンスを向上させる方法を解説。TTL設定、Next.js ISR / SSG のプリフェッチ、クエリキャッシュ(React Query / Apollo Client)、キャッシュヒット率の分析など、実践的なノウハウも紹介します。
shinagawa-web.com
開発フローを高速化・自動化する CI/CD 戦略:キャッシュ・並列実行・AI レビューの活用
ソフトウェア開発の高速化と安定化を実現するために、CI/CD の最適化は欠かせません。本記事では、npm / yarn / Docker のキャッシュ戦略を強化する方法や、並列実行によるパイプラインの高速化、変更のあった部分のみをテスト・ビルドする仕組みの導入について詳しく解説します。また、Blue-Green デプロイや Canary デプロイを活用した安全な本番環境へのリリース戦略、Terraform / Pulumi によるインフラの自動プロビジョニング、GitHub Secrets / AWS Parameter Store を用いたシークレット管理の最適化についても取り上げます。さらに、エラー発生時の自動ロールバック機能の実装、CI/CD 実行ログの可視化(Datadog / Grafana 連携)、Dependabot / Snyk を活用したセキュリティスキャンの自動化、AI(CodeGPT, DeepCode, Codium など)を用いた PR の自動レビューと改善提案まで、開発フローを効率化するための実践的なアプローチを紹介します。CI/CD の最適化を進め、開発スピードと信頼性を両立させたいエンジニア必見の内容です。
shinagawa-web.com
AWS & GCPで実践するクラウドセキュリティ対策:WAF設定・DDoS防御・アクセス制御の最適化
クラウド環境でのセキュリティを強化するための具体的な対策を、AWSとGCPを中心に解説。WAF(Web Application Firewall)の導入とルール設定、reCAPTCHA / Cloudflare Turnstileによるボット対策、IPアドレス制限、VPCの適切な設計、AWS ShieldやCloud ArmorによるDDoS対策、SIEMを活用したログ監視と不正アクセス検知、TLS証明書の管理、Fail2BanによるSSH保護、IAMポリシーの最適化まで、実践的なセキュリティ強化手法を詳しく紹介します。
shinagawa-web.com
マイクロサービス戦略の実践:BFF・API管理・認証基盤を支える技術スタック(AWS, Keycloak, gRPC, Kafka)
マイクロサービス化を進める上で、適切なアーキテクチャ設計と技術選定が重要です。本記事では、BFF の導入計画、API Gateway を活用したエンドポイント管理、認証・認可の統合、非同期メッセージング、サービス間通信の最適化 など、多岐にわたるトピックを解説します。サンプルとして、AWS の活用例、Keycloak による認証基盤の整備、gRPC を用いた高速通信、Kafka & RabbitMQ によるメッセージング、Swagger での API ドキュメント標準化 などを紹介。マイクロサービスを支える技術スタックとその実践的な活用方法を学びたい方におすすめの内容です。
shinagawa-web.com
Next.js × AWS CDK の統合環境構築:Docker でローカル開発から本番デプロイまで
Next.js と AWS CDK を1つのリポジトリで管理し、Docker を活用してローカル開発環境と本番環境向けのイメージを構築する方法を解説。ディレクトリ構成の設計から、Next.js のセットアップ、Docker Compose による開発環境の構築、ECR 向けの本番用 Docker イメージの作成、CDK の導入までを網羅。
shinagawa-web.com
チャットアプリ(画像・PDF送信、ビデオ通話機能付き)
お客様固有の要件を除き一般的なチャットアプリに求められる最低限の機能を実装しデモアプリとしてご紹介いたします。
shinagawa-web.com
弊社の技術支援サービス
無駄なコストを削減し、投資対効果を最大化する
クラウド費用の高騰、不要なSaaSの乱立、開発工数の増加――これらの課題に悩んでいませんか?本サービスでは、クラウドコストの最適化、開発効率向上、技術選定の最適化 を通じて、単なるコスト削減ではなく、ROIを最大化する最適解 をご提案します。
shinagawa-web.com
最新技術の導入・検証を支援するPoCサービス
Remix、React Server Components、TypeScript移行、クラウドサービス比較、マイクロサービス、サーバーレス、デザインシステムなど、最新技術のPoC(概念実証)を通じて、最適な技術選定と導入を支援します。貴社の開発課題に合わせた検証・実装で、ビジネスの成長を加速させます。
shinagawa-web.com
開発生産性を最大化するための支援サービス
開発チームの生産性向上、コードの品質管理、インフラの最適化まで、様々な側面からサポートします。コードベースのリファクタリングから、テスト自動化、オンボーディング強化まで、プロジェクトの成功に必要なすべての支援を提供。御社の開発現場が効率的に機能するように、技術的な障害を取り除き、スムーズな開発を実現します。
shinagawa-web.com
開発品質向上支援 – 効率的で安定したプロダクトを実現
フロントエンドからバックエンド、データベースまで、開発プロセス全体を最適化し、安定したプロダクト作りをサポートします。コードレビューの仕組み、型定義の強化、E2Eテスト環境の構築など、開発の各ステップにおけるベストプラクティスを導入することで、より効率的でバグの少ない、そしてユーザー満足度の高いサービス提供を支援します。
shinagawa-web.com
Webアプリのセキュリティ強化支援
Webアプリの脆弱性対策からインフラのセキュリティ強化まで、包括的なセキュリティ支援を提供。OWASP Top 10対策、JWT認証の最適化、APIのアクセス制御、依存パッケージの監査、セキュアコーディングの標準化など、実践的なアプローチで開発現場の安全性を向上させます。
shinagawa-web.com
目次
お問い合わせ