AWS移行におけるcloud-initを使ったLinuxの初期設定

エキサイト株式会社の武藤です。

オンプレにあるサーバを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周りの設定です。

#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で書かれた設定は構造化されているので見やすさもあります。

これ以外にもにモジュールが多く用意されています。

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