EventBridge Schedulerを使ってCloudFormationテンプレートを定期実行してみた

EventBridge Schedulerを使ってCloudFormationテンプレートを定期実行してみた

Clock Icon2024.10.11

はじめに

かつまたです。S3に保存したCloudFormationテンプレートとEventBridge Schedulerを用いることで指定した時刻でスタック作成と削除を行える構成を作成したため手順をご紹介します。この構成によって複雑な構成のテンプレートを用いた際でも、消し忘れや不要なコスト発生を抑え、管理を楽にすることができます。

目次

  1. CloudFormationテンプレート作成
  2. IAMロール作成
  3. EventBridge Scheduler作成
  4. 動作確認

1.CloudFormationテンプレート作成とS3アップロード

  1. パブリックサブネットにEC2を配置する簡易的な構成をYAMLテンプレートでローカルに記述し、保存します。
YAMLテンプレート
yaml例
AWSTemplateFormatVersion: '2010-09-09'

Parameters:
  MyIP:
    Type: String
    Description: The IP address range that is allowed to access the instance
    Default: '104.28.204.107/32'

Resources:
  katsumataVPCCFn:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: true
      EnableDnsHostnames: true

  katsumataEC2CFn:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: t2.micro
      ImageId: ami-0e2612a08262410c8 #自身のリージョンに存在するAMI IDを記入
      NetworkInterfaces:
        - AssociatePublicIpAddress: true
          DeviceIndex: '0'
          SubnetId: !Ref katsumataSubnetCFn
          GroupSet:
            - !Ref katsumataSgCFn

  katsumataSgCFn:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Allow HTTP
      VpcId: !Ref katsumataVPCCFn
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: !Ref MyIP
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: !Ref MyIP

  katsumataSubnetCFn:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref katsumataVPCCFn
      CidrBlock: 10.0.1.0/24
      MapPublicIpOnLaunch: true

  katsumataIGWCFn:
    Type: AWS::EC2::InternetGateway
    Properties: {}

  katsumataVPCGatewayAttachmentCFn:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref katsumataVPCCFn
      InternetGatewayId: !Ref katsumataIGWCFn
  1. 作成したテンプレートを適当なS3バケットにアップロードします。その際、オブジェクトURLを控えておきます。
    オブジェクトURL.png

2.IAMロール作成

CloudFormation用IAMロール

CloudFormationがリソースの作成や削除を実行できるロールを作成します。

  1. 「IAM」→「ロール」の「ロールを作成」から「AWSのサービス」を選択し、「ユースケース」で「CloudFormation」を選択します。
    スクリーンショット 2024-10-09 18.24.09.png

2.ロールを作成し、ロール詳細の「ポリシーを追加」→「インラインポリシーを作成」から以下のポリシーを記入します。

json
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": "ec2:*",
			"Resource": "*"
		}
	]
}

スクリーンショット 2024-10-10 12.02.33.png

EventBridge Scheduler用IAMロール

EventBridge SchedulerがS3からテンプレートファイルを取得し、先ほど作成したCloudFormation用IAMロールを受け取ってCloudFormationスタックを作成、削除できるロールを作成します。
1.「IAM」→「ロール」の「ロールを作成」から「カスタム信頼ポリシー」を選択し、以下のポリシーを記述します。

json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "scheduler.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

スケジューラー用信頼関係.png

2.先ほどと同様に一度ロールを作成し、インラインポリシーを追加から以下のポリシーを記述します

json
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "VisualEditor0",
			"Effect": "Allow",
			"Action": [
				"s3:GetObject",
				"iam:PassRole",
				"cloudformation:CreateStack",
				"cloudformation:DeleteStack"
			],
			"Resource": "*"
		}
	]
}

スクリーンショット 2024-10-10 12.02.06.png

3.EventBridge Scheduler作成

テンプレートからスタックを作成、削除するEventBridge Schedulerを作成します。

スタック作成スケジュール

1.「EventBridge」→「スケジュール」から「スケジュールを作成」を選択します。
2.「スケジュールのパターン」を以下のように設定します。

  • 頻度:定期的なスケジュール
  • タイムゾーン:Asia/Tokyo
  • スケジュールの種類:cron ベースのスケジュール
  • cron式
時間 日付 曜日
0 10 ? * MON-FRI *

Start Cron式.png

3.「ターゲットの選択」で「すべてのAPI」を選択し、検索ボックスから「CloudFormation」を検索→「Amazon CloudFormation」を選択し、続けて検索ボックスから「CreateStack」を検索し、選択する。

CreateStackAPI.png

4.入力パラメータに以下を入力する。

{ 
  "StackName": "スタック名", 
  "TemplateURL": "オブジェクトURL",
  "RoleARN": "CloudFormation用IAMロールのARN, 
  "Parameters": [ 
     {
       "ParameterKey": "MyIP", 
       "ParameterValue": "自身のIPアドレス" 
     }
   ] 
 }

スクリーンショット 2024-10-08 14.52.38.png

スタック削除スケジュール

スタック作成スケジュールと同様に作成します。
1.cron式は以下の通りに設定します。

時間 日付 曜日
0 17 ? * MON-FRI *

Stop Cron.png

2.「ターゲットの選択」では「CloudFormation」から「DeleteStack」を選択します。
Delete API.png

3.入力パラメータは以下のように設定します。

{
   "StackName": "スタック名",
   "RoleARN": "CloudFormation用IAMロール" 
}

スクリーンショット 2024-10-10 11.17.20.png

4.動作確認

  1. 指定した時間にスタックが作成され、削除されていることをコンソールの「CloudFormation」→「スタック」から確認できます。
    スタック作成確認.png

おわりに

テンプレートで記述した構成を時間指定で一括作成・削除することで、管理とコスト抑制に貢献できると感じました。ご覧いただきありがとうございました。

参考

https://zenn.dev/hgafwyt9qh/articles/2080eb7e834a2e#s3の作成及びテンプレートのアップロード

アノテーション株式会社について

アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.