AWS CDK 初探

最近看到不少CDK教學就想說來試試看是不是真的這麼好用

然後順便踩了一點基本設定上的雷就順便記錄一下

AWS Cli

首先要先設定aws cli

然後run aws configure設定

1
aws sts get-caller-identity

看一下當前configure設定是否正確可以執行cli/連線取得權限

參考了此範例aws-cdk-qcon-workshop

我不知道為什麼我的config檔編輯了幾次格式突然爆炸Cli根本無法執行

所以卡關卡了很久,最後直接全清重新用Cli問答重新產生


實作使用的是這個範例aws-fargate-fast-autoscaler

預設值是isDefault : true會吃到預設VPC

碰到了一下狀況紀錄如下


Q1.

而預設VPC通常會出現

1
2
There are no 'Private' subnets in this VPC. Use a different VPC subnet selection.
Subprocess exited with error 1

是因為subnet沒有設定Private


Q2.

如果出現這個訊息

1
2
cdk bootstrap
Cannot read property 'length' of undefined

可以修改lib/cdk-stack.js中的truefalse

1
2
3
const vpc = ec2.Vpc.fromLookup(this, 'VPC', {
isDefault: false
});

代表你的VPC不是DefaultVPC,是自建的
反之如果是DefaultVPC請使用true


Q3.

沒開docker的話..

記得開XD

因為要build docker image然後推到ecr上面去

1
2
3
4
CdkStack: deploying...
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

❌ CdkStack failed: Error:

Q4.

在deploy到一半的時候跳出ELB部署失敗

1
AWS::ElasticLoadBalancingV2::LoadBalancer | external (external068F12D1) At least two subnets in two different Availability Zones must be specified (Service: AmazonElasticLoadBalancingV2; Status Code: 400; Error Code: ValidationError; Request ID: c04e5311-6ae4-4b8c-8b7c-ef94cfe1c497)

這邊我誤解了

At least two subnets in two different Availability Zone

這句,這邊要確認VPC是否有兩個以上的Public/Private subnet

我自建的時候只各建了一個不符合ALB部署需求所以失敗…

弄超久orz….

Q5.

如何看設定到底有沒有抓對,可以看cdk.context.json

執行

cdk synth

看跑出來的東西是不是有抓對

例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{
"vpc-provider:account=<your account id>:filter.isDefault=true:region=<your regoin>": {
"vpcId": "<your vpc id>",
"availabilityZones": [
"<subnet's az, for example, ap-southeast-1a>",
"<subnet's az, for example, ap-southeast-1a>"
],
"publicSubnetIds": [
"<public subnet id>",
"<public subnet id>"
],
"publicSubnetNames": [
"Public"
],
"publicSubnetRouteTableIds": [
"<the route table id of the public subnet>",
"<the route table id of the public subnet>"
],
"privateSubnetIds": [
"<private subnet id>",
"<private subnet id>"
],
"privateSubnetNames": [
"Private"
],
"privateSubnetRouteTableIds": [
"<the route table id of the private subnet>",
"<the route table id of the private subnet>"
]
}
}

結論

CDK算是一個滿方便的東西
至少不會像CloudFormation難閱讀(?)

雖然它的原理也是自動產生一個CloudFormation stack去deploy和rollback就是了XD