Posted at

ちょっとしたアーカイブやバイナリをcloud-initで配備する

More than 5 years have passed since last update.

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で設定ファイルをつくる


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インスタンスを作ってください。


あとがき

スマートな方法ではないですが、ちょっとしたバイナリを入れちゃいたい要件があったので。。。