PackerでAlibaba Cloudのイメージ作成を自動化する

こんにちは。エンジニアの森(@mosuke5)です。

先日Alibaba CloudでHashiCorpのPackerとTerraformを正式サポートするというアナウンスがありました。

Terraformについては以前から利用して幾つか記事やサンプルを公開しています。しかし、Alibaba CloudでPackerは利用したことなかったので、これを機会に早速触ってみました。
Terraformについては以下を参照してください。
・Alibaba Cloud 日本リージョンがTerraformに対応したので試した

Packerとは

まずはじめにPackerとはなにかご紹介します。
PackerはHashiCorpというDevOps関連のオープンソースソフトウェアを開発する企業の製品の1つで、クラウド上(仮想環境)のイメージの作成を自動化することのできるツールです。作成したいイメージの仕様をJSONで記述し、Packerを実行するとイメージを作ってくれます。

対応サービス例

Packerは特定のインフラ、クラウドに特化したものではなく、下記のようなサービスに対応しています。

  • Alibaba Cloud
  • AWS
  • GCP
  • QEMU
  • Hyper-V

Alibaba Cloud Packer Provider

Alibaba Cloudでは公式にPackerプロバイダー(プラグイン)を用意しています。
これを利用することで、Alibaba Cloudのイメージの自動作成を行うことができます。
Packerを利用したイメージ作成の流れは大まかに下記のとおりです。

早速使ってみる

というわけで早速使ってみたいと思います。
Packerの実行環境はMac OS X El Capitanで行ってます。

インストール

まずはインストールから。Packer本体とAlibaba Cloud Packerプラグインの2つをインストールする必要があります。

Packer本体のインストール

$ curl -O https://releases.hashicorp.com/packer/1.0.3/packer_1.0.3_darwin_amd64.zip
$ unzip packer_1.0.3_darwin_amd64.zip
$ ls -l
-rwxr-xr-x 1 xxxxx wheel 54447660 7 18 08:54 packer
-rw-r--r-- 1 xxxxx staff 12066875 8 3 16:35 packer_1.0.3_darwin_amd64.zip
$ mv packer /usr/local/bin/
$ packer version
Packer v1.0.3

