EC2の起動時にEBSを紐付ける設定をするのに割と手間取ったのでメモ
利用するのは、起動テンプレートのユーザーデータです。
ユーザーデータに関してはこちら。
設定
今回はECSのインスタンスに対してdockerコンテナが立ち上がる前にebsをマウントさせたいため、cloud-boothookにその設定を書きます。
以下はcloud-boothookに関する引用です。
cloud-boothook ユーザーデータ形式は、起動プロセスでユーザーデータシェルスクリプトよりも前に実行されます cloud-boothook ユーザーデータは、インスタンス起動のたびに実行されるため、ブートフックが複数回実行されることを防ぐためのメカニズムを作成する必要があります。
実際に書くユーザーデータは以下
Content-Type: multipart/mixed; boundary="==BOUNDARY=="
MIME-Version: 1.0
--==BOUNDARY==
Content-Type: text/cloud-boothook; charset="us-ascii"
# Create /mnt/ebs folder
cloud-init-per once mkdir_ebs mkdir -p /mnt/ebs
#cloud-boothook
#!/bin/sh
# Install awscli
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py" \
&& python get-pip.py
pip install awscli
aws configure set region ap-northeast-1
# Install JQ JSON parser
yum install -y jq
# Find Volumes
INSTANCE_AZ=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
VOLUME_ID=`aws ec2 describe-volumes --filters Name=status,Values=available Name=availability-zone,Values=$INSTANCE_AZ | jq -r '.Volumes[] |.VolumeId' | head -n 1` 2>&1 >> /tmp/cloud-boot.log
echo "volumeID: ${VOLUME_ID}" 2>&1 >> /tmp/cloud-boot.log
## Attach Volumes
if [ "${VOLUME_ID}" != "" ]; then
aws ec2 attach-volume --volume-id $VOLUME_ID --instance-id $INSTANCE_ID --device /dev/xvde 2>&1 >> /tmp/cloud-boot.log
COUNT=0
while [ ! -e /dev/xvde ] && [ $COUNT -le 4 ]; do
echo "Waiting for disk to appear.. /dev/xvde" 2>&1 >> /tmp/cloud-boot.log
sleep 1
COUNT=$(($COUNT + 1))
done
mkfs -t ext4 /dev/xvde 2>&1 >> /tmp/cloud-boot.log
echo -e '/dev/xvde /mnt/ebs ext4 defaults,user 0 2' >> /etc/fstab
fi
mount -a
chmod -R 775 /mnt/ebs
--==BOUNDARY==
Content-Type: text/x-shellscript; charset="us-ascii"
# Set any ECS agent configuration options
echo ECS_ENABLE_CONTAINER_METADATA=true >> /etc/ecs/ecs.config
echo ECS_CONTAINER_STOP_TIMEOUT=2m >> /etc/ecs/ecs.config
echo "ECS_CLUSTER=my-ecs-cluster" >> /etc/ecs/ecs.config
--==BOUNDARY==--
軽く解説
BOUNDARYでcloud-boothookとshellscriptを分けています。
#!/bin/sh と書くとそれ以降shellscriptが使えます。
ebsをマウントするにはawsコマンドを入れる必要があるので、pipで入れます。 入れたawsコマンドで必要なregion設定を行い、実際の余っているebsを使います。
ebsの検索時にAZを指定しないとマウントできないのが割とハマりどころでした。 EBSのAZはあまり意識しないので忘れがちです。
余ってるVolumeがありVolumeIDが取得できたらマウントします。
マウント出来たかどうかを見るために、sleepで確認します。
あとはECSで使う設定です。
注意
cloud-boothook内で yum update をしてはいけません。
ecs-agentがyumで管理されているため、boothook内でyumを上げると、ecs-agentも勝手に上がるようになってしまいます。
まとめ
AZ以外に個人的にハマったポイントは cloud-init per once でずっとawsコマンドのインストールをしており、インストール出来ていなかったという点です。
全部 cloud-init per always に全部書いてもいいですが、cloud-boothook上のshellで普通に書いたほうが結果的には楽でした。