こんにちは、Mashです。
本記事は私自身がAWSをお勉強で触ってみた経験を共有するシリーズ Mash式AWSチュートリアル です。
今回はAmazon EC2編の第3回となります。
EC2インスタンスを作成して起動後、必要に応じてソフトウェアのインストールや初期設定のセットアップなどを行うことになりますが、これって結構面倒ですよね。
ぜんぶ自動化したいですよね。
そんなときに便利な機能が ユーザデータ と インスタンスメタデータ です。
機能の概要紹介と実際の利用方法まで解説しますので、ぜひ最後までご覧ください。
それではいきましょう!
ユーザーデータ
まずはユーザーデータからです。
What is user data?
EC2インスタンスを作成・起動してSSH接続後、環境構築のためにコマンドを実行して必要なソフトウェアをインストールすると思います。
もしこの作業が毎回同じだったら、面倒じゃないですか?
私は毎回おんなじことはやりたくありません。自動化したいです。
こんなときに使える機能が ユーザーデータ です。
EC2作成時のここ↓で指定できます。

なんとこのユーザーデータ機能を使えば、インスタンス起動時に自動実行させたいコマンドを指定できます。
これだけ。
これだけなんですが、めっちゃ便利です。
覚えておきたい仕様
ユーザーデータ機能を利用する上で最低限覚えておきたい仕様をいくつか列挙してみます。
実行したいコマンドを直書きもしくはファイルとしてアップロードする
さきほどご覧いただいたように、AWS管理コンソール内の入力欄がありますので、ここに実行したいコマンド(実際にはスクリプト形式)を直接記入していくか、またはあらかじめ作成しておいたスクリプトファイルをアップロードするか、どちらでも指定が可能です。
実行されるのはインスタンス作成時の1回だけ
指定したコマンドが実行されるのはEC2インスタンスを作成し、OSが初回起動したときの1回のみです。
インスタンス作成者がSSH等で接続する前にコマンド実行が完了していて、コマンドが実行されている様を観察することはできません。
コマンドは管理者権限で実行される
指定したコマンドは各OSの管理者権限で実行されます。(WindowsであればAdministrator、Linuxであればroot)
なので、パッケージのインストール処理なども実行して問題ありません。
環境変数$HOMEを持たない
これは個人的にハマったポイントですので半分備忘メモになります。
前述の通りユーザーデータで定義したコマンド(スクリプト)は、Linuxの場合rootで実行されます。
私が指定したユーザーデータ処理の中で$HOMEを利用したい場面があったのですが、どうもうまく動いてくれませんでした。( $HOME = /root となることを期待していました)
よくよく調べてみるとユーザーデータ実行時は $HOME 環境変数は定義されないとのことです。
(数時間ハマってました。。。)
ユーザーデータを使ってみる
それでは実際にユーザーデータを使って、初期セットアップを自動化してみましょう。
今回OSはUbuntu 18.04 LTS を利用しています。
EC2インスタンス作成時、ユーザーデータ入力欄を以下の通り定義します。bashスクリプト形式ですね。
残りの設定はいつもどおり進めます。
#!/bin/bash # ディレクトリを作成してみる mkdir /tmp/testdir # ファイルを作成してみる touch /tmp/testdir/user-data-memo # ユーザアカウントを確認してみる whoami >> /tmp/testdir/user-data-memo # nginxをインストールしてみる apt install -y nginx

さて、EC2の作成が完了しましたのでSSHで接続してちゃんとコマンドが実行されているか確認してみました。
# ディレクトリ有無の確認
$ ls -l /tmp/
(中略)
drwxr-xr-x 2 root root 4096 Oct 30 13:30 testdir
# ファイル有無の確認
$ ls -l /tmp/testdir/
(中略)
-rw-r--r-- 1 root root 5 Oct 30 13:30 user-data-memo
# whoamiコマンドの結果確認
$ cat /tmp/testdir/user-data-memo
root
# nginxインストールできたか確認
$ nginx -v
nginx version: nginx/1.14.0 (Ubuntu)
すべて問題なしですね!
ユーザーデータはこのように、インスタンス作成・初回起動時に実施したい処理をまとめて実行することができるスグレモノです。
インスタンス作成に伴って毎回同じ作業が発生する場合は、ぜひスクリプトを作成しておいて自動化してしまいましょう!
インスタンスメタデータ
つづいてご紹介するのはインスタンスメタデータです。
What is Instance meta data?
さきほどご説明したユーザデータ機能によって、EC2インスタンス作成時にスクリプトを実行してある程度の処理を自動化できることがわかりました。
でもこれだけだとチョット足りないんです。
自動化した処理の中で、インスタンスのホスト名だったりIPアドレスだったり、インスタンス固有の情報が必要な場面って結構多くないですか?
このような要望を満たす機能が インスタンスメタデータ です。
私の場合は、業務で担当しているとある製品のエージェントソフトウェアをインストールして、その後設定ファイルに自身のIPアドレスをconfigファイルに書く必要があったり、ホスト名を宣言した上で管理サーバーと通信をする必要があったりするので、この機能は結構使ってます。
また、所属しているVPCのIDやサブネットID、セキュリティグループといったAWSに関するメタデータも取得することが可能ですので、AWS CLIを使って処理をゴリゴリ自動化したい方にとっては必須の知識とも言えるかと思います。
インスタンスメタデータを使ってみる
あまりにも数が膨大ですのですべてをご紹介することはできませんが、いくつか実例をご紹介したいと思います。
まずはインスタンスメタデータへのアクセス方法のご紹介です。
このように169.254.169.254というアドレスにhttp GETリクエストを発行することでアクセスできます。
$ curl http://169.254.169.254/latest/meta-data/
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
events/
hibernation/
hostname
identity-credentials/
instance-action
instance-id
instance-life-cycle
instance-type
local-hostname
local-ipv4
mac
metrics/
network/
placement/
profile
public-hostname
public-ipv4
public-keys/
reservation-id
security-groups
で、ここからはモノによって複数階層になっていたりしまします。
# インスタンスのプライベートIPアドレス
$ curl http://169.254.169.254/latest/meta-data/local-ipv4
172.31.47.232
# EC2インスタンスID
$ curl http://169.254.169.254/latest/meta-data/instance-id
i-06d3434da85096188
# 所属するVPC ID
$ curl http://169.254.169.254/latest/meta-data/network/interfaces/macs/$(curl -s http://169.254.169.254/latest/meta-data/network/interfaces/macs/)/vpc-id
vpc-67c0c000
# セキュリティグループ一覧
$ curl http://169.254.169.254/latest/meta-data/network/interfaces/macs/$(curl -s http://169.254.169.254/latest/meta-data/network/interfaces/macs/)/security-groups
meta-data-test-sg
launch-wizard-3
このような形式でインスタンスの情報をバッチリGETできます!
ユーザーデータで指定したスクリプト処理の中でこのインスタンスメタデータを使用する というのが、王道の使い方じゃないでしょうか。
(少なくともわたしはほぼすべての運用でこの2機能をセットで使用します)
まとめ
ユーザーデータ と インスタンスメタデータ、いかがでしたでしょうか。
これらを2つを組み合わせることで絶大なパワーを発揮してくれることが伝わりましたでしょうか。
EC2を検証目的でちょろっと触る程度であれば使わなくてもいいかもしれませんが、本番運用を自動化していくためにはほぼ必修と言えますのでぜひマスターしてみてください!
今回は以上です。
それじゃあまたね。