iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 11
1
DevOps

用 CDK 定義 AWS 架構系列 第 11

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

  • 分享至 

  • xImage
  •  

使用 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,因為準備花了比較長的時間所以內容比較少請大家見諒

想要看更多嗎?歡迎到我的部落格參觀

文章內容主要是網路或是程式開發類型的文章

本文同步刊載於 Clarence 部落格:Day 11 - 使用 CDK 部署 EC2 我需要為機器加入 Role Policy 與執行 User Data


「AWS CDK 完全學習手冊:打造雲端基礎架構程式碼 IaC」
本書改編並延伸自第 12 屆 iT 邦幫忙鐵人賽獲得 DevOps 組冠軍的《用 CDK 定義 AWS 架構》系列文章,以簡單、好讀的行文風格詳述技術細節,並提供完整的程式碼範例與說明,一步一步帶領新手從零開始踏上 AWS CDK 技術達人之路。

有興趣的朋友歡迎至天瓏書局選購!

購書連結 https://bit.ly/2ZMAebE

https://ithelp.ithome.com.tw/upload/images/20211103/20117701W7l6fQnn2L.jpg


上一篇
Day 10 - 使用 CDK 部署 EC2
下一篇
Day 12 - 使用 CDK 部署 Bastion Host 防禦主機!
系列文
用 CDK 定義 AWS 架構30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
cool21540125
iT邦新手 4 級 ‧ 2023-03-25 18:14:33

前半部複習的部分好像有個 BUG

既然 keypair 是由 cdk 建立而成的, 那就表示我們機器上頭沒有這把 keypair

那應該就不會有 ssh 到機器的截圖了吧.....

Clarence iT邦新手 3 級 ‧ 2023-03-31 10:45:33 檢舉

在前一個章節有說明大家通常會把習慣的 KeyPair 手動丟到 console 後台,所以這邊直接使用那個名稱的呦!

我要留言

立即登入留言