PackerでOCIのCustum Imageを作成してみた

こんにちは、id:a-oonoです。

当ブログではオラクルクラウドを主で扱っているので、Oracle Cloud Infrastructure (OCI) に対応している自動化ツールである Packer を紹介したいと思います。

Packerは定義ファイルをもとにマシンイメージを作成するツールです。 AWSのAMI作成等では標準的なツールなのですが、つい先日、OCIの Compute Custom Image 1作成にも利用できる点に気が付きましたので皆さんに是非紹介したいと思います。

記事の到達目標

  • Packerを用いてOCIの Custom Imageを作成します。

前提

  • packerの導入が必要となります。GoのバイナリですのでWindows, Linux, Macの各種で動作します。公式の導入手順2をご確認ください。この記事では version 1.3.3で動作確認しています。
  • oci cliが導入され、設定済みであること。
  • packerで用いるパラメータの準備。
    • 詳細は本家リファレンスを確認下さい。
      • OSイメージによってsshユーザが異なるので注意が必要です。Oracle Linuxはopc、Ubuntuはubuntuとなります。
    • Packerで作成するCustom Imageの編集元となるOracle Cloud オリジナル・イメージのocidは以下コマンドで確認しておきます。
      • イメージの命名規則は参考資料のOracle-Provided Images3を参照。
 $ oci compute image list --compartment-id xxxxxx

手順

  • packerで用いるbuild用のファイルpacker-example.jsonを準備します。

今回は、base_image_ocidにOCI公式イメージ(Ubuntu 18.04 LTS)を指定してみました。

{
  "builders": [{
    "availability_domain": "dArW:US-ASHBURN-AD-2",
    "base_image_ocid": "ocid1.image.oc1..aaaaaxxx",
    "compartment_ocid": "ocid1.compartment.xxx..aaaxxxx",
    "image_name": "ExampleImage",
    "shape": "VM.Standard.E2.1",
    "ssh_username": "ubuntu",
    "subnet_ocid": "ocid1.subnet.oc1.iad.aaaaaxxxxx",
    "type": "oracle-oci"  }],
  "provisioners": [{
    "type": "shell",
    "inline": [
      "sudo apt -y install apache2"
   ]  }]
}
  • packer buildコマンドに先ほどのファイルを引数に渡します。
$ packer build packer-example.json
oracle-oci output will be in this color.

==> oracle-oci: Creating temporary ssh key for instance...
==> oracle-oci: Creating instance...
==> oracle-oci: Created instance (ocid1.instance.oc1.ixxx).

~ 省略 ~

Build 'oracle-oci' finished.

==> Builds finished. The artifacts of successful builds are:
--> oracle-oci: An image was created: 'ExampleImage' (OCID: ocid1.image.oc1.xxxs) in region 'us-ashburn-1'

最後にCustom Image ExampleImage のocidが出力されます。 また、下図のようにCustom Imageが作成されていることも確認できます。。

f:id:a-oono:20190212140141p:plain
Packerで作成したCustom Image

動作確認

実際に、Custom ImageからComputeインスタンスをデプロイしてみると、provisionersで記載したpackegeが導入されていることが確認できます。

上記のjsonに指定している、apache2(httpd)が導入されていることが確認できました。

ubuntu@ubuntucustomimage:~$ sudo systemctl status apache2
● apache2.service - The Apache HTTP Server
   Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
  Drop-In: /lib/systemd/system/apache2.service.d
           mqapache2-systemd.conf
   Active: active (running) since Tue 2019-02-12 04:54:11 UTC; 2min 43s ago
 Main PID: 1089 (apache2)
    Tasks: 55 (limit: 4915)
   CGroup: /system.slice/apache2.service
           tq1089 /usr/sbin/apache2 -k start
           tq1090 /usr/sbin/apache2 -k start
           mq1091 /usr/sbin/apache2 -k start

Feb 12 04:54:11 ubuntucustomimage systemd[1]: Starting The Apache HTTP Server...
Feb 12 04:54:11 ubuntucustomimage apachectl[1020]: AH00558: apache2: Could not reliably determine the server's fully qua
Feb 12 04:54:11 ubuntucustomimage systemd[1]: Started The Apache HTTP Server.

発展的な課題として、セキュリティパッチを更新したイメージを定期的に自動作成したり、provisionersでansibleを利用するなどできそうです。

以上、Packer でCustom Imageを作成する方法を紹介させて頂きました。

参考文献