Packerを利用してすこしカスタマイズしたAMIを作成してみたいと思います。
そもそもPackerとは?
JSON形式で記載した設定ファイルのとおりにマシンイメージ(AWSであればAMI)を管理、作成することができるツールです。
たとえば、なにか共通の設定を入れたAMIをみんなで利用しているんですが、この共通のAMIってなんの設定がされているんだっけ?というのはよくある話かと思います。
そんなときに、Packerを利用してAMIを作成していれば、設定ファイルにAMIのカスタマイズした内容がはいっているため、AMIのブラックボックス化を避けることができ、管理運用が楽になります。
実際にAMIを作成してみる
Packerを利用してかんたんにAMIを作成してみたいと思います。
事前準備
アクセス権限の設定
PackerがAWSの環境をさわることができるようにAWS_ACCESS_KEY_ID
とAWS_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が作成されていることがわかります。
この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)
- 作者: 河村聖悟,北野太郎,中山貴尋,日下部貴章,株式会社リクルートテクノロジーズ
- 出版社/メーカー: 翔泳社
- 発売日: 2016/10/14
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る