User Dataとスクリプトを組み合わせると、インスタンスにログインすることなく、パッケージのインストールやユーザーの追加が可能です。その方法と注意点を解説します。
User dataにシェルスクリプトまたはcloud-initディレクティブを指定することによって、インスタンスの起動中に指定した処理を実行して、インスタンスにログインすることなく目的の環境を構築することが可能です。
自動化できる作業の例としては以下のものがあります
なお、User dataに指定されたスクリプトは、特に指定がない限りはインスタンスの初回起動時のみに実行されます。
起動時に使用されるUser dataは、Launch Instance画面の3ページ目、Configure Instance Detailsの下部にあるAdvanced Detailsから指定することができます。
User dataにはシェルスクリプトをそのまま入力することが可能です。コマンドは全て管理者権限で実行されますので、スクリプト内で作成されたファイルについては、権限やオーナーの変更を行わないと一般ユーザーからファイルの閲覧や編集ができなくなってしまいます。
参考例として、プリインストールされているパッケージをアップデートして、HTTPサーバーの追加・起動と自動起動を設定するスクリプトを記載します。
#!/bin/bash yum update -y yum install -y httpd service httpd start chkconfig httpd on
上記スクリプトをUser dataに指定して作成した後、インスタンスのPublic IPにアクセスすると、Apacheのテストページが表示されます。
シェルスクリプトの代わりに、またはシェルスクリプトと一緒にcloud-initディレクティブで初回起動時の処理を記述することも可能です。記述するフォーマットはYAMLですが、ドキュメントを見ないと何ができるのかが分かりづらいので注意が必要です。
上記サンプルをcloud-initディレクティブで書き換えた例を下記に示します。
#cloud-config repo_update: true repo_upgrade: all packages: - httpd runcmd: - service httpd start - chkconfig httpd on
repo_updateの行でallを指定していますが、実際はkernelやNVIDIA関係のパッケージはアップデートされません。これらのパッケージもアップデートしたい場合は、下のruncmdの行にyum update -yなどのコマンドを追加するとアップデートできます。
起動時にシェルスクリプトやcloud-initディレクティブを指定してインスタンスを準備するのは便利ですが、いくつかの注意点もあります。
スクリプト内で作成したファイルなどは所有者が管理者になってしまうため、作業のために接続した一般ユーザーが目的のファイルを閲覧、編集できない状態になります。それを防ぐためには、スクリプト内でファイルの所有者と権限を一般ユーザーでもアクセスできるように変更する必要があります。
User dataはManagement Consoleやインスタンス内から容易にアクセス可能なため、秘密鍵やアクセスキーなどのアクセスされて困る情報は格納しないでください。
時間のかかるスクリプトを実行中でもインスタンスにログインできてしまうため、何らかの形で実行終了を通知する、または確実に終了するまで待ってからインスタンスにログインして作業を行うことをお勧めします。
実行ログはManagement Console上でインスタンスを右クリックしてGet System Logをクリックするか、インスタンス内の/var/log/cloud-init.logから確認できます。
選択するOSによってはまったく処理がされない可能性があります。この記事ではAmazon Linux AMI 2014.03で検証を行っています。
上記の点に気を付ければ、インスタンスを新規作成する際に行う定型的な作業を全てコピー&ペーストで済ませることができるので、ぜひご活用ください。
Copyright © ITmedia, Inc. All Rights Reserved.