AWS EC2 cloud-initを試してみる
- 2019.11.08
- AWS

はじめに
以前、この記事でEC2インスタンスの起動テンプレートを作成するときにユーザーデータ(UserData)を使用しましたが、ユーザーデータには直接シェルスクリプトを記述していました。このユーザーデータにはcloud-initというものが使用できるようなので、そのcloud-initを試してみたいと思います。
cloud-initでは何ができるかは、公式ドキュメントのcloud config examplesが参考になります。
起動時にユーザーを追加する設定
ユーザーを追加する書式自体は簡単なのですが、それ以前のところでつまづいてしまったのでメモとして残しておきます。
ユーザーのパスワードをSHA-512で暗号化
つまづいたところはここの部分です。cloud-initにユーザーのパスワードを追加することができるのですが、SHA-512で暗号化したものを設定しなくてはいけません。その暗号化文字列を生成するのに苦労してしまいました。
まず、この方法はMac OS上では動きません。Mac OSに入っているcrypt関数はSHA-512に対応してないためです。そのためパスワード生成はAmazon Linux2に入って行いました。
まずはsaltの生成です。ここはランダムな文字列ならなんでもいいのですが、Amazon Linux2の /etc/shadowを見ているとランダムな英数8文字で生成されているようなので、同じようにランダムな英数8文字を生成します。
$ echo `head /dev/urandom | tr -dc A-Za-z0-9 | head -c 8`
k7jYl0kd
次に暗号化した文字列を生成します。先ほど生成したsaltを$6$の次に指定します。ここではパスワードは pass としておきます。
$ python -c 'import crypt; print crypt.crypt("pass", "$6$k7jYl0kd")'
$6$k7jYl0kd$LutKpBjTIvIRxACsROXzK0wBJnvDaDmHZXrWmhkQvaJqqfwyGB0Cuycic0fmz.FzTCBMhcppSgcSquRWcc4vl0
この生成された文字列がパスワードとなります。
cloud-init用ファイルの作成
次に、cloud-init用のファイルを作成します。
#cloud-config
users:
- default
- name: waku
gecos: waku.nagoya
primary_group: wheel
lock_passwd: false
passwd: $6$k7jYl0kd$LutKpBjTIvIRxACsROXzK0wBJnvDaDmHZXrWmhkQvaJqqfwyGB0Cuycic0fmz.FzTCBMhcppSgcSquRWcc4vl0
EC2インスタンスを構築
EC2インスタンス構築時にcloud-initを適用させます。
EC2インスタンス構築時に毎回使用しているJSONファイルです。
{
"ImageId": "ami-0064e711cbc7a825e",
"InstanceType": "t2.micro",
"KeyName": "myawskey-tokyo",
"MaxCount": 1,
"SecurityGroupIds": [
"sg-04b4e7642a8fc6efe"
],
"SubnetId": "subnet-0b99e52d17314979d"
}
次のコマンドで構築します。
$ aws ec2 run-instances --cli-input-json file://ec2-amazonlinux.json --user-data file://cloud-init.txt
cloud-init設定のサンプル
他のcloud-init設定のサンプルを載せておきます。
sshでログインするユーザーの登録
すでにAWSのキーペアがある場合はそのプライベートキーを使用しますが、ここではローカル上でキーペアを作成しそれを使用した接続の方法を説明しておきます。
次のコマンドでキーペアを作成します。パスフレーズは空でエンターします。
$ ssh-keygen -t rsa -f ~/.ssh/test-key.pem
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/waku/.ssh/test-key.pem.
Your public key has been saved in /Users/waku/.ssh/test-key.pem.pub.
The key fingerprint is:
SHA256:7MxzVNKyczw5ZCzWrsccBt4+hpB7GYhpw97L17/HI88 waku@waku.local
The key's randomart image is:
+---[RSA 2048]----+
| |
| + |
| B |
| . |
| * S * @ |
| + |
| . B *.B . |
| .o|
| o. .=E.|
+----[SHA256]-----+
そうするとtest-key.pem (プライベートキー)と test-key.pem.pub(パブリックキー)が生成されるので、パブリックキーの内容をcloud-init.txtの中に記載します。
あとは、 プライベートキーの権限を設定変更しておきます。
$ chmod 400 ~/.ssh/test-key.pem
もし既存のプライベートキーを使用したい場合は次のコマンドで パブリックキーをとりだせます。
ssh-keygen -y -f privatekey.pem
次の内容がcloud-init用の設定内容です。
#cloud-config
users:
- default
- name: waku
gecos: waku.nagoya
primary_group: wheel
ssh_authorized_keys:
- ssh-rsa AAAAB3hogehogehogehogepWm....3WKCJeqGeCj waku@waku.local
cloud-initからファイルを送り込む
サンプル用のバイナリファイルを作成します。
$ echo -en "\x61\x62\x63\x64\x65\x66\x67" > test.bin
$ od -tx1a test.bin
0000000 61 62 63 64 65 66 67
a b c d e f g
0000007
このファイルをEC2インスタンスを構築時に送り込みます。
#cloud-config
write_files:
- content: !!binary |
YWJjZGVmZw==
path: /home/ec2-user/abcd
permissions: '0644'
構築後に正常に作成されているか確認します。
$ ssh -i $key ec2-user@hoge.ap-northeast-1.compute.amazonaws.com
The authenticity of host 'hoge.ap-northeast-1.compute.amazonaws.com (hoge)' can't be established.
ECDSA key fingerprint is SHA256:RHTDEJ+Oqd3Phogehoge7o/rBeHU.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'hoge.ap-northeast-1.compute.amazonaws.com,hoge' (ECDSA) to the list of known hosts.
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-2/
8 package(s) needed for security, out of 15 available
Run "sudo yum update" to apply all updates.
-bash-4.2$ ls
abcd
-bash-4.2$ od -tx1a abcd
0000000 61 62 63 64 65 66 67
a b c d e f g
0000007
正常に作成されました。
他にもいろんなことができるようですので、色々と試してみると面白そうです。
-
前の記事
AWS EC2インスタンスのRAID化(Amazon Linux編) 2019.11.07
-
次の記事
AWS Route53フェイルオーバー 2019.11.14