最近因為需要再機器裡面建立大量帳號所以就研究了一下 AWS 的 user data,公司以前建立帳號是寫 Shell 腳本直接使用 adduser
的方法建立大量的使用者帳號再機器裡面,我後來再研究 cloud-init 發現它可以做得更乾淨,所以就來分享一下到底要怎麼使用 cloud-init 來創建帳號。
在 AWS EC2 上使用 cloud-init 安裝程式
其實 cloud-init 可以做的事情非常多通常比較常用的應該是安裝程式的部分,假設我們今天想要在系統開啟來的時候安裝 Apache 就可以使用它來幫助我們完成。
通常我們在 AWS 上面可以使用 User data 來撰寫安裝腳本,腳本類似如下:
#!/bin/bash yum update -y yum install -y httpd systemctl start httpd systemctl enable httpd
如果平常有在使用 Shell 腳本的人看到應該很清楚明瞭,這個腳本的意義,不過在 AWS 上面如果使用 cloud-init 來安裝會變得更簡潔好懂,可以直接寫成如下:
#cloud-config repo_update: true repo_upgrade: all packages: - httpd
如果有需要安裝多個程式的時候只要在後面確定安裝的 package 填上去即可,就算不會寫 Shell 腳本也可以輕易的使用它。
在 AWS EC2 上使用 cloud-init 創建使用者
而要創建使用者帳號怎麼辦呢?我們在 cloud-init 上面定義的腳本更簡單了,只要先準備使用者名稱跟 authorized key 就可以了。
#cloud-config cloud_final_modules: - [users-groups, always] users: - name: clarence ssh-authorized-keys: - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPXcOZnYX5+5+6Q2QnhQve/2BSX8qiTuD6imm8hrFiO6
如果我們還有想要幫它設定群組或是給予使用 sudo
的權限那也很簡單只要修改一下腳本就可以了,其實整體看起來非常的簡單,如果有多個使用者就只要把陣列完成即可。
#cloud-config cloud_final_modules: - [users-groups, always] users: - name: clarence ssh-authorized-keys: - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPXcOZnYX5+5+6Q2QnhQve/2BSX8qiTuD6imm8hrFiO6 sudo: ["ALL=(ALL) NOPASSWD:ALL"] groups: [sudo, docker] shell: /bin/bash home: /home/clarence
在 AWS EC2 User data 使用 multipart 形式檔案
而我們在 User data 有時候可能有多種需求不是只有需要安裝程式與創建使用者,可能還想要執行 Shell 腳本之類的需求,那我們就可以定義 Content-Type: multipart/mixed 來讓下面的腳本可以支援多的檔案。其實定義起來也很簡單只要宣告好 text/cloud-config
,就可以把 cloud-config 設定檔定義好了,而單的檔案的定義其實也很簡單只是要注意一下,像是這邊我是使用 //
來當 boundary 來當開頭,想要深入了解可以查詢一下 multipart 的格式,就可以理解這邊的使用方法了。
Content-Type: multipart/mixed; boundary="//" MIME-Version: 1.0 --// Content-Type: text/cloud-config; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="cloud-config.txt" #cloud-config cloud_final_modules: - [users-groups, always] users: - name: clarence ssh-authorized-keys: - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPXcOZnYX5+5+6Q2QnhQve/2BSX8qiTuD6imm8hrFiO6 sudo: ["ALL=(ALL) NOPASSWD:ALL"] groups: [sudo, docker] shell: /bin/bash home: /home/clarence --//
那我們在組合一下,像是今天我想要把 cloud-boothook 一起加進來使用,就可以直接使用如下的定義方法,就可以直接執行腳本了!是不是很簡單呢!
Content-Type: multipart/mixed; boundary="//" MIME-Version: 1.0 --// Content-Type: text/cloud-config; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="cloud-config.txt" #cloud-config cloud_final_modules: - [users-groups, always] users: - name: clarence ssh-authorized-keys: - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPXcOZnYX5+5+6Q2QnhQve/2BSX8qiTuD6imm8hrFiO6 sudo: ["ALL=(ALL) NOPASSWD:ALL"] groups: [sudo, docker] shell: /bin/bash home: /home/clarence --// MIME-Version: 1.0 Content-Type: text/cloud-boothook; charset="us-ascii" #cloud-boothook echo "boothook" >> /tmp/boothook.log --//
參考資料
- 使用者資料與 cloud-init 指示詞
- 嘗試使用 SSH 連線至 EC2 執行個體時收到「連線遭拒」或「連線逾時」錯誤。如何解決此錯誤?
- 如何在每次重新启动 Amazon EC2 Linux 实例时使用用户数据自动运行脚本?
- 嘗試存取 EC2 執行個體時收到「許可遭拒 (publickey)」或「身份驗證失敗,許可遭拒」錯誤。如何解決此錯誤?
《AWS CDK 完全學習手冊:打造雲端基礎架構程式碼 IaC》
第 12 屆 iT 邦幫忙鐵人賽 DevOps 組冠的《用 CDK 定 義 AWS 架構》
第 11 屆 iT 邦幫忙鐵人賽《LINE bot 好好玩 30 天玩轉 LINE API》
一個熱愛分享的雲端工程師!