エキサイト株式会社の武藤です。
オンプレにあるサーバをAWSへ移行する際に、AWS Application Migration Service (AWS MGN)を使いました。 その際に、オンプレ特有のサーバの設定もそのまま引き継がれるため、修正すべき箇所がいくつか出てきます。
EC2には起動時に実行したい処理をシェルスクリプト、cloud-initから設定できるユーザデータという機能があります。 今回はcloud-initを使った設定変更を行ったので紹介します。
cloud-init とは
Linux OSの初期設定を行うためのツールです。公開鍵の設定、ユーザ作成等をyamlで記述できます。 元々はEC2用に開発されたツールのようです。Ubuntu 18からはプリインストールされています。
利用例
利用例について紹介します。
前提として、担当したシステムのインフラ構成の管理にTerraformを採用しております。 移行したサーバを管理するため、MGNで移行したインスタンスをAMIにした上で、 Terraformでは、そのAMIを基にしたEC2の構築と、設定したいユーザデータをコードに残しています。
ネットワーク周りの設定
ホスト名やDNS周りの設定です。
#cloud-config hostname: sample-host fqdn: sample-host.net manage_etc_hosts: true manage_resolv_conf: true resolv_conf: nameservers: - x.x.x.x searchdomains: - ap-northeast-1.compute.internal domain: ap-northeast-1.compute.internal
オンプレからホスト名の命名を変更したため、設定し直しました。 また、resolv.confに社内DNSが設定されていたため、AWS用に変更しました。
apache confの設定
apacheのVirtualHost等の設定です。
#cloud-config write_files: - path: /etc/apache2/sites-available/sample.com content: | <VirtualHost *:80> ServerName sample.com DocumentRoot /var/www/html/index.html </VirtualHost> owner: 'root:root' permissions: '644'
write_filesモジュールでは任意のテキストをファイルに書き出せます。 複雑なVitrualHostはこちらで設定しました。 パーミッション等も設定できます。
細かい設定はシェルスクリプト
runcmd モジュールでシェルスクリプトも実行できます。
#cloud-config runcmd: - a2ensite sample.com - service apache2 restart
runcmdでだいたいは事足りてしまいますが、yamlで書かれた設定は構造化されているので見やすさもあります。
これ以外にもにモジュールが多く用意されています。
cloud-initのキャッシュ削除
Ubuntu18のサーバを移行するときにハマった問題があるので紹介します。
先述したようにUbuntu18からcloud-initがプリインストールされており、通常のセットアップ用途にも使われます。ただ、 一度cloud-initを実行したサーバの場合、新たに用意したユーザデータが渡らず、うまく動作しないようです。
今回は、オンプレ環境時代の構築時にcloud-initが実行されており、それをMGNで移行したEC2のAMIに対して新たにユーザデータを設定し、起動するというケースだったため、想定通りに作動しませんでした。
原因としては、一度cloud-initを実行したサーバでは、以前の設定がキャッシュとして残り続けてしまい、新しいユーザデータを参照できていないことでした。
cloud-initでは、ユーザデータを読み込むソース(datasource)の設定があり、様々なクラウドサービスに対応しています。
/var/log/cloud-init.log
にdatasource決定までのログが出力されます。
今回はログからNoCloud
が指定されていることがわかり、オンプレ環境時代の キャッシュが使われている事がわかりました。
そこで、キャッシュを削除するために、cloud-initのcleanコマンドで設定をクリーンアップしました。
cloud-init clean
クリーンアップした状態をAMIにし、EC2を起動したところ、意図した設定が実行されました。
再びログを確認すると、datasourceが Ec2
になっていました。
この問題に直面したときに気づきましたが、CLIインターフェースがあります。
ドキュメントはこちらです。 cloudinit.readthedocs.io
まとめ
cloud-initを使ったLinuxの初期設定について紹介しました。 軽微かつ初回起動時に設定したい内容であれば、十分な機能だと思います。
今回はAWS移行に際したオンプレ特有の設定の整理を目的にcloud-initを使いましたが、継続的な構成管理をするのであれば、ansibleやchef、AWSマネージドのOpsWorksなどが適していそうです。 用途や要件にあった方法を採用してもらえればと思います。