🤖

Amazon Linux 2で起動時に毎回スクリプトを実行する

2023/12/19に公開

背景

EC2起動時にスクリプトを実行するには、AWSマネジメントコンソールでユーザデータ(UserData)を編集する手法が有名です。
https://dev.classmethod.jp/articles/execute-ec2-cloud-init-user-data-for-every-start/

新たにインスタンスを作成した初回の起動時や、停止状態から起動したときにスクリプトが実行できます。しかしながら、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