DigitalOceanとAWSの両方に展開する方法
Packerは、複数の環境に同時にビルドすることもできます。例えば、AWSの複数リージョンでAMIを作る必要がある場合や、DigitalOcean等、ほかの環境のマシン・イメージを作成したい場合です。これまではそれぞれの環境にあわせて準備をした上で、マシン・イメージを作る必要がありました。しかしPackerがあれば、共通したプロビジョニングを行えるだけでなく、複数の環境を並列に処理しますので、時間の節約にもつながります。
例えばDigitalOceanとAWSの環境で同時にビルドするには、1つのJSONテンプレートの中に複数のビルダーを定義します。具体的にはリスト3のような記述を行います。
リスト3:DigitalOceanとAWSの両方でビルドするためのテンプレート
08 | "access_key": "{{user `aws_access_key`}}", |
09 | "secret_key": "{{user `aws_secret_key`}}", |
10 | "region": "ap-northeast-1", |
11 | "source_ami": "ami-bebda6bf", |
12 | "vpc_id": "vpc-<自分のVPC ID>", |
13 | "subnet_id": "subnet-<自分のサブネットID>", |
14 | "ssh_private_ip": false, |
15 | "associate_public_ip_address": true, |
16 | "instance_type": "t1.micro", |
17 | "ssh_username": "ubuntu", |
18 | "ami_name": "packer-example {{timestamp}}" |
21 | "type": "digitalocean", |
22 | "api_token": "<自分のtoken>", |
23 | "image": "ubuntu-14-04-x64", |
25 | "snapshot_name": "packer-sample {{timestamp}}" |
31 | "sudo apt-get update", |
32 | "sudo apt-get install -y apache2" |
これまでと変わった点は「builders」で囲まれたビルダーの中に、DigitalOceanとAWSの記述があるだけです。ファイル作成後「packer build」を実行するとし、2つの環境で同時にマシン・イメージの構築作業が始まります。最終的には、図6のように同時にビルドされた結果が表示されます。
図6:DigitalOceanとAWSでの構築作業が並行して行われた
Atlasにpushしてリモートビルド
リモートビルドを実現するAtlas連携
Packerは、HashiCorpの提供するサービスのAtlasと連携させることもできます。通常、Packerを使ってマシン・イメージを変換するには、自分の手元のPCや、ネットワーク上のサーバで作業をする必要があります。そのため、常にネットワークに接続していなくてはいけません。
この問題を解決するのがPackerとAtlasの連携です。Packerは手元のテンプレートをAtlasに送信(プッシュ)し登録することで、Atlasのサービスを通して自動的にビルドを実行(リモートビルド)できます。ビルド中の情報は自動的に記録されるため、AtlasのGUIからの参照もできます(図7)。さらに、作成されたアーティファクトの情報は、そのままAtlas上でも管理できます。これにより、Atlasを通したバージョン管理や、チームや社内でテンプレートやアーティファクトを共有できるようになります。
図7:AtlasとPackerを連携させ、Packerの情報をAtlasから参照する
リモートビルドを使うには
Packerのpushコマンドを使い、テンプレートの情報をAtlasに送信します。事前準備として、AtlasにログインしてAPIのトークンを取得する必要があります。Atlasにログイン後、画面右上の自分の名前をクリックし、左メニューの「tokens」をクリックします。テキスト・フォームには「Packer」などを入力し、「Generate Token」(トークン生成)をクリックします。画面上にトークンが表示されますので、控えておきます。
Packerのテンプレートには、以下のように新たに「push」の項目を追加します。
2 | "name": "<自分のAtlasユーザ名>/packer-tutorial" |
それから「packer push -create 」を実行すれば、Atlas上にテンプレートが登録されます。
1 | $ export ATLAS_TOKEN=<Atlasのトークン> |
2 | $ packer push -create example.json |
この段階ではアクセスキーが登録されていないため、まだビルドはできません。登録するにはまずAtlasの「Operations」タブをクリックし、画面上の「BUILD CONFIGURATIONS」に先ほどpushしたテンプレート名が表示されているのを確認します。そこをクリックした後「Variables」をクリックし、KeyとValueに「aws_access_key」と「aws_secret_key」を登録します。
最後に「packer push example.json」を実行すれば、以降のビルドはAtlas上で進行させられます。手元でテンプレートを更新したら、そのたびにpacker pushを行う必要がある点に注意してください。
まとめ
Packerはコマンドラインで操作するツールであり、マシン・イメージをGUIで操作するより、正確かつ迅速に行えることが分かると思います。特に何度も同じような作業を繰り返すケースでは、Packerの導入で管理や作業が楽になります。
これまでの連載では、Vagrantで開発環境を整え、Packerを使って様々な環境向けのマシン・イメージを準備するまでを見てきました。次回はこのマシン・イメージを元に、クラウドの基盤上にサーバやオブジェクト・ストレージなどを自動的に構成するTerraformをご紹介します。
※本稿は、2015年4月現在のAtlasおよびPacker v0.7.5に対して確認を行っています。
【参考文献】
Packer(アクセス:2015/04)
https://packer.io/
PACKER DOCUMENTATION(アクセス:2015/04)
https://packer.io/docs