続いて、Alibaba CloudのPackerプラグインをインストールします。
Packerのプラグインのインストール方法はいくつかあるのですが、”~/.packer.d/plugins/”以下にプラグイン置く方法があります。(参考

Alibaba Cloud Packerプラグインは下記からダウンロードできます。
https://github.com/alibaba/packer-provider/releases

$ curl -O https://github.com/alibaba/packer-provider/releases/download/V1.1.3/packer-builder-alicloud-ecs_darwin-amd64.tgz
$ tar xfz packer-builder-alicloud-ecs_darwin-amd64.tgz
$ ls -l bin
total 73312
-rwxr-xr-x@ 1 xxxxx staff 18766172 8 3 11:46 packer-builder-alicloud-ecs
-rwxr-xr-x@ 1 xxxxx staff 18766172 8 3 11:46 packer-post-processor-alicloud-import
$ mkdir ~/.packer.d/plugins
$ mv bin/packer-* ~/.packer.d/plugins/

テンプレートファイル作成

今回ははじめてのPackerということで、わかりやすくNginx(Webサーバ)のインストールと自動起動を設定したものにします。作成したイメージでサーバを起動して、ブラウザからWebサーバにアクセスできれば成功です。

以下のテンプレートを作成しました。
本来はAPIキーなどは環境変数のほうがいいと思いますが、今回はわかりやすくするためにファイルに直接書き込みました。

{
  "variables": {
    "access_key": "xxxxxxxxxxxxxxx",
    "secret_key": "xxxxxxxxxxxxxxx"
  },
  "builders": [{
    "type":"alicloud-ecs",
    "access_key":"{{user `access_key`}}",
    "secret_key":"{{user `secret_key`}}",
    "region":"ap-northeast-1",
    "image_name":"packer_test_image",
    "source_image":"centos_7_2_64_40G_base_20170222.vhd",
    "ssh_username":"root",
    "instance_type":"ecs.n4.tiny",
    "io_optimized":"true",
    "internet_charge_type":"PayByTraffic",
    "image_force_delete":"true"
  }],
  "provisioners": [{
    "type": "shell",
    "inline": [
      "sleep 30",
      "yum install nginx -y",
      "systemctl enable nginx"
    ]
  }]
}

実行

では実際に実行していきます。
VPCやVSwitchの作成などネットワーク構築からECS作成まで行い、その後にプロビジョニング(Nginxのインストールなど)を行っているのが確認できます。
また、イメージの作成が終わると、作成したリソースは削除しています。

$ packer build test.json
alicloud-ecs output will be in this color.

==> alicloud-ecs: Force delete flag found, skipping prevalidating image name.
    alicloud-ecs: Found image ID: centos_7_2_64_40G_base_20170222.vhd
==> alicloud-ecs: Creating temporary keypair: packer_5982d94f-ff99-c019-e1d5-e6f4310f04e4
==> alicloud-ecs: Creating vpc
==> alicloud-ecs: Creating vswitch...
==> alicloud-ecs: Creating security groups...
==> alicloud-ecs: Creating instance.
==> alicloud-ecs: Allocating eip
==> alicloud-ecs: Allocated eip 47.74.16.200
==> alicloud-ecs: Starting instance.
    alicloud-ecs: Attach keypair packer_5982d94f-ff99-c019-e1d5-e6f4310f04e4 to instance: i-6we1zxshvcy5z7oqpj8m
==> alicloud-ecs: Waiting for SSH to become available...
==> alicloud-ecs: Connected to SSH!
==> alicloud-ecs: Provisioning with shell script: /var/folders/kf/8js93p3x7qg659n_762d9l840000gn/T/packer-shell047269241
(略)
    alicloud-ecs: Installed:
    alicloud-ecs: nginx.x86_64 1:1.10.2-1.el7
(略)
    alicloud-ecs: Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
==> alicloud-ecs: Deleting image snapshots.
==> alicloud-ecs: Creating image: packer_test_image

    alicloud-ecs: Detach keypair packer_5982d94f-ff99-c019-e1d5-e6f4310f04e4 from instance: i-6we1zxshvcy5z7oqpj8m
==> alicloud-ecs: Cleaning up 'EIP'
==> alicloud-ecs: Cleaning up 'instance'
==> alicloud-ecs: Cleaning up 'security group'
==> alicloud-ecs: Cleaning up 'vSwitch'
==> alicloud-ecs: Cleaning up 'VPC'
==> alicloud-ecs: Deleting temporary keypair...
Build 'alicloud-ecs' finished.

==> Builds finished. The artifacts of successful builds are:
--> alicloud-ecs: Alicloud images were created:

ap-northeast-1: m-6we1qlqmumgmmifbz2xq

管理画面からイメージを確認してみます。
”packer_test_image”という名前のイメージがあることが確認できました。

作成したイメージでサーバ起動

サーバ作成画面のオペレーティングシステムの選択でさきほど作った”packer_test_image”を選択します。

作成したサーバのグローバルIPアドレスにブラウザから接続すると、見事Nginxの画面がでてきました。

使いみち

さて、このPackerですがどんな使いみちがあるのでしょうか。
私は主に以下のような使い方があると考えています。

OSイメージのCI/CD化

今回テンプレートのプロビジョニングの設定はシェルで2-3行のコマンドを実行したのみでした。しかし、実際の運用ではプロビジョニングでAnsibleやChefといったサーバのプロビジョニングツールと連携させ、より複雑な設定がされたOSイメージを作成すると思います。
サーバプロビジョニングツールのコードの修正が行われた場合に、自動でOSイメージを作成させるインフラのCI/CDのプロセスに組み込む際にとても役たちます。

リージョン間でのイメージ共有

現状のAlibaba Cloudでは、リージョン間でOSのイメージを共有することはできません。Packerはこれを解決できると考えています。テンプレートファイルのリージョンなどの情報を少し変更すれば、同じOSイメージを異なるリージョンで簡単に作成することができます。
リージョン間でイメージを共有することで例えばグローバルでのアプリケーション展開やDR対策として役立てます。

この記事をシェアする