グローバルなコンテンツ配信
Copilot は、Amazon CloudFront を介した Content Delivery Network をサポートしています。このリソースは Copilot によって Environment レベルで管理され、ユーザーは Environment Manifest を通じて CloudFront を活用することができます。
Copilot による CloudFront インフラストラクチャ
Copilot が CloudFront ディストリビューション を作成すると、Application Load Balancer の代わりに Application への新しいエントリポイントになるようディストリビューションが作成されます。これにより、CloudFront は世界中に配置されたエッジロケーションを経由して、ロードバランサーにトラフィックをより速くルーティングすることができます。
既存のアプリケーションで CloudFront を使うには?
Copilot v1.20 から、copilot env init で Environment Manifest ファイルが作成されるようになりました。この Manifest に cdn: true という値を指定し、copilot env deploy を実行すると、基本的な CloudFront ディストリビューションを有効にすることができます。
CloudFront ディストリビューション Manifest の設定例
cdn: true
http:
  public:
    security_groups:
      ingress:
        restrict_to:
          cdn: true
cdn:
  certificate: arn:aws:acm:us-east-1:${AWS_ACCOUNT_ID}:certificate/13245665-h74x-4ore-jdnz-avs87dl11jd
http:
  certificates:
    - arn:aws:acm:${AWS_REGION}:${AWS_ACCOUNT_ID}:certificate/13245665-bldz-0an1-afki-p7ll1myafd
    - arn:aws:acm:${AWS_REGION}:${AWS_ACCOUNT_ID}:certificate/56654321-cv8f-adf3-j7gd-adf876af95
CloudFront で HTTPS トラフィックを有効にするには?
CloudFront で HTTPS を使用する場合、ロードバランサーの http.certificates フィールドと同じように、Environment Manifest の cdn.certificate フィールドで証明書を指定します。ロードバランサーとは異なり、インポートできる証明書は 1 つだけです。このため、その Environment で Service が使用する各エイリアスを検証するために、CNAME レコードを使用して新しい証明書 (リージョンは us-east-1) を作成することをお勧めします。
Info
CloudFront は、us-east-1 リージョンでインポートされた証明書のみをサポートしています。
Info
CloudFront 用の証明書をインポートすると、Environment Manager ロールに権限が追加され、Copilot が DescribeCertificate API call を使用できるようになります。
また、Application の作成時に --domain を指定することで、Copilot に証明書の管理を任せることができます。この場合、CloudFront 対応 Environment に展開するすべての Service に http.alias を指定する必要があります。
この 2 つの設定により、Copilot は CloudFront が SSL/TLS 証明書を使用するように設定されます。これにより、ビューワーの証明書を検証し、HTTPS 接続を有効にすることができます。
Ingress 制限とは?
特定の送信元からの受信トラフィックを制限できます。CloudFront の場合、Copilot は AWS マネージドプレフィックスリストを使用して、CloudFront エッジロケーションに関連する CIDR IP アドレスのセットに許可されたトラフィックを制限します。restrict_to.cdn: true を指定すると、パブリックロードバランサーはパブリックアクセスできなくなり、CloudFront ディストリビューションからのみアクセスできるようになり、Service に対するセキュリティ脅威から保護されます。
CloudFront で TLS を終端させるには?
Attention
- Load Balanced Web Service の HTTP to HTTPS redirection を無効化します。
- CloudFront TLS ターミネーションを有効にする前に、全ての Load Balanced Web Service 対して、個別に svc deployを実行して再デプロイを行います。
- 全ての Load Balanced Web Service が HTTP を HTTPS にリダイレクトしなくなったら、Environment Manifest 内で CloudFront TLS ターミネーションを安全に有効化できます。env deployを実行します。
Environment Manifest を次の様に設定することで、オプションで CloudFront を TLS ターミネーションに使用できます。
cdn:
  terminate_tls: true
CloudFront → Application Load Balancer (ALB) → ECS の通信は、HTTP のみになります。エンドユーザに地理的に近いエンドポイントで TLS を終端させる事で、 TLS ハンドシェイクを高速化させる利点があります。
S3 バケットで CloudFront を使うには?
Environment Manifest で cdn.static_assets を設定することで、CloudFront が Amazon S3 バケットと連携し、静的コンテンツを高速に配信することも可能です。
既存の S3 バケットの利用
Attention
セキュリティの観点から、プライベートな S3 バケットを使用し、デフォルトですべてのパブリックアクセスがブロックされるようにすることをお勧めします。
以下の Environment Manifest の例では、既存の S3 バケットを CloudFront 用に使用する方法を説明しています。
既存の S3 バケットを CloudFront で使用するための Environment Manifest 設定例
cdn:
  static_assets:
    location: cf-s3-ecs-demo-bucket.s3.us-west-2.amazonaws.com
    alias: example.com
    path: static/*
static_assets.location は S3 バケットの DNS ドメイン名 (例えば、EXAMPLE-BUCKET.s3.us-west-2.amazonaws.com など) にします。Application に関連するルートドメインのエイリアスを使用していない場合は、CloudFront のドメイン名を指すエイリアスの A レコードを忘れずに作成してください。
Environment Manifest で Environment をデプロイした後は、(プライベートバケットの場合) S3 バケットのバケットポリシーを更新して、CloudFront がアクセスできるようにする必要があります。
CloudFront に読み取り専用アクセスを許可する S3 バケットポリシーの例
{
    "Version": "2012-10-17",
    "Statement": {
        "Sid": "AllowCloudFrontServicePrincipalReadOnly",
        "Effect": "Allow",
        "Principal": {
            "Service": "cloudfront.amazonaws.com"
        },
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::EXAMPLE-BUCKET/*",
        "Condition": {
            "StringEquals": {
                "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/EDFDVBD6EXAMPLE"
            }
        }
    }
}
CloudFront を使用して静的な Web サイトを提供するには?
copilot init または copilot svc init コマンドを使用して、Static Site ワークロードを作成します。アップロードするファイルを選択すると、Copilot は個別の専用 CloudFront ディストリビューションと、アセットを含む S3 バケットをプロビジョニングします。再デプロイのたびに、よりダイナミックな開発のために、Copilot は既存のキャッシュを無効化します。