AWS EC2 cloud-initを試してみる

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

はじめに

以前、この記事で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

正常に作成されました。

他にもいろんなことができるようですので、色々と試してみると面白そうです。