kun432's blog

Alexaなどスマートスピーカーの話題中心に、Voiceflowの日本語情報を発信してます。たまにAWSやkubernetesなど。

〜スマートスピーカーやVoiceflowの記事は右メニューのカテゴリからどうぞ。〜

PackerでEC2のAMIを作る

f:id:kun432:20201105235211p:plain

PackerでVyOSのvagrant boxを作ったので、調子に乗ってGitLabのAMIも作ってみました。構成はこんな感じ。

$ tree
.
├── files
│   ├── setup_base.sh
│   ├── setup_docker.sh
│   └── setup_gitlab.sh
└── packer.json

packer.jsonはこういう感じです。

{
  "variables": {
    "instance_type": "t2.medium",
    "source_ami": "ami-0cc75a8978fbbc969",
    "gitlab_url": "http://gitlab.example.com"
  },
  "builders": [
    {
      "name": "amazon-ebs",
      "type": "amazon-ebs",
      "region": "ap-northeast-1",
      "source_ami": "{{user `source_ami`}}",
      "instance_type": "{{user `instance_type`}}",
      "ssh_username": "ec2-user",
      "ssh_timeout": "5m",
      "ami_name": "ami-gitlab-ee-{{isotime | clean_resource_name}}",
      "tags": {
        "Name": "ami-gitlab-ee-{{isotime | clean_resource_name}}",
        "Base_AMI_ID": "{{ .SourceAMI }}",
        "Base_AMI_NAME": "{{ .SourceAMIName }}"
    }
    }
  ],
  "provisioners": [
    {
      "type": "shell",
      "scripts": [
        "files/setup_base.sh",
        "files/setup_docker.sh",
        "files/setup_gitlab.sh"
      ],
      "environment_vars": [
        "GITLAB_URL={{user `gitlab_url`}}"
      ]
    }
  ]
}

環境や用途などによって変更する事が多いだろうと思われる、インスタンスタイプやGitLabのURLはvariablesで指定できるようにしてます。ベースとなるAMIは、ビルド時の最新を取るでもいいんだけど、管理上は固定しておいたほうがいいかなという、ここは好みの問題ですね。

前回VyOSのvagrant boxの場合は、buildersにvirtualbox向けの項目を設定していましたが、今回はAMI用ということでEC2な項目が並んでますね。タグでベースAMI入れておいたりするのは以下を参考にしましたが、いいアイデアだと思いました。

Provisionersではシンプルにシェルスクリプトを並べました。setup_base.shで基本パッケージ等のインストール、setup_docker.shでDockerのインストール、setup_gitlab.shでgitlabのインストールみたいな感じです。ansibleとか使ってIaCで管理していつでも再作成OK!みたいにしてもいいんだけど、auto scalingさせるようなものでもないので、それならシンプルにシェルスクリプトでいいかなと。その代わり、死んだらバックアップから戻す必要があります。逆にauto scalingさせるのであれば、何かしらIaCなツールは使ったほうがいい気がします。

で、サンプルでsetup_gitlab.shはこんな感じです。

#!/bin/bash

set -xeuo pipefail

# install gitlab
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash
sudo EXTERNAL_URL="${GITLAB_URL}" yum install -y gitlab-ee

# install gitlab-runner
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash
export GITLAB_RUNNER_DISABLE_SKEL=true; sudo -E yum install -y gitlab-runner

ただのコマンドの羅列ですね。GitLabのインストールはGitLab公式の手順に従ってるんですが、yum install叩くときにGitLabのURLを環境変数で指定する必要があります。この部分はenvironment_varsで環境変数設定して、スクリプトからそれを参照して実行、みたいな感じです。sudoのしかたによっては引き継がれない場合もあるのでちょっと注意が必要かも。ただ、可変な部分は変数として切り出しておくことで、変更する場合もpacker.jsonのvariablesだけ書き換えればいいし、実行時に-varで上書きもできるのは、とてもいい感じです。

(今更ながら)Packerにも慣れてきたので色々作ってみようと思います。