Day 10 – 使用 CDK 部署 EC2

2020 12th 鐵人賽

今天終於要來講部署 EC2 的方法拉!不過在講 EC2 之前要先介紹 VPC 畢竟沒有 VPC 就沒有地方可以放機器拉 ~

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

CDK 建立 VPC

如果要在 CDK 新增一個簡單的 VPC 非常簡單只要簡單的一行即可,創建完的預設

  • CIDR:10.0.0.0/16
  • AZ:預設為 3
  • NAT gateway:預設為每個 AZ 各一個
const vpc = new ec2.Vpc(this, 'VPC');

Subnet 分為三種

  • Public (開放 subnet): Public subnet 直接連接 Internet 希望直接可以取得 public IP 請將機器放在這個 subnet
  • Private (私人 subnet): 無法直接使用 Internet 預設會在每個 subnet 創建一個 NAT gateway

    NAT gateway 是需要付費的這點需要請大家注意一下

  • Isolated (隔離 subnet): subnet 不會連接 Internet 也不會連接 NAT gateway 一個隔離的 subnet,它只能連到 VPC 裡面的機器或是被 VPC 裡面的其他機器連

https://i1.wp.com/ithelp.ithome.com.tw/upload/images/20200924/20117701sSpUEmrb65.png?w=640&ssl=1

https://i0.wp.com/ithelp.ithome.com.tw/upload/images/20200924/20117701Cw5F5rGkiC.png?w=640&ssl=1

NAT gateway

如果沒有 NAT gateway 需求可以把 natGateways 設定為 0,不過這樣就不會創建 Private subnet

const vpc = new ec2.Vpc(this, "VPC", {
  natGateways: 0,
});

https://i1.wp.com/ithelp.ithome.com.tw/upload/images/20200924/20117701qXi9oSWz67.png?w=640&ssl=1

可以檢查一下 NAT Gateway 並不會看到有服務

如果想要有 Private subnet 又不想要 NAT gateway 這麼多可以把 natGateways 設定為 1 他們就會自動共用 NAT gateway

const vpc = new ec2.Vpc(this, "VPC", {
  natGateways: 1,
});

https://i2.wp.com/ithelp.ithome.com.tw/upload/images/20200924/201177019agU6wIgRu.png?w=640&ssl=1

可以檢查一下 NAT Gateway 會看到有服務

CDK 建立 EC2

創建簡單的 EC2 只要以下程式就可以創建,不過目前這台機器沒有開放 SG,而且放在 Isolated Subnet 或是 Private Subnet 因此一般來說是摸不到它的

const vpc = new ec2.Vpc(this, 'VPC');

const ec2Instance = new ec2.Instance(this, "Instance", {
  vpc,
  instanceType: ec2.InstanceType.of(
    ec2.InstanceClass.T3,
    ec2.InstanceSize.NANO
  ),
  machineImage: new ec2.AmazonLinuxImage(),
});

https://i1.wp.com/ithelp.ithome.com.tw/upload/images/20200924/20117701yDWLyEx1WS.png?w=640&ssl=1

但是如果需求是 IAM image 開起來就可以用的需求就只要修改一下 machineImage 就可以了

設定一台外網可以連入的 EC2

要達成外網可以連入的需求我們需要完成幾件事情

  • SG 設定 22 port 可以連入
  • EC2 要在 Public Subnet
  • EC2 需要含有 Public Key

通常我們應該會把 SSH port 設定成只有某個 Static 可以連入,不過因為範例的關係就先全開。範例的 keyName 為 KeyPair,大家平常應該會有自己習慣的 key pair name 記得修改他!

const vpc = new ec2.Vpc(this, "VPC", {
  natGateways: 0,
});

const mySecurityGroup = new ec2.SecurityGroup(this, "SecurityGroup", {
  vpc,
  description: "Allow ssh access to ec2 instances from anywhere",
  allowAllOutbound: true,
});
mySecurityGroup.addIngressRule(
  ec2.Peer.anyIpv4(),
  ec2.Port.tcp(22),
  "allow public ssh access"
);

const ec2Instance = new ec2.Instance(this, "Instance", {
  vpc,
  instanceType: ec2.InstanceType.of(
    ec2.InstanceClass.T3,
    ec2.InstanceSize.NANO
  ),
  machineImage: new ec2.AmazonLinuxImage(),
  securityGroup: mySecurityGroup,
  vpcSubnets: {
    subnetType: ec2.SubnetType.PUBLIC,
  },
  keyName: "KeyPair",
});

以上為今天介紹的基本 EC2 機器介紹,如此就可以自行創建簡單的 EC2 了