Lambdaを使ってAutoScalingを更新する


はじめに

Amazon EC2 Auto Scalingで簡単にインスタンスを最新化できるようになりました。




[アップデート] Amazon EC2 Auto Scaling で Auto Scaling Group 内のインスタンスを最新化できるようになりました! | Developers.IO




[アップデート] Amazon EC2 Auto Scaling で Auto Scaling Group 内のインスタンスを最新化できるようになりました! | Developers.IO...


本機能をLambdaから実行することで、ビルド~デプロイを自動化してみました。

フロー

  1. CodeBuildからビルド資材をS3にアップロード
  2. S3へのアップロードをトリガーにLambdaを起動
  3. LambdaでAutoScalingの更新を実行
  4. AutoScalingの更新でS3から最新のビルド資材を取得し、Webアプリケーションを起動 本投稿では、Lambdaを使ってAutoScalingを更新する部分をメインに記載します。

事前準備

デプロイ対象のWebアプリケーションを作成する。
ここではSpringBootで作成したWebアプリケーションをGitHubに登録しました。
moria-msn/spring-boot-hello-world-for-aws

1. CodeBuildからビルド資材をS3にアップロード

CodeBuildを実行するためにリポジトリ内にbuildspec.ymlを作成して、S3にビルド資材をアップロードするようにします。

buildspec.yml
version: 0.2

phases:
  install:
    runtime-versions:
      java: corretto8
  build:
    commands:
      - echo Build started on `date`
      - mvn package
artifacts:
  files:
    - target/demo-0.0.1-SNAPSHOT.jar

次にS3にバケットを作成してから、CodeBuildでビルドプロジェクトを作成します。

2. S3へのアップロードをトリガーにLambdaを起動

S3に作成したバケットのイベントを作成します。
イベントには「すべてのオブジェクト作成イベント」を選択し、送信先にはLambda関数を選択します。
Lambda関数については、後述するLambda関数を選択します。

3. LambdaでAutoScalingの更新を実行

Lambdaで使用できる標準のAWS SDKでは、バージョンが古く、AutoScalingの更新機能を実行できません。
そのため、最新のAWS SDKをレイヤーとして追加する必要があります。
今回はランタイムに「Python 3.8」を使用したため、下記を参考にboto3の最新ライブラリをレイヤーに追加しました。
Lambda Layers で最新の AWS SDK を使用する - Qiita

レイヤーの追加が完了したら、lumbda_function.pyを下記の通り設定し、AutoScalingの更新を実行できるようにします。

lumbda_function.py
import boto3

asg_client = boto3.client('autoscaling')

def lambda_handler(event, context):

    response = asg_client.start_instance_refresh(
        AutoScalingGroupName='[AutoScaling]',
        Strategy='Rolling',
        Preferences={
            'MinHealthyPercentage': 0,
            'InstanceWarmup': 300
        }
    )

    return("Success")

4. AutoScalingの更新でS3から最新のビルド資材を取得し、Webアプリケーションを起動

AutoScalingの起動設定でユーザデータを下記の通り設定することで、
S3から最新のビルド資材を取得し、Webアプリケーションを起動するようにします。

ユーザデータ.txt
#!/bin/bash
sudo amazon-linux-extras enable corretto8
sudo yum install -y java-1.8.0-amazon-corretto
aws s3 cp s3://[バケット名]/ . --recursive
java -jar start-aws-code-build/target/demo-0.0.1-SNAPSHOT.jar

終わりに

上記設定により、CodeBuildを実行すると最新のWebアプリケーションをデプロイすることができました。
本機能を活用すれば、アプリケーションのデプロイ以外にも、下記のようにAutoScallingで使用するAMIの最新化も可能のようです。
aws-samples/ec2-auto-scaling-instance-refresh-sample: Sample EC2 Auto Scaling Instance Refresh solution to update an Auto Scaling group when a new AMI is created by EC2 Image Builder