Serverless FrameworkでAngularアプリをAWS S3にデプロイ
やりたいこと
- AWS S3にAngularアプリを静的WEBホスティングする。
- CloudFrontでHTTPS通信&高速化する。
- 開発環境やステージング環境など、複数の環境へのデプロイを簡単に切り替えたい。
- 上記作業をServerless Frameworkを使って自動化する。
- 独自ドメインは......設定出来るけど、今回は除外。
→別記事にしました。
前提
- AWSアカウントを持っている。
- デプロイに必要な権限を持ったAWS IAMユーザのアクセスキー・シークレットアクセスキーを持っている。
- Angularアプリを作成済。(Angularである必要性はないです)
システム構成
Serverless Frameworkをインストール
$ npm install serverless $ npm install serverless-single-page-app-plugin $ npm install serverless-cloudfront-invalidate
Serverless Frameworkのバージョン
この記事で使用しているServerless Frameworkのバージョンです。
serverless:2.52.0 serverless-cloudfront-invalidate:1.9.0 serverless-single-page-app-plugin:1.0.2
serverless.ymlを作成
下記内容の serverless.yml を作成してプロジェクトのルートディレクトリに配置します。
service: angular-test-app
frameworkVersion: '2'
plugins:
- serverless-single-page-app-plugin
- serverless-cloudfront-invalidate
provider:
name: aws
stage: ${env:STAGE}
region: ap-northeast-1
stackName: ${self:service}-${self:provider.stage}
environment:
stage: ${self:provider.stage}
custom:
s3Bucket: ${self:service}-deploy-${self:provider.stage}
# angular.jsonのoutputPathに注意(この記事ではdist直下にビルドファイルを出力する設定をしています)
s3LocalPath: dist/
cloudfrontInvalidate:
- distributionIdKey: CDNDistributionId
autoInvalidate: true
items:
- '/*'
resources:
Resources:
WebAppS3Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: ${self:custom.s3Bucket}
AccessControl: PublicRead
WebsiteConfiguration:
IndexDocument: index.html
ErrorDocument: index.html
WebAppS3BucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket:
Ref: WebAppS3Bucket
PolicyDocument:
Statement:
- Sid: PublicReadGetObject
Effect: Allow
Principal: "*"
Action:
- s3:GetObject
Resource:
Fn::Join: ["", ["arn:aws:s3:::", { "Ref": "WebAppS3Bucket" }, "/*"]]
WebAppCloudFrontDistribution:
Type: AWS::CloudFront::Distribution
Properties:
DistributionConfig:
Origins:
- DomainName:
Fn::Join: ["", [{ "Ref": "WebAppS3Bucket" }, ".s3-ap-northeast-1.amazonaws.com"]]
Id: WebApp
CustomOriginConfig:
HTTPPort: 80
HTTPSPort: 443
OriginProtocolPolicy: https-only
PriceClass: PriceClass_200
Enabled: 'true'
DefaultRootObject: index.html
CustomErrorResponses:
- ErrorCode: 404
ResponseCode: 200
ResponsePagePath: /index.html
- ErrorCode: 403
ResponseCode: 200
ResponsePagePath: /index.html
DefaultCacheBehavior:
AllowedMethods:
- DELETE
- GET
- HEAD
- OPTIONS
- PATCH
- POST
- PUT
TargetOriginId: WebApp
ForwardedValues:
QueryString: 'false'
Cookies:
Forward: none
ViewerProtocolPolicy: https-only
Outputs:
WebAppS3BucketOutput:
Value:
'Ref': WebAppS3Bucket
CDNDistributionId:
Description: CDN distribution id.
Value:
Ref: WebAppCloudFrontDistribution
ビルド&デプロイ
# 環境変数の設定 ## 任意のステージ名 $ export STAGE=dev ## デプロイ権限を持ったIAMユーザのアクセスキー&シークレットアクセスキー $ export AWS_ACCESS_KEY_ID=XXX $ export AWS_SECRET_ACCESS_KEY=XXX # ビルド $ npx ng build --prod # デプロイ $ npx sls deploy -v -s $STAGE $ npx sls syncToS3 -v -s $STAGE
デプロイしたページを確認
ブラウザで https://ドメイン名 を開くとデプロイしたページを開くことができます。
※初回デプロイ時は開けるようになるまで時間がかかります。
ドメイン名はAWSのコンソール画面からCloudFrontのページを開くと確認できます。
次回
今回スルーした独自ドメインの設定をします。
https://d-oshige.blogspot.com/2021/11/serverless--s3-angular-02.html