AstroサイトをAWSにデプロイする
AWSは、Astroサイトのデプロイに使用できる、機能豊富なウェブアプリホスティングプラットフォームです。
プロジェクトをAWSにデプロイするには、AWSコンソールを使用する必要があります。(これらのアクションのほとんどは、AWS CLIを使用しても実行できます)。このガイドでは、AWS Amplify、S3の静的ウェブサイトホスティング、およびCloudFrontを使用して、サイトをAWSにデプロイする手順を説明します。
AWS Amplify
セクションタイトル: AWS AmplifyAWS Amplifyは、フロントエンドのWebおよびモバイル開発者が、AWS上で迅速かつ容易にフルスタックアプリケーションを構築できるようにするという目的のために設計されたツールと機能のセットです。
-
新しいAmplify Hostingプロジェクトを作成します。
-
リポジトリをAmplifyに接続します。
-
プロジェクトのビルドプロセスに合わせてビルド設定を変更します。
version: 1frontend:phases:preBuild:commands:- npm cibuild:commands:- npm run buildartifacts:baseDirectory: /distfiles:- '**/*'cache:paths:- node_modules/**/*version: 1frontend:phases:preBuild:commands:- npm i -g pnpm- pnpm config set store-dir .pnpm-store- pnpm ibuild:commands:- pnpm run buildartifacts:baseDirectory: /distfiles:- '**/*'cache:paths:- .pnpm-store/**/*version: 1frontend:phases:preBuild:commands:- yarn installbuild:commands:- yarn buildartifacts:baseDirectory: /distfiles:- '**/*'cache:paths:- node_modules/**/*
Amplifyは、あなたがリポジトリにコミットをプッシュすると、自動的にあなたのウェブサイトをデプロイし、更新します。
S3での静的ウェブサイトホスティング
セクションタイトル: S3での静的ウェブサイトホスティングS3はあらゆるアプリケーションの出発点です。プロジェクトファイルやその他のアセットが保存されます。S3はファイルの保存容量とリクエスト数に対して課金されます。S3についての詳細はAWS documentationを参照してください。
-
プロジェクト名を含んだS3バケットを作成します。
バケット名はグローバルに一意でなければなりません。プロジェクト名とサイトのドメイン名の組み合わせをお勧めします。
-
**「パブリックアクセスをすべてブロック」**を無効にします。デフォルトでは、AWS はすべてのバケットを非公開に設定しています。公開するには、バケットのプロパティにある「パブリックアクセスをブロック」のチェックを外す必要があります。
-
dist
にあるビルドしたファイルをS3にアップロードします。これは、コンソールで手動で行うか、AWS CLIを使用して行うことができます。AWS CLIを使用する場合は、AWS認証情報で認証の後に、以下のコマンドを使用します。aws s3 cp dist/ s3://<BUCKET_NAME>/ --recursive -
パブリックアクセスを許可するために、バケットポリシーを更新します。この設定は、バケットのアクセス許可 > バケットポリシーにあります。
{"Version": "2012-10-17","Statement": [{"Sid": "PublicReadGetObject","Effect": "Allow","Principal": "*","Action": "s3:GetObject","Resource": "arn:aws:s3:::<BUCKET_NAME>/*"}]}<BUCKET_NAME>
を自分のバケット名に置き換えることを忘れないでください。 -
BucketのWebサイトホスティングを有効にします。この設定は、バケットのプロパティ > 静的ウェブサイトホスティングにあります。インデックスドキュメントを
index.html
に、エラードキュメントを404.html
に設定します。最後に、バケットのプロパティ > 静的ウェブサイトホスティングで、新しいウェブサイトのURL確認できます。シングルページアプリケーション (SPA) をデプロイする場合は、エラードキュメントを
index.html
に設定してください。
S3とCloudFront
セクションタイトル: S3とCloudFrontCloudFrontは、コンテンツ・デリバリー・ネットワーク(CDN)機能を提供するウェブサービスです。ウェブサーバーのコンテンツをキャッシュし、エンドユーザーに配信するために使用されます。CloudFrontは転送されたデータ量に応じて課金されます。CloudFrontをS3バケットに追加することで、より費用対効果が高く、より高速な配信が可能になります。
S3とCloudFrontを接続するには、以下の値のCloudFrontディストリビューションを作成してください:
- オリジンドメイン: S3バケットの静的ウェブサイトエンドポイント。エンドポイントはS3バケットのプロパティ > 静的ウェブサイトホスティングで確認することができます。もしくは、S3バケットを選択して注釈をクリックし、バケットアドレスをバケットの静的エンドポイントに置き換えることができます。
- ビューワープロトコルポリシー: “Redirect to HTTPS”
この設定により、サイトはCloudFront CDNネットワークを使用して提供されます。CloudFrontディストリビューションのURLは、バケットのディストリビューション > ドメイン名で見つけることができます。
CloudFrontをS3の静的ウェブサイトエンドポイントに接続する際には、アクセス制御のためにS3バケットポリシーに依存します。バケットポリシーについての詳細は、S3の静的ウェブサイトホスティングセクションを参照してください。
GitHubアクションによる継続的デプロイメント
セクションタイトル: GitHubアクションによる継続的デプロイメントAWSで継続的デプロイを設定する方法はたくさんあります。GitHub 上でホストされているコードの場合、GitHub Actions を使ってコミットをプッシュするたびにウェブサイトをデプロイする方法があります。
-
AWSアカウントでIAMを使って、以下の権限で新しいポリシーを作成します。このポリシーによって、ビルドしたファイルをS3バケットにアップロードしたり、コミットをプッシュしたときにCloudFrontの配布ファイルを無効にしたりできるようになります。
{"Version": "2012-10-17","Statement": [{"Sid": "VisualEditor0","Effect": "Allow","Action": ["s3:PutObject","s3:ListBucket","s3:DeleteObject","cloudfront:CreateInvalidation"],"Resource": ["<DISTRIBUTION_ARN>","arn:aws:s3:::<BUCKET_NAME>/*","arn:aws:s3:::<BUCKET_NAME>"]}]}<DISTRIBUTION_ARN>
と<BUCKET_NAME>
を忘れずに置き換えてください。ARN はCloudFront > ディストリビューション > 詳細で確認できます。 -
新しいIAMユーザーを作成し、そのユーザーにポリシーをアタッチします。これにより、
AWS_SECRET_ACCESS_KEY
とAWS_ACCESS_KEY_ID
が提供されます。 -
以下のサンプルワークフローをあなたのリポジトリの
.github/workflows/deploy.yml
に追加し、GitHubにプッシュしてください。AWS_ACCESS_KEY_ID
、AWS_SECRET_ACCESS_KEY
、BUCKET_ID
、およびDISTRIBUTION_ID
を、GitHubリポジトリのSettings > Secrets > Actionsから”secrets”として追加する必要があります。New repository secretをクリックして、各値を追加します。name: Deploy Websiteon:push:branches:- mainjobs:deploy:runs-on: ubuntu-lateststeps:- name: Checkoutuses: actions/checkout@v4- name: Configure AWS Credentialsuses: aws-actions/configure-aws-credentials@v1with:aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}aws-region: us-east-1- name: Install modulesrun: npm ci- name: Build applicationrun: npm run build- name: Deploy to S3run: aws s3 sync --delete ./dist/ s3://${{ secrets.BUCKET_ID }}- name: Create CloudFront invalidationrun: aws cloudfront create-invalidation --distribution-id ${{ secrets.DISTRIBUTION_ID }} --paths "/*"BUCKET_ID
はS3バケットの名前です。DISTRIBUTION_ID
はCloudFrontのディストリビューションIDです。CloudFrontのディストリビューションIDはCloudFront > ディストリビューション > IDで確認できます。
コミュニティリソース
セクションタイトル: コミュニティリソース- Deploy Astro to AWS Amplify
- Deploy Astro to AWS Elastic Beanstalk
- Deploy Astro to Amazon ECS on AWS Fargate