如何创建具有自定义域、HTTPS 和持续部署要求的 AWS S3 托管 Angular 应用程序基本静态站点设置自定义域和 HTTPS 持续交付结束

2025-06-10

如何创建具有自定义域、HTTPS 和持续部署的 AWS S3 托管 Angular 应用

要求

基本静态站点设置

自定义域和 HTTPS

持续交付

结束

本指南介绍了如何使用自定义域、HTTPS 和来自 GitHub 存储库的持续部署在 AWS S3 中托管 Angular 应用程序。(准确日期为公元 2019 年 12 月 16

要求

  • GitHub 帐户
  • 一个包含在根目录中创建的 Angular App 的 GitHub Repo
  • AWS 账户
  • 可以更新其 DNS 设置的域名

基本静态站点设置

S3

  • 创建带有站点名称(example.com)的存储桶
  • 转到'Properties'标签页
  • 选择'Static Website'
  • 选择'Use this bucket to host a website'并输入 index.html 作为索引文档和错误文档(适用于单页应用程序)
  • 手动将 index.html 文件添加到存储桶以进行测试
  • 记下端点,稍后设置 CDN 时我们将需要它。
  • 转到'Permissions'标签页
  • 选择'Bucket Policy'
  • 复制以下 json 并替换BUCKET_NAME存储桶的名称 (example.com)。
{
    "Statement": [
        {
            "Sid": "AllowPublicRead",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::BUCKET_NAME/*"
            ]
        }
    ]
}
Enter fullscreen mode Exit fullscreen mode

注意:bucket-policy.json 中的策略将默认使此存储桶中的所有对象公开可用,这在后续部署脚本中是必需的,因为通常情况下,对象默认设置为私有。如果您不这样做,您的网站将无法访问。

  • 使用站点名称和子域名创建存储桶(www.example.com
  • 转到'Properties'标签
  • 选择'Static Website'
  • 选择'Redirect requests'并选择'http'协议

自定义域和 HTTPS

Route 53 和 DNS

  • 单击'Create Hosted Zone'并输入您的域名 example.com'Public Hosted Zone'
  • 前往您获得域名的域名注册商(例如 hover.com)
  • 将新创建的托管区域中的值复制ns到域的名称服务器设置中

AWS 证书管理器(SSL 证书)

  • 确保us-east-1已选择区域,因为 Cloud Front 需要此区域(位于仪表板右上角)。更多信息请访问https://aws.amazon.com/certificate-manager/faqs/
  • 'www'添加您的域名 example.com 和带有子域名www.example.com 的域名,然后单击'Next'
  • 选择'DNS Validation'然后单击'Next'
  • 点击'Review'
  • 点击'Confirm and Request'
  • 展开每个域的区域并单击'Create record in route53'
  • 点击'Continue'

AWS 云端 (CDN)

  • 点击'Create Distribution'
  • 'Web'点击'Get Started'
  • 输入'Origin Domain Name'您之前记下的 S3 站点端点。其格式应为bucket.name .s3-website- aws-region .amazonaws.com
  • 在下'Viewer Protocol Policy',选择'redirect http to https'
  • 'Price class'在选择'use only US, Canada and Europe'。这些区域以外的用户将遇到更多延迟,但这样做更便宜
  • 在下面'Alternate Domain Names (CNAMEs)'输入您的顶级域名(example.com),然后在新行上输入您的域名和'www'子域名(www.example.com
  • 在AWS 证书管理器中'SSL Certificate'选择'Custom SSL Certificate'我们刚刚创建的证书
  • 输入'Default Root Object''index.html'
  • 点击'Create Distribuion'

注意:创建分发需要 15 到 20 分钟,请耐心等待,然后再继续下一步。

注意:每月前 1,000 条无效路径请求是免费的,但此后每增加一条无效路径将收取 0.005 美元的费用。

注意:您最多可以同时处理 3,000 个路径失效请求。通配符“*”请求最多可以同时使 15 个路径失效,因此如果您的应用包含超过 15 个文件,则需要在部署脚本中手动移除每个路径,而不是使用通配符路径。

回到53号公路

  • 点击'Hosted Zones'
  • 单击您的域名 example.com
  • 单击'Create Record Set'并将名称留空设置'Alias''Yes'选择'Alias Target',然后从下拉菜单中选择我们之前创建的 Cloud Front 部署单击创建
  • 重复上述操作,但'www'这次输入名称。

注意:这可能需要几分钟才能完成。我之前遇到过,没有 www 子域名的网站比有 www 子域名的网站先运行。最终,www 子域名也会运行,所以请耐心等待。

您的网站现在应该在https://example.comhttps://www.example.com下上线。

持续交付

AWS 代码管道

  • 导航到 AWS Code Pipeline
  • 输入管道的名称
  • 选择'New service role',默认名称就可以
  • 确保'Allow AWS CodePipeline to create a service role so it can be used with this new pipeline'已检查
  • 点击'Next'

  • 在下拉菜单中'Source provider'选择'GitHub'

  • 单击'Connect To GitHub'并允许 AWS 访问您的 GitHub 帐户

  • 在下拉菜单中'Repository',选择你的仓库

  • 在下拉菜单中'Branch',选择所需的分支

  • 'Change detection options'在确保'GitHub webhooks'已选择的情况下

  • 点击'Next'

  • 在下拉菜单中'Build provider'选择'AWS CodeBuild'

  • 'Region'下拉菜单中,选择所需的 AWS 区域

  • 在 下'Project name',点击'Create project'。这将打开一个弹出窗口。

  • 在弹出窗口中,'Project Name'输入所需的名称

  • 'Environment image'在选择'Managed image'

  • 'Operating System'在select'Ubuntu'。这包括我们构建 Angular 应用所需的语言运行时

  • 'Runtimes'在选择'Standard'

  • 'Image'在选择'aws/codebuild/standard:3.0'。这包含我们想要的 NodeJS 版本 12。

  • 'Image version'在选择'Always use the latest image for this runtime version'

  • 'Environment Type'在选择'Linux'

  • 选择并输入适当的名称(例如“codebuild-service-role-s3-angular” 'Service role''New Service Role'

  • 'Build specifications'在选择'User a buildspec file'

  • 点击'Continue to CodePipeline'

  • 您应该返回到 CodePipeline

  • 点击'Next'

  • 单击'Skip deploy stage',正如我们在构建管道中所述。

  • 点击'Create pipeline'

AWS CodeBuild

  • 在您的代码库根目录中创建一个buildspec.yaml文件。这将在我们的持续交付管道的 CodeBuild 部分中用于构建您的 Angular 应用,并将其复制到 S3 存储桶的根目录中。

将以下内容复制到buildspec.yaml文件中。
替换@SITE_NAME为您的网站名称 (example.com)。
替换@ANGULAR_APP_NAME为运行 ng build 后包含您的 Angular 应用的文件夹名称,该文件夹可以在dist默认 Angular 应用文件夹中找到。
替换@ANGULAR_APP_ENVIRONMENT为您的 Angular 应用的构建环境,prod即默认值。
替换@CLOUDFRONT_DISTRIBUTION_ID为您之前创建的 CloudFront 发行版的 ID。您可以在 CloudFront 仪表板中找到该 ID。

version: 0.2

env:
  variables:
    S3_BUCKET: "@SITE_NAME"
    APP_NAME: "@ANGULAR_APP_NAME"
    BUILD_ENV: "@ANGULAR_APP_ENVIRONMENT"
    CDN_DISTRIBUTION_ID: "@CLOUDFRONT_DISTRIBUTION_ID"

phases:
  install:
    runtime-versions:
      # NodeJS included in the docker image
      nodejs: 12
    commands:
      # Install node dependancies.
      - npm install

  build:
    commands:
      # Builds Angular application.
      - node ./node_modules/@angular/cli/bin/ng build --$BUILD_ENV

  post_build:
    commands:
      # Clear S3 bucket.
      - aws s3 rm s3://$S3_BUCKET --recursive
      # Copy files from dist to S3
      - cd dist
      - aws s3 cp $APP_NAME s3://$S3_BUCKET --recursive
      # Begin cloudfront invalidation
      - aws cloudfront create-invalidation --distribution-id $CDN_DISTRIBUTION_ID --paths "/*"
Enter fullscreen mode Exit fullscreen mode

CodePipeline IAM 角色权限

您将为 Code Pipeline 和 CodeBuild 创建一个 IAM 角色。您需要授予 CodeBuild 角色访问 S3 和 Cloudfront 的权限

  • 前往 IAM 仪表板
  • 点击'Roles'
  • 在表格中,单击上一步中 CodeBuild 期间创建的角色。
  • 点击'Attach Policy'
  • 在搜索栏中输入'S3',然后点击旁边的复选框'AmazonS3FullAccess'
  • 在搜索栏中输入'CloudFront',然后点击旁边的复选框'CloudFrontFullAccess'
  • 单击此项'Attach Policy'可将策略添加到该角色。

结束

你做到了,干得好,朋友❤️

继续阅读:https://dev.to/shane/how-to-create-an-aws-s3-hosted-angular-app-with-a-custom-domain-https-and-continuous-deployment-2i3i
PREV
HTML CSS 和 JavaScript 中的响应式侧边导航栏
NEXT
将您的 Django + React.js 应用部署到 Heroku 概览设置生成 React 应用创建 Python Virtualenv 生成 Django 应用更新设置测试我们的设置准备部署 Heroku