EC2 болон RDS-ээ Eventbridge ашиглан тогтмол цагт асаж унтрахаар автоматжуулаарай

Tsengel Enkhbat
Unimedia Solutions
Published in
4 min readDec 31, 2022

Cloud үйлчилгээний давуу тал бол хэрэглэснээрээ төлбөрөө төлөх. Тэгэхээр бид яагаад хөгжүүлэлтийн орчныхоо EC2 болон RDS-ыг 24/7 ажиллуулах хэрэгтэй билээ? Яагаад даваагаас баасан гариг хүртэл өглөө 9-өөс орой 9 цагийн хооронд ажилуулж болохгүй гэж…
Workflow-ыг зургаар харуулав.

Хэрхэн роль ажиллах талаар мэдээсэй гэж хүссэндээ жоохон нуршуу зурчлаа. Ерөнхийдөө доорх хоёрхон алхамыг хийнэ.

  1. SSM болон Eventbridge-д роль үүсгэх
  2. Eventbridge rule үүсгээд тухайн rule дээрээ SSM Automation-ыг эхлүүлэх target нэмэх

Алхам 1
Роль үүсгэхийн тулд trust policy болон permission policy документ хэрэгтэй.
Trust Policy — Ямар сервис тухайн ролийг авч болох вэ гэдгийг тодорхойлно.
Permission Policy — Тухайн ролийг авснаар ямар ямар хандалт хийх эрхтэй болох вэ гэдгийг тодорхойлно

#!/bin/bash
# SSM Automation document-ыг ажиллуулахад хэрэглэгдэх роль үүсгэх
TRUST_POLICY_SSM='{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ssm.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}'

aws iam create-role \
--role-name AllowSSMToManageEC2RDSStartStop \
--assume-role-policy-document "$TRUST_POLICY_SSM" \
--query "Role.Arn" --output text
# Eventbridge-ээс Automation document дуудахдаа тухайн роль
# арн-ыг дамжуулах учир хадгалаад аваарай

# Тухайн рольдоо доорх EC2 болон RDS сервисийг удирдах
# (унтраах, асаах гэх мэт) эрх өгөх
PERMISSION_POLICY_SSM='{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ManageEC2RDSStartStop",
"Effect": "Allow",
"Action": [
"ec2:StartInstances",
"ec2:StopInstances",
"ec2:DescribeInstances",
"ec2:DescribeInstanceStatus",
"rds:DescribeDBClusters",
"rds:DescribeDBInstances",
"rds:StartDBCluster",
"rds:StartDBInstance",
"rds:StopDBCluster",
"rds:StopDBInstance"
],
"Resource": "*"
}
]
}'

aws iam put-role-policy \
--role-name AllowSSMToManageEC2RDSStartStop \
--policy-name AllowSSMToManageEC2RDSStartStop \
--policy-document "$PERMISSION_POLICY_SSM"


# Eventbridge-ээс SSM Automation Document-ыг ажиллуулах роль үүсгэх
TRUST_POLICY_EVENTBRIDGE='{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "events.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}'

aws iam create-role \
--role-name EventBridgeToInvokeSSMAutomation \
--assume-role-policy-document "$TRUST_POLICY_EVENTBRIDGE" \
--query "Role.Arn" --output text

# Тухайн рольдоо доорх Automation document-г ажиллуулах,
# SSM сервисрүү тухайн Automation document-г ажиллуулахад
# хэрэгцээтэй роль дамжуулах эрх өгнө
PERMISSION_POLICY_EVENTBRIDGE='{
"Version": "2012-10-17",
"Statement": [
{
"Action": "ssm:StartAutomationExecution",
"Effect": "Allow",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": ["iam:PassRole"],
"Resource": "arn:aws:iam::*:role/AllowSSMToManageEC2RDSStartStop",
"Condition": {
"StringLikeIfExists": {
"iam:PassedToService": "ssm.amazonaws.com"
}
}
}
]
}'
aws iam put-role-policy \
--role-name EventBridgeToInvokeSSMAutomation \
--policy-name EventBridgeToInvokeSSMAutomation \
--policy-document "$PERMISSION_POLICY_EVENTBRIDGE"

