Day 9 – 部署靜態網頁 (番外篇)

2020 12th 鐵人賽

在昨天的靜態網頁教學中還沒說明限制的部分,今天準備了幾個問題來回答

https://i0.wp.com/ithelp.ithome.com.tw/upload/images/20200925/20117701j0DMhuAFMC.jpg?w=640&ssl=1

問題列表

  • 在昨天的教學文件裡面有提到如果要使用 acm.Certificate 需要切換 Region 到 us-east-1 這是為什麼呢?
  • 我們竟然都使用 CDK 了,那可不可以讓 ACM 在 us-east-1 而其他服務在不同區呢?

在昨天的教學文件裡面有提到如果要使用 acm.Certificate 需要切換 Region 到 us-east-1 這是為什麼呢?

這是因為 CloudFront 使用 ACM 有限制條件,我們可以在 AWS 文件裡面找到 如果要使用 CloudFront 必須使用 US East (N. Virginia) 區域的憑證

我們竟然都使用 CDK 了,那可不可以讓 ACM 在 us-east-1 而其他服務在不同區呢?

類似的問題其實在 2020/07/28 有被提出過 [aws-certificatemanager] Create certificate in us-east-1 and use it in a different region #9274

簡單說明一下這則 issue 的內容

這位作者想要創建 AWS Cognito 的服務而他的 CDK stack 在 eu-central-1,如果要使用自定義網域憑證需要在 us-east-1 要如何分享憑證到 AWS Cognito.

AWS 人員給予的回應簡述

  1. 使用兩個不同的 CDK stack 來處理
  2. 使用 acm.CertificateValidation 來處理

方法一:以目前來說不可行,目前在 Certificates ARN 還沒有解法,可以在此 commit 看到詳細說明 方法二:限制只有使用 Route53 的使用者可以使用此解法

談討為什麼 acm.Certificate 不可以指定 Region 而 acm.CertificateValidation 可以指定

首先先看 CDK 文件可以看到 Certificate 的 class 裡面沒有可以填入 region 的地方,而 DnsValidatedCertificate 有一個 Construct Props region

分析 Certificate 實作

我們到 Github 看一下 Certificate 的實作方法 首先看到 import 的地方只有 route53, core 與 certificatemanager.generated

特別說明一下 certificatemanager.generated 代表 AWS CloudFormation-only 或稱 L1 也就是它是原生的 CloudFormation 可參考文件

因此可以知道 Certificate 只有使用原生的 CloudFormation

import * as route53 from '@aws-cdk/aws-route53';
import { Construct, IResource, Resource, Token } from '@aws-cdk/core';
import { CfnCertificate } from './certificatemanager.generated';
import { apexDomain } from './util';

分析 DnsValidatedCertificate 實作

先看到 Github DnsValidatedCertificate 的實作方法,一樣我們可以從 import 先做概略分析它有一個 lambda 代表這邊的功能有人會用它實作

import * as path from 'path';
import * as iam from '@aws-cdk/aws-iam';
import * as lambda from '@aws-cdk/aws-lambda';
import * as route53 from '@aws-cdk/aws-route53';
import * as cdk from '@aws-cdk/core';
import { CertificateProps, ICertificate } from './certificate';

再來我們往下看到 L76-L94 就可以看到這邊有一個 Lambda 的呼叫檔案位置在

path.resolve(__dirname, '..', 'lambda-packages', 'dns_validated_certificate_handler', 'lib')

也就是 dns_validated_certificate_handler/lib/index.js 而輸入 region 的位置在 L241 因此使用 DnsValidatedCertificate 才可以輸入 region 位置,不然依造目前 CloudFormation 的特性是沒辦法跨 region 的

今日主要帶大家簡單的看一下 CDK Source code 有個體驗,希望今天的分享有幫到大家