AWSではファイル渡したいならS3経由とかで捗る感じですが、本当にちょっとしたものの場合は、そのためにバケット用意したり、S3アクセスできるキーを用意したりというのは非常に面倒です。
cloud-initはテキストベースですが、一応がんばればバイナリファイルを渡す事も出来ますので、そのやり方。
事前準備
渡したいものをアーカイブする
1つの場合はそのままでいいですが、複数ある場合は処理が面倒なのでtar等で適当にアーカイブしておきます。後々楽なので、ルート(/)からのアーカイブにするのがおすすめ。
archive_sample
cd /
tar cpvfj /tmp/archive.tar.bz2 /tmp/hello.txt
ファイルをbase64エンコードする
cloud-initに入れるために、ファイルをbase64エンコードします。
encode_archive
base64 archive.tar.bz2 > archive.tar.bz2.b64
cloud-initをつくる
先ほどのbase64エンコードしたテキストをcloud-initに入れて、それをデコード・解凍してファイルを配備できるようにします
cloud-init_sample
#cloud-config
# vim: syntax=yaml
repo_upgrade: all
runcmd:
-
- sh
- -c
- |+
cat > /tmp/hostkey.tar.bz2.b64 <<EOF
QlpoOTFBWSZTWZrk4+cAAIH7hMoQAFBgAf2ACABiRt5AAACACCAAdBpPVMgGg0NDRptQSUJoDQ0A
DQJfMgxqEE8wCRdGgjSPIMSQNVrR0mu6JPyoASNgGjy0hzIkMOUWmskiEgvXg9DmDYQE53yo5WL9
RX3IiAfi7kinChITXJx84A==
EOF
- [sh, -c, "base64 -d /tmp/archive.tar.bz2.b64 > /tmp/archive.tar.bz2"]
- [tar, xfj, /tmp/archive.tar.bz2, -C, /]
あとはこのcloud-initを使って普通にEC2インスタンスを作ってください。
あとがき
スマートな方法ではないですが、ちょっとしたバイナリを入れちゃいたい要件があったので。。。