使用 EC2 一定要介紹到 Role Policy 與 User Data,在 AWS 因為服務很多相關的服務如果都使用 IAM Key 去處理會比較麻煩而且久了沒有換可能會有資安風險,這時候就可以使用 Role Policy 來幫我們做到這件事情,而機器啟動後通常會想要跑一些自己的腳本來設定一下機器,要達成這件事情就需要用到 User Data 拉!因此今天就來介紹他們。
昨天還沒帶大家看部署的結果,今天先來部署程式並帶大家看一下昨天部署的結果後面會用這段程式繼續延伸
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
再來看一下 CDK 部署的 SG
到 command line 使用 SSH 登入,因為我們部署的機器是 Amazon Linux 它預設的 user 名稱是 ec2-user
,如果使用的是 Ubuntu 預設的登入帳號就是 ubuntu 了
不同版本的機器可能登入的 user 預設帳號不同,大家需要注意一下
應該不少朋友之前有用過 SSM 登入機器,它可以讓使用者不用先放入 Public Key 由 AWS 代勞在需要使用的時候放入臨時的 Public Key 來登入,如此不僅不用保管 SSH key 也可以減少資安風險
現在來教大家如何使用 CDK 部署一台可以支援 SSM 的 instance,要部署我們需要先準備
以需求來看我們啟動 SSM 需要以下 action
通常最麻煩的地方是要收集 action
收集好就把它用 array 的方法填入就 OK 了!
其實與以前準備好 action 填到 AWS Console 差不多,現在有了 CDK 就連 AWS Console 都不用進去拉!是不是超方便的 ~
ec2Instance.addToRolePolicy(
new iam.PolicyStatement({
actions: [
"ssmmessages:*",
"ssm:UpdateInstanceInformation",
"ec2messages:*",
],
resources: ["*"],
})
);
以這次的目標需要安裝 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
使用 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"
);
選擇 Session Manager 然後點選 Connect
如此就可以在網頁執行 SSH 功能拉!
還記得前面說的吧?我們不僅可以使用 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
以上是今日的 Role Policy 與 User Data,因為準備花了比較長的時間所以內容比較少請大家見諒
文章內容主要是網路或是程式開發類型的文章
本文同步刊載於 Clarence 部落格:Day 11 - 使用 CDK 部署 EC2 我需要為機器加入 Role Policy 與執行 User Data
「AWS CDK 完全學習手冊:打造雲端基礎架構程式碼 IaC」
本書改編並延伸自第 12 屆 iT 邦幫忙鐵人賽獲得 DevOps 組冠軍的《用 CDK 定義 AWS 架構》系列文章,以簡單、好讀的行文風格詳述技術細節,並提供完整的程式碼範例與說明,一步一步帶領新手從零開始踏上 AWS CDK 技術達人之路。有興趣的朋友歡迎至天瓏書局選購!
前半部複習的部分好像有個 BUG
既然 keypair 是由 cdk 建立而成的, 那就表示我們機器上頭沒有這把 keypair
那應該就不會有 ssh 到機器的截圖了吧.....
在前一個章節有說明大家通常會把習慣的 KeyPair 手動丟到 console 後台,所以這邊直接使用那個名稱的呦!