template.json@Packer¶
はじめに¶
本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。
01. セットアップ¶
インストール¶
▼ aptリポジトリから¶
$ curl -L https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
$ sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
$ sudo apt-get update && sudo apt-get install packer
CIによる自動化¶
▼ GitLab CI¶
variables:
AWS_DEFAULT_REGION: "ap-northeast-1"
AWS_ACCOUNT_ID: "*****"
AWS_IAM_ROLE: "gitlab-ci-packer"
stages:
- build
build_ami:
stage: build
# CIの実行環境
image: docker:19.03.0
# サービスコンテナ
services:
- name: docker:19.03.0-dind
variables:
GIT_SUBMODULE_STRATEGY: "recursive"
id_tokens:
GITLAB_OIDC_TOKEN:
aud: <GitLabのURL>
before_script:
- apt-get update && apt-get install -y git jq awscli
# クレデンシャルを取得する
- |
echo "sleeping random seconds (<15s)"
sleep $(( $RANDOM % 15 ))
count=0
backoff=1
until STS=($(aws sts assume-role-with-web-identity \
--role-arn arn:aws:iam::${AWS_ACCOUNT_ID}:role/${AWS_IAM_ROLE} \
--role-session-name ""<任意のセッション名>" \
--web-identity-token $GITLAB_OIDC_TOKEN \
--duration-seconds 1800 \
--query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]' \
--output text)) || (( count++ >= 5 )); do echo "Retrying: $backoff"; sleep $backoff; (( backoff*=2 )); done
export AWS_ACCESS_KEY_ID="${STS[0]}"
export AWS_SECRET_ACCESS_KEY="${STS[1]}"
export AWS_SESSION_TOKEN="${STS[2]}"
aws sts get-caller-identity
script:
- export SOURCE_IMAGE_ID=$(aws ssm get-parameters --names /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64 --region ${AWS_DEFAULT_REGION} --query 'Parameters[0].Value' --output text)
- echo "source ami-id: $SOURCE_IMAGE_ID"
# Packerを実行する
- packer build template.json
- AMI_NAME="foo-$(date "+%Y-%m-%d")"
- AMI_ID=$(aws ec2 describe-images --region ${AWS_DEFAULT_REGION} --owners self --filters "Name=name,Values=${AMI_NAME}" --query 'Images[*][ImageId]' --output text)
- SOURCE_IMAGE_NAME=$(git tag -l $CI_COMMIT_TAG -n | awk '{print $2}' | jq -r .image_name)
- echo $SOURCE_IMAGE_NAME
rules:
- if: $CI_COMMIT_TAG
- when: manual
02. builders¶
buildersとは¶
作成するマシンイメージやコンテナイメージの内容を設定する。
typeがamazon-ebsの場合¶
▼ ami_name¶
AMIの名前を設定する。
{"builders": [{"type": "amazon-ebs", "ami_name": "bar-ami"}]}
▼ ami_users¶
{"builders": [{"type": "amazon-ebs", "ami_users": "<AWSアカウントID>"}]}
▼ ena_support¶
{"builders": [{"type": "amazon-ebs", "ena_support": "true"}]}
▼ encrypt_boot¶
{"builders": [{"type": "amazon-ebs", "encrypt_boot": "false"}]}
▼ force_deregister¶
同じ名前のマシンイメージが存在する場合に、既存のマシンイメージを登録解除してからこれを作成するか否か、を設定する。
Packerの作成するマシンイメージの名前は、ランダム値をつけない限り、常に同じである。
マシンイメージの名前の重複を許可しないプロバイダー (例:AWS) では、1
個の名前のマシンイメージを一回しか作成できないことになってしまう。
そういった場合に必要になる。
{"builders": [{"type": "amazon-ebs", "force_deregister": "true"}]}
▼ instance_type¶
{"builders": [{"type": "amazon-ebs", "instance_type": "t2.micro"}]}
▼ launch_block_device_mappings¶
EC2に紐付けるルートデバイスボリュームを設定する。
{"builders": [{"type": "amazon-ebs", "launch_block_device_mappings": [
{
# ルートボリューム
"device_name": "/dev/xvda",
"volume_type": "gp2",
# AMIの作成後に、元となったEC2のボリュームを削除する
"delete_on_termination": "true",
"volume_size": "300",
},
]}]}
▼ region¶
AMIを作成するリージョンを設定する。
{"builders": [{"type": "amazon-ebs", "region": "ap-northeast-1"}]}
▼ snapshot_users¶
{"builders": [{"type": "amazon-ebs", "snapshot_users": "<AWSアカウントID>"}]}
▼ source_ami¶
AMIの基とするAMI (例:Amazon Linux 2 AMI) を設定する。
{"builders": [{"type": "amazon-ebs", "source_ami": "ami-0b7546e839d7ace12"}]}
▼ ssh_username¶
EC2へのSSH公開鍵認証時に使用するユーザー名を設定する。
{"builders": [{"type": "amazon-ebs", "ssh_username": "ec2-user"}]}
▼ temporary_key_pair_type¶
暗号化キーの種類を設定する。
{"builders": [{"type": "amazon-ebs", "temporary_key_pair_type": "rsa"}]}
03. provisioners¶
type¶
▼ typeとは¶
サーバー/コンテナのプロビジョナーを設定する。
ansibleの場合¶
▼ playbook_file¶
{"provisioners": [{"type": "ansible", "playbook_file": "./playbook.yml"}]}
▼ user¶
{"provisioners": [{"type": "ansible", "user": "ec2-user"}]}
shellの場合¶
▼ inline¶
{"provisioners": [{"type": "shell", "inline": ["echo Hello World"]}]}
04. variables¶
variablesとは¶
ファイル内で使用する変数を設定する。
{
"variables": {"region": "ap-northeast-1"},
"builders": [{"region": "{{ user `region` }}"}],
}