かべぎわブログ

技術的なことについてかけたらいいな…

PackerでカスタマイズしたAMIを作成してみる

Packerを利用してすこしカスタマイズしたAMIを作成してみたいと思います。

そもそもPackerとは?

JSON形式で記載した設定ファイルのとおりにマシンイメージ(AWSであればAMI)を管理、作成することができるツールです。

たとえば、なにか共通の設定を入れたAMIをみんなで利用しているんですが、この共通のAMIってなんの設定がされているんだっけ?というのはよくある話かと思います。

そんなときに、Packerを利用してAMIを作成していれば、設定ファイルにAMIのカスタマイズした内容がはいっているため、AMIのブラックボックス化を避けることができ、管理運用が楽になります。

実際にAMIを作成してみる

Packerを利用してかんたんにAMIを作成してみたいと思います。

事前準備

アクセス権限の設定

PackerがAWSの環境をさわることができるようにAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYを環境変数に設定します。

$ export AWS_ACCESS_KEY_ID='AKIA1234567890'
$ export AWS_SECRET_ACCESS_KEY='secretkey1234567890'

PackerがAWSで動いていて、そのインスタンスに適切にロールが適用されている場合、この作業は必要ありません。

設定ファイルの作成

設定ファイルをつくっていきます。これに記載したとおりにAMIが作成できます。
今回は以下のような設定ファイルをtemplate.jsonという名前で作成してみます。

{
  "builders": [
    {
      "type": "amazon-ebs",
      "region": "ap-northeast-1",
      "source_ami": "ami-ceafcba8",
      "instance_type": "t2.micro",
      "ssh_username": "ec2-user",
      "ssh_timeout": "5m",
      "ami_name": "packer_kabegiwa_test"
    }
  ],
  "provisioners": [
    {
      "type": "shell",
      "inline": [
        "sudo yum -y install httpd"
      ]
    }
  ]
}
設定ファイルの説明
  • type - AWSの場合はamazon-ebsを指定します
  • region - AMIを作成するリージョン
  • source_ami - もととなるAMI
  • instance_type - 作成するAMIのインスタンスタイプ
  • ssh_username - ssh接続するユーザ名
  • ssh_timeout - PackerがAMIを作る際に作成するインスタンスにssh接続する際のタイムアウト時間です
  • ami_name - 作成するAMIの名前

設定ファイルの確認

設定ファイルを作成したら、正しい形式かどうか確認します。
ただしければTemplate validated successfullyと表示されるはずです。間違っていた場合、その箇所が表示されるので設定ファイルを直しましょう。

$ packer validate ./template.json
Template validated successfully.

Packerの実行

いよいよPackerを実行してAMIを作成していきます。
Packerの動きは以下の実行結果でも出力されていますが、一度インスタンスを作成して、それを削除、AMIを作成する。といった動きになっています。
ですので完了まですこし時間がかかります。

$ packer build ./template.json
amazon-ebs output will be in this color.

==> amazon-ebs: Prevalidating AMI Name: packer_kabegiwa_test
    amazon-ebs: Found Image ID: ami-ceafcba8
==> amazon-ebs: Creating temporary keypair: packer_5a6a5427-6bee-f205-2dea-085dec632299
==> amazon-ebs: Creating temporary security group for this instance: packer_5a6a542c-0a83-6f35-1554-259238d5a694
==> amazon-ebs: Authorizing access to port 22 from 0.0.0.0/0 in the temporary security group...
==> amazon-ebs: Launching a source AWS instance...
==> amazon-ebs: Adding tags to source instance
    amazon-ebs: Adding tag: "Name": "Packer Builder"
    amazon-ebs: Instance ID: i-05085ea79700a8499
