EC2 Image Builder로 만든 AMI ID를 동적으로 가져와 AutoScaling 그룹의 시작 설정 업데이트

이 기사는 ZOZO 테크놀로지스 #2 Advent Calendar 2019 14일째 기사가 됩니다.
어제는 @_사_치_03의 "ZOZOTOWN의 메일 매거진의 구조에 대해서"이었습니다.

머리



ZOZO 테크놀로지스 SRE팀의 테크 리드 광야라고 합니다. 평상시는 AWS를 사용해, 보다 안전하고 보다 단서가 없고, 돈도 들지 않는다. 하지만 빠르다. 그런 느낌의 네트워크 구축에 매진하고 있습니다.

이제 이 기사에서는 AWS re:Invent 2019에서 발표된 EC2 이미지 빌더을 다룹니다. EC2 Image Builder는 지정된 레시피에 따라 EC2의 사용자 지정 이미지를 만들 수 있는 서비스입니다. 임의 또는 정기적 인 타이밍으로 AMI를 업데이트 할 수 있습니다.

AutoScaling 그룹과 함께 사용하면 매일 최신 보안 패치가 적용된 AMI를 만들어 놓고 인스턴스를 바꿔서 쉽게 할 수 있습니다. 행복합니다.

이 게시물에서는 EC2 Image Builder에서 만든 AMI ID를 기계적으로 참조할 수 있도록 고안해 보고 싶습니다.

본문



목표: CloudFormation 템플릿에서 동적 참조



우리는 인프라 관리에 CloudFormation을 많이 사용합니다.
예를 들어, CloudFormation에서 AutoScaling 시작 설정을 만들려면 다음과 같이 작성합니다.
AWSTemplateFormatVersion: 2010-09-09
Resources:
  AutoScalingLaunchConfiguration:
    Type: 'AWS::AutoScaling::LaunchConfiguration'
    Properties:
      ImageId: 'ami-0ab292e52c1d6ac8c' # Ubuntu 18.04 LTS
      InstanceType: 'm5.large'

  # 最低限の記述です。実際にはセキュリティグループなどが必要でしょう。。

여기서는 ImageId를 변경하여 CloudFormation 실행 시점에 항상 Image Builder에서 만든 최신 AMI ID를 참조하도록 합니다.

조합



CloudFormation에서는 SSM Parameter Store에 등록한 값을 동적으로 참조할 수 있습니다.
AWSTemplateFormatVersion: 2010-09-09
Resources:
  AutoScalingLaunchConfiguration:
    Type: 'AWS::AutoScaling::LaunchConfiguration'
    Properties:
      ImageId: "{{resolve:ssm:oreore-image-with-eib:1}}"
      InstanceType: 'm5.large'

or
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  AMI:
    Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
    Default: 'oreore-image-with-eib'
Resources:
  AutoScalingLaunchConfiguration:
    Type: 'AWS::AutoScaling::LaunchConfiguration'
    Properties:
      ImageId: !Ref AMI
      InstanceType: 'm5.large'

파라미터로부터의 지정이면, 버젼 번호의 입력을 생략 할 수 있기 (위해)때문에, 항상 최신~이라고 하는 지정이 이루어질 것 같습니다. 한편, EC2 Image Builder는 SNS를 지원하므로 SNS를 통해 어떻게든 Parameter Store까지 값을 전달할 수 있을 것 같은 느낌이 듭니다.

만든 것





여기서 사용자는 수동으로 CloudFormation을 업데이트합니다.

Lambda로 설정한 스크립트는 다음과 같습니다. Ruby를 좋아하기 때문에 .rb입니다.
# coding: utf-8
require 'json'
require 'aws-sdk-ssm'

def lambda_handler(event:, context:)
    message = JSON.parse(event['Records'][0]['Sns']['Message'])
    puts message # debug用
    client = Aws::SSM::Client.new
    resp = client.put_parameter({
                                  name: 'oreore-image-with-eib',
                                  value: message['outputResources']['amis'][0]['image'],
                                  type: 'String',
                                  overwrite: true
                                })

    { statusCode: 200, body: JSON.generate('OK') }
end

CloudFormartion 템플릿은 위에 나열된 것을 사용합니다.
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  AMI:
    Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
    Default: 'oreore-image-with-eib'
Resources:
  AutoScalingLaunchConfiguration:
    Type: 'AWS::AutoScaling::LaunchConfiguration'
    Properties:
      ImageId: !Ref AMI
      InstanceType: 'm5.large'

결과



EC2 이미지 빌더


SSM Parameter Store


CloudFormation


AutoScaling


확실히 반영되었습니다!

후기



EC2 Image Builder에서 Parameter Store를 통해 동적으로 최신 AMI를 얻을 수 있었습니다.
AWS의 서비스는 하나 새로운 것이 늘어나면 조합의 즐거움이 점점 퍼져 눈을 뗄 수 없습니다.

CloudFormation 템플릿이 되어만 있으면 CodePipeline등으로 자동화도 할 수 있고, 지금까지 안고 있던 「커스텀 AMI가 있으면 보다 효율적으로 여러가지 할 수 있지만, 운용하는 것이 귀찮게 하는 것이구나・・・」라고 한다 고민을 해결할 수 있을 것 같아서 매우 두근두근하고 있습니다.

내일은 @murs313 님의 기사입니다. 기대하세요!

좋은 웹페이지 즐겨찾기