#EC2コンテナインスタンスのAutoScalingの構築した。スケールイン時に発生する504へのアプローチ
###問題
EC2でECSクラスターを組んでいましたが、スケールインの時に、EC2コンテナインスタンスにコンテナ(ECSタスク)が稼働しているにも関わらず、EC2が削除されてしますため、504のエラーが発生してしまいます。
###対策案
この問題に対して、ECSコンテナクラスター自身が自身で稼働中のコンテナ数を検出して削除保護を有効/無効に切り替えることで、コンテナが稼働中に削除されることを防ぎます。
###参考リンク
EC2 Auto-ScalingでECS組んでますか?エラーレート高いですか?救ってあげてもいいですか?
現象も、対策の上記のリンクを同じですので参考にしてください。
ECS Container Instance scale-in protector
上記のリンクのスクリプトでは、ECSコンテナクラスター自身が、自身で稼働しているコンテナの数を検出し、AutoScalingの削除保護をture/falseにするスクリプトをcronで定期実行します。
めちゃめちゃ初心者の方の手助けになればと思い手順をまとめます。
##動作
1枚目の画像で青く選択されている実行中のタスクが0のインスタンスが2枚目の画像で以下からの保護のタブが空白になっています。
その他のインスタンスは削除保護が有効になっているため、コンテナの稼働中に削除されることはありません。
##方法
###1,Permissions for EC2 IAM role
EC2にアタッチするRoleに下記の権限を持ったポリシーを作成しアタッチしてください。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"autoscaling:DescribeAutoScalingInstances",
"autoscaling:SetInstanceProtection"
],
"Resource": "*"
}
]
}
###2,スクリプトを持ったECSCluster用AMIの作成
(userdataを利用してECSClusterを起動するよりAMIを利用したほうが早いと思っています)
ECSCluster用のAMIを作成するためのECSCluster用のAMI(amzn-ami-2018.03.q-amazon-ecs-optimized - ami-0750ab1027b6314c7)をイメージに起動します
!/bin/bash
yum install -y amazon-efs-utils
curl -o /usr/bin/jq -L https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64
chmod a+x /usr/bin/jq
curl -o /ecs_instance_scalein_protector.sh https://gist.githubusercontent.com/pseudobeer/2d0debe3ffd84d0710b18d2b1b19f94a/raw/bace2ac2afefa236ad181f9b5e227f32b5a46046/ecs_instance_scalein_protector.sh
chmod a+x ./ecs_instance_scalein_protector.sh
curl -O https://bootstrap.pypa.io/get-pip.py
python get-pip.py --user
echo 'export PATH=~/.local/bin:$PATH' >> /root/.bash_profile
source /root/.bash_profile
pip install awscli --upgrade --user
echo 'PATH=/root/.local/bin:/usr/bin:/bin' >> cron.conf
echo '*/1 * * * * /ecs_instance_scalein_protector.sh' >> cron.conf
crontab cron.conf
userdata内で、
jqコマンドのダウンロード
ecs_instance_scalein_protector.shのダウンロード
aws cliのインストール
cronの設定
EFSのマウントするためにamazon mountヘルパーのインストール
を行っています。
AMIを作成します。
###3,ECSクラスターインスタンスのAutoScalingGroupの作成
ECSクラスターのスタンスの起動時のuserdata
#!/bin/bash
echo ECS_CLUSTER=<ClusterName> >> /etc/ecs/ecs.config;echo ECS_BACKEND_HOST= >> /etc/ecs/ecs.config;
mkdir efs
mount -t efs <efsendpoint>:/ efs
##まとめ
これでEC2コンテナインスタンスがタスクの稼働中にAutoScalingで削除されることを防げます。
簡単に有効的な解決策が取れました。
タスクの配置戦略をbinpackにしているとなお有効的だと思います。
もう少しAutoScalingのAlarmを調整しようと思います。