Help us understand the problem. What is going on with this article?

AWS Cli + Ansible + Jenkins で Auto Scaling Launch Configuration を自動更新

More than 3 years have passed since last update.

概要

  • AWS Cli, Ansible, Jenkins を使ってイメージの作成から AutoScaling の Launch Configuration を自動更新する仕組みを構築

スクリーンショット_042516_110112_AM.jpg

環境

インストール手順については割愛

流れ

  1. AMI 作成用 EC2 インスタンスの作成
  2. 起動した EC2 インスタンスを Ansible でリモートプロビジョニング
  3. プロビジョニングした EC2 インスタンス から AMI を作成
  4. EC2 インスタンスを Terminate
  5. 作成した AMI をセットした起動設定(Launch Configuration)を作成
  6. 作成した起動設定を AutoScaling Group にアタッチ
  7. 古い起動設定を削除

下準備

Jenkinsジョブ

  • Parameterized Trigger plugin を使って、パラメータをテキストファイルに書き込み、下流ジョブに渡す。(参考記事

AWS Cli

  • aws configure コマンドであらかじめ ./aws/config と ./aws/credentials ファイルを作成して、/var/lib/jenkins 配下にコピーしておく。

ジョブコード

  • 基本やっていることは下記の3つ。
    1. aws コマンドをいろいろなオプション付きで実行する。
    2. レスポンスの JSON を jq コマンドでパースし、必要なパラメータを抽出する。
    3. パラメータを次のジョブに渡す。
  • コマンドのパスを通すため .bashrc をジョブ毎で読み込む。(他の方法で可能なら必要ない)

1. AMI 作成用 EC2 インスタンスの作成

  • ec2 run-instances を利用する。
  • いくつか重複するオプションがあり(security-groups, secruity-group-ids, placement Groups など)、同時に宣言するとエラーになる。
  • ec2 wait instance-status-ok オプションでインスタンスの起動がステータスOKになるまで待機する。
source ~/.bashrc

SECURITY_GROUP=sg-xxxx
KEY_NAME=xxxx
INSTANCE_TYPE=t2.micro
SUBNET_ID=subnet-xxxx

INSTANCES=`aws ec2 run-instances \
--image-id $AMI_ID \
--security-group-ids $SECURITY_GROUP \
--key-name $KEY_NAME \
--instance-type $INSTANCE_TYPE \
--placement AvailabilityZone=ap-northeast-1a \
--block-device-mappings '[{"DeviceName": "/dev/sda1", "Ebs":{"DeleteOnTermination":true}}]' \
--subnet-id $SUBNET_ID \
--no-associate-public-ip-address`

INSTANCE_ID=`echo $INSTANCES | jq -r '.Instances[].InstanceId'`

aws ec2 wait instance-status-ok --instance-ids $INSTANCE_ID

echo "INSTANCE_ID=$INSTANCE_ID" > $WORKSPACE/params.txt

2. 起動した EC2 インスタンスを Ansible でリモートプロビジョニング

  • Ansible Play Book の内容は割愛
  • Anisble は Jenkins サーバーにインストールし、EC2 インスタンスに対してリモートプロビジョニングを実行
  • EC2 インスタンスのプライベートIPを inventory file に 追記し、ansible-playbookを実行
source ~/.bashrc

INSTANCES=`aws ec2 describe-instances --instance-ids $INSTANCE_ID`

PRIVATE_IP=`echo $INSTANCES | jq -r .Reservations[].Instances[].PrivateIpAddress`

cd $WORKSPACE/inventory
echo -e [server] > ami_template
echo -e "${PRIVATE_IP} ansible_ssh_user=centos ansible_ssh_private_key_file=/var/lib/jenkins/.ssh/id_rsa.pem" >>  ami_template

cd $WORKSPACE
ansible-playbook -i inventory/ami_template main.yml --tags xxx,xxx,xxx

echo "INSTANCE_ID=$INSTANCE_ID" > $WORKSPACE/params.txt

3. プロビジョニングした EC2 インスタンス から AMI を作成

  • ec2 create-image と 起動したインスタンスを使って AMI を作成する。
  • AMI 作成時にタグを付けられない、ec2 create-tags を使って AMI にタグを付ける。
  • ec2 wait image-available オプションで AMI が利用可能になるまで待機する。
source ~/.bashrc

NOW=`date '+%Y%m%d%H%M%S'`
AMI_NAME=service-ec-image_${NOW}

IMAGE=`aws ec2 create-image \
--instance-id $INSTANCE_ID \
--name $AMI_NAME \
--no-reboot`

NEW_AMI_ID=`echo $IMAGE | jq -r .ImageId`

aws ec2 create-tags --resources $NEW_AMI_ID --tags Key=xxxx,Value=xxxx
aws ec2 wait image-available --image-ids $NEW_AMI_ID

echo "INSTANCE_ID=$INSTANCE_ID\n" > $WORKSPACE/params.txt
echo "NEW_AMI_ID=$NEW_AMI_ID" >> $WORKSPACE/params.txt

4. EC2 インスタンスを Terminate

source ~/.bashrc

aws ec2 terminate-instances --instance-ids $INSTANCE_ID
aws ec2 wait instance-terminated --instance-ids $INSTANCE_ID

5. 作成した AMI をセットした起動設定(Launch Configuration)を作成

source ~/.bashrc

NOW=`date '+%Y%m%d%H%M%S'`
LAUNCH_CONFIGURATION_NAME=service_${NOW}
SECURITY_GROUP=sg-xxxxx
INSTANCE_TYPE=t2.micro

aws autoscaling create-launch-configuration \
--launch-configuration-name $LAUNCH_CONFIGURATION_NAME \
--image-id $NEW_AMI_ID \
--security-groups $SECURITY_GROUP \
--instance-type $INSTANCE_TYPE

echo "LAUNCH_CONFIGURATION_NAME=$LAUNCH_CONFIGURATION_NAME" > $WORKSPACE/params.txt

6. 作成した起動設定を Auto Scaling Group にアタッチ

source ~/.bashrc

AUTO_SCALING_GROUP=`aws autoscaling describe-auto-scaling-groups \
--auto-scaling-group-name service_asg`

OLD_LAUNCH_CONFIGURATION_NAME=`echo $AUTO_SCALING_GROUP | jq -r .AutoScalingGroups[].LaunchConfigurationName`

aws autoscaling update-auto-scaling-group \
--auto-scaling-group-name service_asg \
--launch-configuration-name $LAUNCH_CONFIGURATION_NAME

echo "OLD_LAUNCH_CONFIGURATION_NAME=$OLD_LAUNCH_CONFIGURATION_NAME" > $WORKSPACE/params.txt

7. 古い起動設定を削除

source ~/.bashrc

aws autoscaling delete-launch-configuration \
--launch-configuration-name $OLD_LAUNCH_CONFIGURATION_NAME

まとめ

  • Packer の代用になる仕組みを AWS Cli を使って構築できた。
  • Packer で Ansible を利用する場合、AMI に Anisble をインストール する必要があり(EC2 の場合)、動作環境に余計なツールをインストールしたくなかったので断念した。
  • 発展系として作成した AMI が正しい状態かどうかを確認するフローを検討したい。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした