Day 11 – 使用 CDK 部署 EC2 我需要為機器加入 Role Policy 與執行 User Data

使用 EC2 一定要介紹到 Role Policy 與 User Data,在 AWS 因為服務很多相關的服務如果都使用 IAM Key 去處理會比較麻煩而且久了沒有換可能會有資安風險,這時候就可以使用 Role Policy 來幫我們做到這件事情,而機器啟動後通常會想要跑一些自己的腳本來設定一下機器,要達成這件事情就需要用到 User Data 拉!因此今天就來介紹他們。

https://ithelp.ithome.com.tw/upload/images/20200927/20117701o94CjDzA4q.jpg

複習 EC2 部署程式

昨天還沒帶大家看部署的結果,今天先來部署程式並帶大家看一下昨天部署的結果後面會用這段程式繼續延伸

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",
});
  • 檢查一下 AWS console,會看到 Instance 部署在 Public subnet https://ithelp.ithome.com.tw/upload/images/20200924/20117701XOOoO0CrJo.png

  • 再來看一下 CDK 部署的 SG

    • Inbound 0.0.0.0 開啟 22 port 的 TCP
    • Outbound 0.0.0.0 全部都開啟 https://ithelp.ithome.com.tw/upload/images/20200924/20117701NR2LiOJXyZ.png

使用 SSH 測試登入

到 command line 使用 SSH 登入,因為我們部署的機器是 Amazon Linux 它預設的 user 名稱是 ec2-user,如果使用的是 Ubuntu 預設的登入帳號就是 ubuntu 了

不同版本的機器可能登入的 user 預設帳號不同,大家需要注意一下

https://ithelp.ithome.com.tw/upload/images/20200924/20117701prpcJtS60H.png

部署支援 SSM 的 EC2

應該不少朋友之前有用過 SSM 登入機器,它可以讓使用者不用先放入 Public Key 由 AWS 代勞在需要使用的時候放入臨時的 Public Key 來登入,如此不僅不用保管 SSH key 也可以減少資安風險 現在來教大家如何使用 CDK 部署一台可以支援 SSM 的 instance,要部署我們需要先準備

  1. Role Policy
  2. 安裝 SSM agent

Role Policy

以需求來看我們啟動 SSM 需要以下 action

  • ssmmessages:*
  • ssm:UpdateInstanceInformation
  • ec2messages:*

通常最麻煩的地方是要收集 action 收集好就把它用 array 的方法填入就 OK 了! 其實與以前準備好 action 填到 AWS Console 差不多,現在有了 CDK 就連 AWS Console 都不用進去拉!是不是超方便的 ~

ec2Instance.addToRolePolicy(
  new iam.PolicyStatement({
    actions: [
      "ssmmessages:*",
      "ssm:UpdateInstanceInformation",
      "ec2messages:*",
    ],
    resources: ["*"],
  })
);

User data

準備安裝腳本

以這次的目標需要安裝 SSM agent 我們把指令準備好,安裝的方法可以參考 AWS 文件 How do I install AWS Systems Manager Agent (SSM Agent) on an Amazon EC2 Linux instance at launch?

yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm

使用 CDK 執行安裝腳本

使用 addUserData 填入執行的字串就 OK 了!如果有多個指令也可以使用 && 把它串起來執行

ec2Instance.addUserData(
  "yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm"
);

結合昨天的程式

Role Policy 與 User Data 都準備好就把它合併到昨天的程式裡面

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",
});

ec2Instance.addToRolePolicy(
  new iam.PolicyStatement({
    actions: [
      "ssmmessages:*",
      "ssm:UpdateInstanceInformation",
      "ec2messages:*",
    ],
    resources: ["*"],
  })
);

ec2Instance.addUserData(
  "yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm"
);

使用 AWS Console 測試 SSM 登入

  1. 右上角的 Connect 點選

https://ithelp.ithome.com.tw/upload/images/20200925/20117701EYWS1MUcWd.png

  1. 選擇 Session Manager 然後點選 Connect https://ithelp.ithome.com.tw/upload/images/20200925/20117701fylZZNJbrh.png

  2. 如此就可以在網頁執行 SSH 功能拉! https://ithelp.ithome.com.tw/upload/images/20200925/20117701NkUXexi67y.png

使用 Command 測試 SSM 登入

還記得前面說的吧?我們不僅可以使用 AWS Console 登入 SSM 其實也可以使用自己的 Command Line 登入 AWS 機器,首先需要先準備 SSM Tool 並且準備 Instance ID 以我這次部署的 Instance 來說我的 Instance ID 是 i-06af4a77c0be9b4ad 就輸入

$ aws ssm start-session --target i-06af4a77c0be9b4ad

可以看到我使用 SSM agent 登入機器拉!雖然我登入完就輸入 exit 離開了 XD https://ithelp.ithome.com.tw/upload/images/20200925/20117701XPEZQcU1f4.png

以上是今日的 Role Policy 與 User Data,因為準備花了比較長的時間所以內容比較少請大家見諒