【AWS】EC2インスタンス起動時にユーザーデータ(user data)を使おう


はじめに

皆さんがEC2を作成にあたって、SSMエージェントや、Linux系のリポジトリなどを、あらかじめインストールしておきたいものが必ずあると思います。
EC2のユーザーデータ機能を使えば、EC2が作成されると同時に、自分がインストールしたいリソースも迅速にインストールされることとなります。
本記事は、ユーザーデータを使い方や、使う際にあたっての注意事項をまとめておきたいと思います。

下記は一つの例として挙げたいと思います。
・OS情報:Amazon Linux 2
・ユーザーデータでインストールしておきたいもの:

項番 内容
1 EPEL リポジトリ
2 nginxのインストールと自動起動設定
3 unzip
4 aws cli2
5 mysql
#!/bin/bash
amazon-linux-extras install epel -y
yum install nginx -y
systemctl start nginx
systemctl enable nginx
yum install unzip -y
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
./aws/install
yum install mysql -y

注意点①:#!/bin/bashを付け加える

通常スクリプトを書く際と同じように、#!/bin/bashをユーザーデータ上に記載しておく必要があります。

ユーザーデータシェルスクリプトは、#! 文字と、スクリプトの読み取り先であるインタープリタのパス (通常は /bin/bash)) で開始する必要があります。シェルスクリプティングに関する有用な紹介文は、Linux ドキュメントプロジェクト (tldp.org) の「BASHプログラミングのハウツー」で入手できます。

注意点②:sudoコマンドを付け加えない

ユーザーデータ書くにあたって、sudoコマンドは使用してはいけません。
理由は下記公式サイト上で記載されています。

ユーザーデータとして入力されたスクリプトは、root ユーザーとして実行されます。そのため、スクリプトでは sudo コマンドを使用しないでください。作成したファイルはすべて root ルートの所有になることを忘れないでください。ルート以外のユーザーにファイルアクセスを与える場合、スクリプトで権限を適宜変更する必要があります。また、スクリプトはインタラクティブに実行されないため、ユーザーフィードバックを必要とするコマンド (yum update フラグのない -y など) を含めることはできません。

注意点③:ユーザーデータでは、デフォルト最初作成時にのみ実行される

ユーザーデータはデフォルトでは最初作成起動時にのみ実行されるので、EC2インスタント作成後に、再起動をかけてもユーザーではは実行されることがありません。

デフォルトでは、ユーザーデータスクリプトと cloud-init ディレクティブは、EC2 インスタンスが起動される最初の起動サイクルでのみ実行されます。

注意点④:インスタンスを再起動する度にユーザーデータを実行させるには

もしサーバーが再起動されるタイミングで、何かのコマンドを実行させたいであれば、公式サイトでは下記のご案内があります。
参考URL:

上記URL内容を簡単にまとめると、ユーザーデータを毎回インスタンス起動時に実行させたければ、下記のコマンドをユーザーデータ内にあらかじめ追加しておけばOKです。

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash
あなたのスクリプト内容はここに書いてね〜!
--//--

参考資料