CloudWatch Events로 서버 시작 관리하기

임의의 타이밍에서 서버 기동·정지할 수 있는 구조로서 AWSSimpleConsole가 있습니다.
htps : // 기주 b. 코 m / 모케 모케 치 c 켄 / 아 W 씨 mp ぇ

다만, docker의 사용이나 ElasticBeanstalk에서의 기동 관리 등, 새로운 구조를 도입해 가는 환경 속에서, AWSSimpleConsole로 운용하는 서버도 몇대가 되었기 때문에, 이번, CloudWatch의 Events 기능을 이용한 기동 제어에 리플레이스했습니다.
또, 관리 콘솔에 있어서의 표시와 설정에 대해서도 주의점이 있으므로 기술합니다.

요구사항


  • 개발에 필요한 서버에 대해 야간이 필요하지 않기 때문에 매일 시간을 지정하고 중지합니다
  • 시작이 부정기이므로 매번 API를 실행하여 시작합니다
  • .

    방법


  • CloudWatch Events에서 일정을 사용하고 대상에 인스턴스 지정
  • Terraform을 사용하여 설계 및 구현

  • 주의점


  • InstanceId는 StringList 형식으로 지정해야합니다
  • 한 번에 지정할 수 있는 최대 수는 5개
  • cron-like에 일정을 정의 할 수 있지만 UTC 시간대에서 작성해야합니다


  • 설정


  • 이벤트 소스 및 대상을 설정하여 일정이 트리거될 때 시작할 대상을 선택합니다. Systems Manager는 대상으로 정의된 자동화 문서를 제공하므로 arn = "arn:aws:ssm:ap-northeast-1::automation-definition/AWS-StopEC2Instance"로 정의합니다.



  • cloudwatch_event_rule.tf
    resource "aws_cloudwatch_event_rule" "stop_rule_1" {
      name        = "stop-rule-1"
      description = "server stop the dev server at 22:00(JST)"
    
      schedule_expression = "cron(0 13 * * ? *)"
    }
    
    // The number of InstanceId constants is limited within 5
    resource "aws_cloudwatch_event_target" "stop_target_1" {
      target_id = "StopInstance"
      arn       = "arn:aws:ssm:ap-northeast-1::automation-definition/AWS-StopEC2Instance"
      rule      = aws_cloudwatch_event_rule.stop_rule_1.name
      role_arn  = aws_iam_role.cloudwatch_event_ssm_role.arn
    
      input = <<EOF
    {
      "InstanceId": ["i-00000000000000000", "i-11111111111111111", "i-22222222222222222", "i-33333333333333333", "i-44444444444444444"]
    }
    EOF
    }
    
    resource "aws_cloudwatch_event_rule" "stop_rule_2" {
      name        = "stop-rule-2"
      description = "server stop the dev server at 22:00(JST)"
    
      schedule_expression = "cron(0 13 * * ? *)"
    }
    
    // The number of InstanceId constants is limited within 5
    resource "aws_cloudwatch_event_target" "stop_target_2" {
      target_id = "StopInstance"
      arn       = "arn:aws:ssm:ap-northeast-1::automation-definition/AWS-StopEC2Instance"
      rule      = aws_cloudwatch_event_rule.stop_rule_2.name
      role_arn  = aws_iam_role.cloudwatch_event_ssm_role.arn
    
      input = <<DOC
    {
      "InstanceId": ["i-55555555555555555"]
    }
    DOC
    }
    

    iam_role.tf
    resource "aws_iam_role" "cloudwatch_event_ssm_role" {
      name = "cloudwatch_event_ssm_role"
    
      assume_role_policy = <<EOF
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Action": "sts:AssumeRole",
          "Principal": {
            "Service": [
             "events.amazonaws.com"
             ]
         },
          "Effect": "Allow",
          "Sid": ""
        }
      ]
    }
    EOF
    }
    
    resource "aws_iam_role_policy" "cloudwatch_event_ssm_rds_policy" {
      name = "cloudwatch_event_ssm_rds_policy"
      role = aws_iam_role.cloudwatch_event_ssm_role.id
    
      policy = <<EOF
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "",
          "Effect": "Allow",
          "Action": [
            "rds:StopDBInstance",
            "rds:StartDBInstance",
            "rds:DescribeDBInstances"
          ],
          "Resource": "*"
        }
      ]
    }
    EOF
    }
    
    resource "aws_iam_role_policy_attachment" "AmazonSSMAutomationRole" {
      role       = aws_iam_role.cloudwatch_event_ssm_role.id
      policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonSSMAutomationRole"
    }
    

    tips


  • AWS 관리의 Role인 cloudwatch_event_ssm_role이지만, 왠지 RDS에 대한 권한이 없기 때문에, RDS 인스턴스를 지정하는 경우는 별도 정책을 작성할 필요가 있다.
    또한, RDS 인스턴스의 ID 지정은 DB identifier를 기술한다.

  • cloudwatch_event_ssm_role.json
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "lambda:InvokeFunction"
                ],
                "Resource": [
                    "arn:aws:lambda:*:*:function:Automation*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "ec2:CreateImage",
                    "ec2:CopyImage",
                    "ec2:DeregisterImage",
                    "ec2:DescribeImages",
                    "ec2:DeleteSnapshot",
                    "ec2:StartInstances",
                    "ec2:RunInstances",
                    "ec2:StopInstances",
                    "ec2:TerminateInstances",
                    "ec2:DescribeInstanceStatus",
                    "ec2:CreateTags",
                    "ec2:DeleteTags",
                    "ec2:DescribeTags",
                    "cloudformation:CreateStack",
                    "cloudformation:DescribeStackEvents",
                    "cloudformation:DescribeStacks",
                    "cloudformation:UpdateStack",
                    "cloudformation:DeleteStack"
                ],
                "Resource": [
                    "*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "ssm:*"
                ],
                "Resource": [
                    "*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "sns:Publish"
                ],
                "Resource": [
                    "arn:aws:sns:*:*:Automation*"
                ]
            }
        ]
    }
    


  • 관리 콘솔에서 규칙을 편집하면 InstanceId의 입력 값이 StringList 형식이 아닌 쉼표로 구분 된 문자열로 변경되었습니다. (기능 개선 요구됨)



  • 확인


  • 지정된 시간에 지정된 인스턴스가 중지되었는지 확인할 수 있음

  • 좋은 웹페이지 즐겨찾기