さくらのクラウド やってみたシリーズ(3) ~仮想サーバ起動とcloud-init~
前回の記事では仮想サーバの起動時にディスク修正
という機能を用いてOSの初期セットアップを行う手順をご紹介しました。
仮想サーバであれば一般的にはcloud-init
が使われます。
cloud-init とは
cloud-init はもともと Canonical Ltd.(Ubuntu の開発元)が開発したオープンソースのソフトウェアです。当初はec2-init
と呼ばれており、読んで字のごとくAmazon EC2の初期セットアップ専用ツールでしたが、現在では多くの Linux ディストリビューションに取り込まれ、さまざまなクラウド環境で利用されており、AWS,Microsoft Azure,Google Cloud Platform,OpenStack,VMware vSphereなど主要なクラウド基盤や仮想化基盤が対応しています。
仮想マシンの「メタデータ」「ユーザーデータ」を起動時に受け取り、自動構成を実行します。
メタデータ と ユーザーデータ
cloud-initは2つのデータをもとにOSの初期セットアップを行います
メタデータ:仮想マシン自体に関する情報が格納され一般的にはクラウドプロバイダが自動で提供を行います。instance-id,hostname,local-ipv4,public-keys,network(NIC, IP, DNSなど)が含まれています。
ユーザーデータ:ユーザーが任意で定義する初期構成スクリプトや設定を投入可能でyaml形式かシェル形式で実行コマンドを指定します。
例えばApacheをインストールさせる場合以下をcloud-initのパラメータとして設定することでOSの初回起動時に初期セットアップが行われます。
#cloud-config
package_update: true
packages:
- apache2
runcmd:
- systemctl enable apache2
- systemctl start apache2
原則cloud-initは初回OS起動時のみ実行され2回目以降の起動では作業がスキップされるよう設計されています。
さっそくやってみる
ではさくらのクラウドでcloud-init
を実行していきます。
仮想サーバ起動時のOSイメージ選択でcloudimg
と記載があるものがcloud-init
に対応しています。
さくらのクラウドで cloud-init を利用するには、仮想サーバ作成時に SSH 公開鍵の登録が求められます。これは OS 起動後に SSH でログインできるようにするためであり、cloud-init によるセットアップが正常に行われるようにするためにも重要です。
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDcT3XcZf3G9Ck+gTkRpWYqTDbK+19Ds4sPZgh8VjGJY6hEKHCSH4t+P1TQnA6qqDaMS7WdzTgRoh0yb0UNt3kAoVcMoRTWJ7Lb7Jv2tsgE3Fyxk7aCtvIuQevR0FvZAwC1IYQkOiUoHqpduKq4LLc6KgQ9C4NVAvMEqcdP2P8Me1fxOazHRffClxLUFXkZKZnt6pW2PhM03dZhZh2nS1I+3HY4FgHaKmzLxSkz7xI9dTmg6k7Nuf5Q4EcIvhjx6P8GnyOJ7wBQ+Mi+JYwW2qzZFT0ZfF7jX+g7qK3YbzPLW6Tz06XhZq7FFlQijjOTeGMUKNfDPTrrJ1fDx0ObQ6gF0LPp test@dummy
公開鍵をプロジェクトに登録しておけば簡単に再利用が可能となりますが、上記カギはあくまでテスト用ですのでこの実習限りの利用としてください。
以下の内容をユーザーデータに登録します。
#cloud-config
package_update: true # → apt update を自動実行
packages:
- apache2 # → Apache を apt install でインストール
runcmd:
- systemctl enable apache2 # → OS起動時に Apache を自動起動する設定
- systemctl start apache2 # → Apache を今すぐ起動
あとは普通に仮想サーバを起動します。
起動されるとapache2
がインストール&起動済の状態となっています。
パスワードによるログイン
さくらのクラウドでcloud-init
を使用した場合デフォルトではパスワード認証が無効化され先ほど登録したSSH公開鍵に対応した秘密鍵でのみログイン可能となります。
以下の様にパスワードを明示的に設定することでパスワードログインが可能となります。
#cloud-config
package_update: true
packages:
- apache2
ssh_pwauth: true
users:
- name: ubuntu
plain_text_passwd: "password" # 平文のパスワードをそのまま記述
lock_passwd: false
passwd: ! # ハッシュ化されたパスワードは使わず、plain_text_passwd を使うことを明示
sudo: ALL=(ALL) NOPASSWD:ALL
runcmd:
- systemctl enable apache2
- systemctl start apache2
ただしパスワードログインは非推奨であり、SSHログインを商用環境では使うようにしてください。また上記で指定したような平文パスワード方式では、¥cloud-init のログやメタデータとして残る可能性があり、情報漏洩リスクが非常に高いため注意が必要です。あらかじめmkpasswd --method=SHA-512 --rounds=4096
などで平文パスワードをハッシュ化しておき、以下のcloud-initを使うことで漏洩リスクは減らせますが、やはり引き続きSSHログインを商用では使うようにしてください。
#cloud-config
package_update: true
packages:
- apache2
ssh_pwauth: true
users:
- name: ubuntu
lock_passwd: false
passwd: "$6$rounds=4096$9i7g7U8T$BuxcZxq3QOWeDWiyD8nUdcvKXyJPw1ibWYFHHUeT/y3wGZ6z5O6vP09GqI9K3z8wVmfMd4MeVOQ8f/sKJTGJZ." # password: "password"
sudo: ALL=(ALL) NOPASSWD:ALL
runcmd:
- systemctl enable apache2
- systemctl start apache2
Discussion