==> amazon-ebs: Waiting for instance (i-05085ea79700a8499) to become ready...
==> amazon-ebs: Waiting for SSH to become available...
==> amazon-ebs: Connected to SSH!
==> amazon-ebs: Provisioning with shell script: /tmp/packer-shell459550516
    amazon-ebs: Loaded plugins: priorities, update-motd, upgrade-helper
    amazon-ebs: Resolving Dependencies
    amazon-ebs: --> Running transaction check
    amazon-ebs: ---> Package httpd.x86_64 0:2.2.34-1.16.amzn1 will be installed
    amazon-ebs: --> Processing Dependency: httpd-tools = 2.2.34-1.16.amzn1 for package: httpd-2.2.34-1.16.amzn1.x86_64
    amazon-ebs: --> Processing Dependency: apr-util-ldap for package: httpd-2.2.34-1.16.amzn1.x86_64
    amazon-ebs: --> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.2.34-1.16.amzn1.x86_64
    amazon-ebs: --> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-2.2.34-1.16.amzn1.x86_64
    amazon-ebs: --> Running transaction check
    amazon-ebs: ---> Package apr.x86_64 0:1.5.2-5.13.amzn1 will be installed
    amazon-ebs: ---> Package apr-util.x86_64 0:1.5.4-6.18.amzn1 will be installed
    amazon-ebs: ---> Package apr-util-ldap.x86_64 0:1.5.4-6.18.amzn1 will be installed
    amazon-ebs: ---> Package httpd-tools.x86_64 0:2.2.34-1.16.amzn1 will be installed
    amazon-ebs: --> Finished Dependency Resolution
    amazon-ebs:
    amazon-ebs: Dependencies Resolved
    amazon-ebs:
    amazon-ebs: ================================================================================
    amazon-ebs:  Package            Arch        Version                 Repository         Size
    amazon-ebs: ================================================================================
    amazon-ebs: Installing:
    amazon-ebs:  httpd              x86_64      2.2.34-1.16.amzn1       amzn-updates      1.2 M
    amazon-ebs: Installing for dependencies:
    amazon-ebs:  apr                x86_64      1.5.2-5.13.amzn1        amzn-updates      118 k
    amazon-ebs:  apr-util           x86_64      1.5.4-6.18.amzn1        amzn-updates       99 k
    amazon-ebs:  apr-util-ldap      x86_64      1.5.4-6.18.amzn1        amzn-updates       19 k
    amazon-ebs:  httpd-tools        x86_64      2.2.34-1.16.amzn1       amzn-updates       80 k
    amazon-ebs:
    amazon-ebs: Transaction Summary
    amazon-ebs: ================================================================================
    amazon-ebs: Install  1 Package (+4 Dependent packages)
    amazon-ebs:
    amazon-ebs: Total download size: 1.5 M
    amazon-ebs: Installed size: 3.6 M
    amazon-ebs: Downloading packages:
    amazon-ebs: --------------------------------------------------------------------------------
    amazon-ebs: Total                                              653 kB/s | 1.5 MB  00:02
    amazon-ebs: Running transaction check
    amazon-ebs: Running transaction test
    amazon-ebs: Transaction test succeeded
    amazon-ebs: Running transaction
    amazon-ebs:   Installing : apr-1.5.2-5.13.amzn1.x86_64                                  1/5
    amazon-ebs:   Installing : apr-util-1.5.4-6.18.amzn1.x86_64                             2/5
    amazon-ebs:   Installing : httpd-tools-2.2.34-1.16.amzn1.x86_64                         3/5
    amazon-ebs:   Installing : apr-util-ldap-1.5.4-6.18.amzn1.x86_64                        4/5
    amazon-ebs:   Installing : httpd-2.2.34-1.16.amzn1.x86_64                               5/5
    amazon-ebs:   Verifying  : httpd-tools-2.2.34-1.16.amzn1.x86_64                         1/5
    amazon-ebs:   Verifying  : apr-util-1.5.4-6.18.amzn1.x86_64                             2/5
    amazon-ebs:   Verifying  : httpd-2.2.34-1.16.amzn1.x86_64                               3/5
    amazon-ebs:   Verifying  : apr-1.5.2-5.13.amzn1.x86_64                                  4/5
    amazon-ebs:   Verifying  : apr-util-ldap-1.5.4-6.18.amzn1.x86_64                        5/5
    amazon-ebs:
    amazon-ebs: Installed:
    amazon-ebs:   httpd.x86_64 0:2.2.34-1.16.amzn1
    amazon-ebs:
    amazon-ebs: Dependency Installed:
    amazon-ebs:   apr.x86_64 0:1.5.2-5.13.amzn1
    amazon-ebs:   apr-util.x86_64 0:1.5.4-6.18.amzn1
    amazon-ebs:   apr-util-ldap.x86_64 0:1.5.4-6.18.amzn1
    amazon-ebs:   httpd-tools.x86_64 0:2.2.34-1.16.amzn1
    amazon-ebs:
    amazon-ebs: Complete!
==> amazon-ebs: Stopping the source instance...
    amazon-ebs: Stopping instance, attempt 1
==> amazon-ebs: Waiting for the instance to stop...
==> amazon-ebs: Creating the AMI: packer_kabegiwa_test
    amazon-ebs: AMI: ami-daabc7bc
==> amazon-ebs: Waiting for AMI to become ready...
==> amazon-ebs: Terminating the source AWS instance...
==> amazon-ebs: Cleaning up any extra volumes...
==> amazon-ebs: No volumes to clean up, skipping
==> amazon-ebs: Deleting temporary security group...
==> amazon-ebs: Deleting temporary keypair...
Build 'amazon-ebs' finished.

==> Builds finished. The artifacts of successful builds are:
--> amazon-ebs: AMIs were created:
ap-northeast-1: ami-daabc7bc

実行結果を確認してみる

以下のようにAMIが作成されていることがわかります。
f:id:kabegiwakun:20180127193501p:plain

このAMIからインスタンスを作成してみたところ、以下のようにhttpdがインストールさえれていることがわかります!

$ yum list installed | grep httpd
httpd.x86_64                         2.2.34-1.16.amzn1             @amzn-updates
httpd-tools.x86_64                   2.2.34-1.16.amzn1             @amzn-updates

おわりに

Packerを利用してAMIを作成することができました。

すこし面倒ですが、一度PackerをとおしてAMIを作成していれば、Packerの設定ファイルでこのAMIになにがインストールされているのか、どんな設定をしたのかがわかるようになります。

めんどうなドキュメント作成からすこし開放されるかもしれません。

DevOps導入指南 Infrastructure as Codeでチーム開発・サービス運用を効率化する (DEV Engineer’s Books)

DevOps導入指南 Infrastructure as Codeでチーム開発・サービス運用を効率化する (DEV Engineer’s Books)

  • 作者: 河村聖悟,北野太郎,中山貴尋,日下部貴章,株式会社リクルートテクノロジーズ
  • 出版社/メーカー: 翔泳社
  • 発売日: 2016/10/14
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る