エキサイト株式会社の武藤です。
オンプレにあるサーバをAWSへ移行する際に、AWS Application Migration Service (AWS MGN)を使いました。
その際に、オンプレ特有のサーバの設定もそのまま引き継がれるため、修正すべき箇所がいくつか出てきます。
EC2には起動時に実行したい処理をシェルスクリプト、cloud-initから設定できるユーザデータという機能があります。
今回はcloud-initを使った設定変更を行ったので紹介します。
docs.aws.amazon.com
cloud-init とは
Linux OSの初期設定を行うためのツールです。公開鍵の設定、ユーザ作成等をyamlで記述できます。
元々はEC2用に開発されたツールのようです。Ubuntu 18からはプリインストールされています。
cloud-init.io
cloudinit.readthedocs.io
利用例
利用例について紹介します。
前提として、担当したシステムのインフラ構成の管理にTerraformを採用しております。
移行したサーバを管理するため、MGNで移行したインスタンスをAMIにした上で、
Terraformでは、そのAMIを基にしたEC2の構築と、設定したいユーザデータをコードに残しています。
ネットワーク周りの設定
ホスト名やDNS周りの設定です。
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のVirtualHost等の設定です。
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 モジュールでシェルスクリプトも実行できます。
runcmd:
- a2ensite sample.com
- service apache2 restart
runcmdでだいたいは事足りてしまいますが、yamlで書かれた設定は構造化されているので見やすさもあります。
これ以外にもにモジュールが多く用意されています。
cloudinit.readthedocs.io
cloud-initのキャッシュ削除
Ubuntu18のサーバを移行するときにハマった問題があるので紹介します。
先述したようにUbuntu18からcloud-initがプリインストールされており、通常のセットアップ用途にも使われます。ただ、 一度cloud-initを実行したサーバの場合、新たに用意したユーザデータが渡らず、うまく動作しないようです。
今回は、オンプレ環境時代の構築時にcloud-initが実行されており、それをMGNで移行したEC2のAMIに対して新たにユーザデータを設定し、起動するというケースだったため、想定通りに作動しませんでした。
原因としては、一度cloud-initを実行したサーバでは、以前の設定がキャッシュとして残り続けてしまい、新しいユーザデータを参照できていないことでした。
cloud-initでは、ユーザデータを読み込むソース(datasource)の設定があり、様々なクラウドサービスに対応しています。
cloudinit.readthedocs.io
/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などが適していそうです。
用途や要件にあった方法を採用してもらえればと思います。
参考資料
dev.classmethod.jp
qiita.com
qiita.com