在昨天的靜態網頁教學中還沒說明限制的部分,今天準備了幾個問題來回答
問題列表
- 在昨天的教學文件裡面有提到如果要使用
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 人員給予的回應簡述
- 使用兩個不同的 CDK stack 來處理
- 使用
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 有個體驗,希望今天的分享有幫到大家
《AWS CDK 完全學習手冊:打造雲端基礎架構程式碼 IaC》
第 12 屆 iT 邦幫忙鐵人賽 DevOps 組冠的《用 CDK 定 義 AWS 架構》
第 11 屆 iT 邦幫忙鐵人賽《LINE bot 好好玩 30 天玩轉 LINE API》
一個熱愛分享的雲端工程師!