AWS EC2 User data 使用 cloud-init 創建使用者帳號

最近因為需要再機器裡面建立大量帳號所以就研究了一下 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
--// 

參考資料