【IaC入門】PackerでEC2のAMIを作成して起動してみる
初めましての方は初めまして、mackyです。
最近趣味でUnityを始めました。スパイダートランジション!
さて今回は、Packerについての記事を書きます。
Packerとは何か?
Packerとは、設定ファイルから、自動でマシンイメージを作成できるツールです。設定ファイルを文章で管理できるため、どんなマシンイメージなのかというのを明示的にすることができます。
今までは、マシンイメージの設定をした時に、本人しかわからないブラックボックス的なことになっている状況がたくさんありましたが、これを使いこなせばそんな状況は無縁になります。
ansibleとかchefのマシンイメージ版のような感じですね。設定ファイルをgitで管理するようにすれば効率いいです。
ちなみにタイトルのIaCというのはInfrastructure as Codeの略で、環境構築を手作業ではなくコードで行おうという手法のことです。
Packerの構成要素
- Template・・・Packerの設定ファイルです。JSONで書かれています。このファイルの中に後述のBuilderやProvisionerを書いていきます。
- Builder・・・作成するマシンイメージの設定です。AWSやDigitalOceanやVirtualBoxやVMware Fusionをサポートしてます。
- Provisioner・・・ここに書かれたスクリプトが作成されたマシンイメージに適応されます。
- Variables・・・変数です。ここに書いた変数を別の場所から参照できます。
Packerのインストール
それでは、Packerを使用してEC2を作成するのを目標に作業をしていきましょう。
公式サイトから自分の環境にあったファイルをダウンロードします。
今回はMac版で進めていきます。
解答したzipの中身を任意のフォルダに配置してPATHを通します。
今回は、~/.packerというフォルダに配置しました。
1 2 3 4 5 6 7 8 9 10 |
[sourcecode lang="bash"] #PATHを変更するためにbash_profileの最後に以下を記述 $ vi ~/.bash_profile ~~~ export PATH=$PATH:$HOME/.packer #ターミナル再起動後、以下実行 $ packer -v 0.9.0 [/sourcecode] |
これでPackerが使えるようになりました。
(ちなみにhomebrewでもいけるようですが今回は別の方法でやりました)
Templateの作成
次にTemplateを用意します。任意のフォルダにファイルを作成します。
今回はtemplate.jsonという名前のファイルを作成して以下を記述します
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[sourcecode lang="javascript"] { "variables": { "aws_access_key": "XXXXXXXXXXXXXXXXXX", "aws_secret_key": "XXXXXXXXXXXXXX" }, "builders": [{ "type": "amazon-ebs", "access_key": "{{user `aws_access_key`}}", "secret_key": "{{user `aws_secret_key`}}", "region": "ap-northeast-1", "source_ami": "ami-59bdb937", "instance_type": "t2.micro", "ssh_username": "ec2-user", "ami_name": "smv-packer-test {{timestamp}}" }] } [/sourcecode] |
aws_access_keyにはAWSのアクセスキーを、
aws_secret_keyにはAWSのシークレットアクセスキーを各自入力します。
AMIの作成
ファイルを作成した場所に、ターミナルで移動して、以下のコマンドを実行します。
1 2 3 |
[sourcecode lang="bash"] $ packer build template.json [/sourcecode] |
いろいろなログが流れました。
EC2のAMIの画面を確認したらマシンイメージが追加されてるのが確認出来るかと思います。このようにマシンイメージを自動で作成してくれます。
AMI作成中にスクリプトの実行
AMI作成時に、Provisionerにいろいろ書き込んでおくと、例えばWEBサーバが最初からインストールされた状態で
マシンイメージが作成されます。
先ほどのjsonファイルをもう一度開き、以下のように書き加えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
[sourcecode lang="javascript"] { "variables": { "aws_access_key": "XXXXXXXXXXXXXXXXXX", "aws_secret_key": "XXXXXXXXXXXXXX" }, "builders": [{ "type": "amazon-ebs", "access_key": "{{user `aws_access_key`}}", "secret_key": "{{user `aws_secret_key`}}", "region": "ap-northeast-1", "source_ami": "ami-59bdb937", "instance_type": "t2.micro", "ssh_username": "ec2-user", "ami_name": "smv-packer-test {{timestamp}}" }], "provisioners": [{ "type": "shell", "inline": [ "sleep 30", "sudo yum -y update", "sudo yum -y install nginx" ] }] } [/sourcecode] |
再び実行します。
実行した後にインスタンスを生成してみましょう。生成されたインスタンスにSSH接続すると初期状態から、nginxがインストールされているのが確認できます。
あとがき
閲覧ありがとうございました。
スクリプトの書き方とか調べていくと複雑なAMIを作成できそうですね。
より詳細なパラメータの使い方が知りたい場合は公式ドキュメントを参照すると色々書いてあって捗るかと思います。
次回はansibleと連携させる使い方についての予定です。