🤖
Amazon Linux 2で起動時に毎回スクリプトを実行する
背景
EC2起動時にスクリプトを実行するには、AWSマネジメントコンソールでユーザデータ(UserData)を編集する手法が有名です。
新たにインスタンスを作成した初回の起動時や、停止状態から起動したときにスクリプトが実行できます。しかしながら、Amazon Linux 2では停止状態からの起動時にはこの手法が使えません。
理由
ユーザデータに書かれたスクリプトを実行する仕組みはcloud-initに依存しているのですが、Amazon Linux 2では、cloud-initは初回起動時のみ実行された後、なんとこのツール自体が削除されます。おそらくセキュリティ的理由でしょう。
よって、ユーザデータに何を書いても実行されませんし、エラーも出ないので混乱しやすいです。その上、ユーザデータの編集自体はできてしまうのも不親切です。
代替策
サービスを登録して起動時に実行されるスクリプトを用意します。
EC2にログインしてrootで作業しましょう。
$ sudo -s
サービスユニットファイルを作成します。
$ vim /etc/systemd/system/myservice.service
中身は以下のようにします。
[Unit]
Description=This is ...
After=network.target
[Service]
WorkingDirectory=/path/to/working/folder
ExecStart=/bin/bash -c 'source /home/ec2-user/.bashrc && ./myscript.sh'
User=ec2-user
Group=ec2-user
[Install]
WantedBy=multi-user.target
最後にサービス登録します
$ systemctl enable myservice.service
ポイント解説
本例で実行したいスクリプト本体は./myscript.sh
ですが、/bin/bash -c 'source /home/ec2-user/.bashrc &&
に続けて打つことで、通所のシェル上から実行するのと同じ結果が期待できます。特に、pyenvなどの仮想環境の起動コマンドが.bashrcに入っている時には便利です。
Discussion