Алхам 2
Eventbridge console-ын хажуу цэснээс Rules-ыг сонгож ороод Create rule товчийг дарна. Дараах байдлаар

Дээрх байдлаар бөглөөд Continue to create rule -ыг дарна.

Хэзээ ажиллуулахыг cron-оор бичээд Next дарна. Яаж бичихийг эндээс хараарай.

Дээрх байдлаар Таrget-уудаа нэмээд Rule-аа үүсгээрэй.

Алхам 2 дээрхитэй адил зарчимаар AWS-StopEC2Instance, AWS-StopRdsInstance Automation document-ыг ашиглаад Stop хийх Eventbridge rule-ээ бичээрэй.

Хэрэв өгөгдлийн сан чинь Aurora ашиглаж байгаа бол доорх yaml-ыг ашиглан өөрөө AWS System Manager console-ын Documents-рүү ороод automation document үүсгээд ашиглаарай.

---
description: Start Aurora Cluster
schemaVersion: "0.3"
assumeRole: "{{ AutomationAssumeRole }}"
parameters:
ClusterId:
type: String
description: (Required) Aurora Cluster Id to start
AutomationAssumeRole:
type: String
description: (Optional) The ARN of the role that allows Automation to perform the actions on your behalf.
default: ""
mainSteps:
- name: AssertNotStartingOrAvailable
action: aws:assertAwsResourceProperty
isCritical: false
onFailure: step:StartInstance
nextStep: CheckStart
inputs:
Service: rds
Api: DescribeDBClusters # aws rds describe-db-clusters --db-cluster-identifier whitesystem-v2-cluster
DBClusterIdentifier: "{{ClusterId}}"
PropertySelector: "$.DBClusters[0].Status"
DesiredValues: ["available", "starting"]
- name: StartInstance
action: aws:executeAwsApi
inputs:
Service: rds
Api: StartDBCluster # aws rds start-db-cluster --db-cluster-identifier whitesystem-v2-cluster
DBClusterIdentifier: "{{ClusterId}}"
- name: CheckStart
action: aws:waitForAwsResourceProperty
onFailure: Abort
maxAttempts: 10
timeoutSeconds: 600
inputs:
Service: rds
Api: DescribeDBClusters # aws rds describe-db-clusters --db-cluster-identifier whitesystem-v2-cluster
DBClusterIdentifier: "{{ClusterId}}"
PropertySelector: "$.DBClusters[0].Status"
DesiredValues: ["available"]
isEnd: true
---
description: Stop Aurora cluster
schemaVersion: "0.3"
assumeRole: "{{ AutomationAssumeRole }}"
parameters:
ClusterId:
type: String
description: (Required) Aurora Cluster Id to stop
AutomationAssumeRole:
type: String
description: (Optional) The ARN of the role that allows Automation to perform the actions on your behalf.
default: ""
mainSteps:
- name: AssertNotStopped
action: aws:assertAwsResourceProperty
isCritical: false
onFailure: step:StopCluster
nextStep: CheckStop
inputs:
Service: rds
Api: DescribeDBClusters
DBClusterIdentifier: "{{ClusterId}}"
PropertySelector: "$.DBClusters[0].Status"
DesiredValues: ["stopped", "stopping"]
- name: StopCluster
action: aws:executeAwsApi
inputs:
Service: rds
Api: StopDBCluster
DBClusterIdentifier: "{{ClusterId}}"
- name: CheckStop
action: aws:waitForAwsResourceProperty
onFailure: Abort
maxAttempts: 10
timeoutSeconds: 600
inputs:
Service: rds
Api: DescribeDBClusters
DBClusterIdentifier: "{{ClusterId}}"
PropertySelector: "$.DBClusters[0].Status"
DesiredValues: ["stopped"]

--

--