2023. 8. 27. 22:07ใAWS
EventBridge ๋๋ Lambda ํจ์ ๊ตฌ์ฑ์ ํตํด ์ค์ผ์ค๋ฌ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ ์ธ์ AWS์์ ์ ๊ณตํ๋ ๋ ๊ฐ์ง ์๋ฃจ์ ์ด ์๋ค.
- AWS System Manager > Quick Setup > Resource Scheduler
- Instance Scheduler on AWS
0. ์ค์ผ์ค๋ฌ ์๋ฃจ์ ์ข ๋ฅ
โ Resource Scheduler
AWS Systems Manager > Quick Setup๋ฅผ ์ด์ฉํ์ฌ EC2 ์ธ์คํด์ค๋ฅผ ์๋์ผ๋ก ์์ํ๊ณ ์ค์งํ๋ Resource Scheduler๋ฅผ ๊ตฌ์ฑํ ์ ์๋ค.
- ๋์ : only EC2 ์ธ์คํด์ค
- ํจ๊ณผ : EC2 ์ฌ์ฉ ์๊ฐ ๊ฐ์๋ก ์ธํ EC2 ์ฌ์ฉ ์๊ธ ๊ฐ์
- ์ฌ์ฉ ๋ฐฉ๋ฒ
- ์ ์ํ ์ผ์ ์ ๋ฐ๋ผ ์ฌ๋ฌ AWS region ๋ฐ ๊ณ์ ์์ EC2๋ฅผ ์๋์ผ๋ก ์ค์ง ๋ฐ ์์ ๊ฐ๋ฅ.
- Quick Setup ๊ตฌ์ฑ์ ์ฌ์ฉ์๊ฐ ์ง์ ํ ํ๊ทธ์ ํค-๊ฐ์ ์ฌ์ฉํ์ฌ ์ค์ผ์ค๋ฌ ์ค์ .
- ๋น์ฉ : Quick Setup ์ค์ ์ผ๋ก ์ธํ Resource Scheduler ๊ตฌ์ฑ ๋น์ฉ์ ๋ฐ์ํ์ง ์๋๋ค.
โก Instance Scheduler on AWS
๊ทธ๋ฆผ Ref: Instance Scheduler on AWS
์ ์๋ฃจ์ ์ AWS CloudFormation ํ ํ๋ฆฟ์ ์ด์ฉํ์ฌ ๋ฐฐํฌํ ์ ์๋ค.
- ๋์ : EC2, RDS ์ธ์คํด์ค
- ํจ๊ณผ : EC2 , RDS ์ฌ์ฉ ์๊ฐ ๊ฐ์๋ก ์ธํ ๋ฆฌ์์ค ๋น์ฉ ๊ฐ์
- ์ฌ์ฉ ๋ฐฉ๋ฒ
- ์ ์ํ ๊ฐ๊ฒฉ์ผ๋ก CloudWatch ์ด๋ฒคํธ๋ฅผ ์ค์ ํ์ฌ ์ ๊ธฐ์ ์ผ๋ก Lambda ํจ์๋ฅผ ํธ์ถํ๋ค.
- AWS ๋ฆฌ์ ๋ฐ ๊ณ์ ์ ์ ์ํ๊ณ ์ค์ผ์ค๋ฌ ์ผ์ ์ EC2 ๋ฐ RDS ์ธ์คํด์ค์ ์ฐ๊ฒฐํ๋ ๋ฐ ์ฌ์ฉํ ์ฌ์ฉ์ ์ง์ ํ๊ทธ๋ฅผ ์ ์ํ๋ค.
- Lambda ํจ์๋ ์คํ๋ ๋๋ง๋ค DynamoDB์ ์ ์ฅ๋ ์ผ์ , ํ๊ทธ ํค-๊ฐ ๋ฑ์ ๊ฒ์ํ๋ค.
- ๋น์ฉ : Lambda ํจ์ ์คํ ๋น์ฉ ๋ฐ DynamoDB, CloudWatch ๋น์ฉ์ด ๋ถ๊ณผ๋๋ค. ์์ธํ ๋ด์ฉ์ ์ด ๊ณณ์ ์ฐธ๊ณ .
๋ ๊ฐ์ง ๋ฐฉ๋ฒ ์ค RDS๋ ํจ๊ป ์ค์ผ์ค๋ฌ๋ฅผ ์ ์ฉํ ์ ์๋ AWS Instance Scheduler on AWS๋ฅผ ์ด์ฉํด๋ณด์.
์ธ์คํด์ค๊ฐ ์ฌ๋ฌ ๊ณ์ ์ ๋ถ์ฐ๋์ด ์๊ณ ์ค์ ๊ณ์ ์์ ์ค์ผ์ค๋ง์ ๊ด๋ฆฌํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์์ฃผ ์ ์ฉํ๋ค.
โ๏ธ To-Be Architecture
1. CloudFormation Stack ๋ฐฐํฌ
1-1. aws-instance-scheduler ๋ฐฐํฌ
[ Primary Account - A ]์์ aws-instance-scheduler.template๋ฅผ ์ด์ฉํ์ฌ CloudFormation Stack์ ์์ฑํ์. ํด๋น ํ ํ๋ฆฟ์ ์ด ๊ณณ์์ ๋ค์ด๋ก๋ ๊ฐ๋ฅํ๋ค.
CloudFormation์์ ๊ฐ ํ๋ผ๋ฏธํฐ์ ์๋ฏธ๋ ๋ค์ ๋งํฌ ์ฐธ์กฐ : AWS Docs: Step 1: Launch the instance scheduler hub stack
๐ท Instance Scheduler tag name
์๋ stop-start ์ก์ ์ ์์ ํ ์ธ์คํด์ค๋ฅผ ์๋ณํ๋ ํ๊ทธ ํค๋ฅผ ์๋ฏธํ๋ฉฐ ์ฌ์ฉ์ ์ง์ ์์ ์ค์ง ๋งค๊ฐ ๋ณ์๋ ํ์ฉํ๋ค. Instance Scheduler tag name์ ๊ธฐ๋ณธ๊ฐ์ “Schedule”์ด๋ค. ์คํ ์์ฑ ํ EC2 ๋๋ RDS ์ธ์คํด์ค์ ํ๊น ํ ๋ ๋์๋ฌธ์ ๊ตฌ๋ถ์ ์ ์ํ์. ํ๊ทธ์ ํค๋ก schedule์ ์ ๋ ฅ ์ ์ค์ผ์ค๋ฌ๊ฐ ๋์ํ์ง ์๋๋ค.
๐ท This Account
stack์ ์์ฑํ๋ ๊ณ์ ์ ์ค์ผ์ค๋ฌ๋ฅผ ์ ์ฉํ ์ธ์คํด์ค๊ฐ ์๋ค๋ฉด yes๋ฅผ ์ ํํ๋ค. No ์ ํ ์,๋ฐ๋์ cross-account role์ ๊ตฌ์ฑํด์ผ๋ง ํ๋ค. (1-2์์ ๊ตฌ์ฑ)
๐ท Frequency
Lambda ํจ์๊ฐ ์คํ๋๋ ์ฃผ๊ธฐ๋ก, ์ ํํ ๊ฐ์ ๋ฐ๋ผ ์ค์ผ์ค๋งํ๋ EventBridge Rule์ด ์์ฑ๋๋ค. ์ค์ผ์ค์ ๊ด๋ฆฌํ ์ธ์คํด์ค๊ฐ ๋ง์์๋ก frequency๋ฅผ ์์ ๊ฐ์ผ๋ก ๊ฐ์ ธ๊ฐ๋ ๊ฒ์ด ์ข๋ค๊ณ ํ๋ค.
๐ท Provide a unique namespace value
ํด๋น ์๋ฃจ์ ๋ค์ค ๋ฐฐํฌ์์ ๊ตฌ๋ถํ๊ธฐ ์ํ unique identifier๋ฅผ ์ ๋ ฅํ๋ค. ex) dev, prod, main ๋ฑ
๐ท Provide Organization Id OR List of Remote Account Ids (⇒ skip!)
๊ต์ฐจ ๊ณ์ ์ค์ผ์ค๋ง์ ์ด ์๋ฃจ์ ์ ์ฌ์ฉํ๋ ค๋ฉด aws-instance-scheduler-remote.template๋ก ์คํ์ ๋ฐฐํฌํ ํ์ remote account id๋ฅผ ์ ๋ฐ์ดํธํ์ฌ์ผ ํ๋ค. remote account์ ์คํ์ cross-account role ARN์ ์์ฑํ๊ณ , primary account์ ์คํ์์ remote account id ์ ๋ฐ์ดํธํ๋ฉด ์๋ฃจ์ ์ด remote account์ ์ธ์คํด์ค์ ๋ํด ์์ ๋ฐ ์ค์ง ์์ ์ ์ํํ ์ ์๋ค. ์ด ๋ถ๋ถ์ ์ฐ์ skipํ๋ฉด ๋๋ค.
๐ท started tags/stopped tags
์ธ์คํด์ค ์ค์ผ์ค๋ฌ๊ฐ ์์/์ค์ง ์์ ์ ์ํํ ๋ ์ธ์คํด์ค ์ค์ผ์ค๋ฌ๊ฐ ์ธ์คํด์ค์ ์ ์ฉํ ํ๊ทธ๋ฅผ ์ค์ ํ์ฌ ์ธ์คํด์ค ์ํ๊ฐ ์ธ์คํด์ค ์ค์ผ์ค๋ฌ์ ์ํด ๋ณ๊ฒฝ๋์๋์ง ์ฝ๊ฒ ์๋ณํ ์ ์๋ค. ์ด ์ต์ ์ ์ ํ ์ฌํญ์ด์ง๋ง ์๋ฒ์ ์ ์ฌ์ ์ธ ๋ฌธ์ ํด๊ฒฐ/์ง๋จ์ ์ ์ฉํ๋ค.
์๋ ๊ทธ๋ฆผ์ ํด๋นํ๋ ์ฒดํฌ๋ฐ์ค์ ๋์๋ฅผ ํด์ผ๋ง ์คํ ์์ฑ์ด ๊ฐ๋ฅํ๋ค. ํด๋น CloudFormation ์คํ ์์ฑ์ผ๋ก ์ธํด IAM ๋ฆฌ์์ค๊ฐ ์์ฑ๋๋ค๋ ๋ด์ฉ์ด๋ค.
์ค์ ๋ก, DynamoDB ํ ์ด๋ธ ๋ฐ Lambda ํจ์, IAM์ ํฌํจํ์ฌ ์ฌ๋ฌ ๋ฆฌ์์ค๊ฐ ์์ฑ๋๋ค.
1-2. aws-instance-scheduler-remote ๋ฐฐํฌ
[ Secondary Account - B] ์ค์ผ์ค๋ง์ ์ ์ฉํ ์ธ์คํด์ค๊ฐ ์กด์ฌํ๋ B Account๋ก ์ด๋ํ์.
์๋ ๋งํฌ๋ฅผ ํตํด remote ํ ํ๋ฆฟ์ ๋ค์ด๋ก๋ํ๋ค.
๐ท Provide the same unique namespace value defined in the hub stack.
1-1 ์คํ ์์ฑ ์ namespace value์ ์ ๋ ฅํ๋ ๊ฐ์ ์ ๋ ฅํ๋ค. ex) dev / prod / main
๐ท Instance Scheduler Hub Account ID
1-1์ ์คํ์ ์์ฑํ account ID๋ฅผ ์ ๋ ฅํ๋ค.
remote ์คํ ์์ฑ ์ ์์ฑ๋๋ IAM role์ trust relationship์ ๋ค์๊ณผ ๊ฐ๋ค.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com",
"AWS": "arn:aws:iam::{primary-account-id}:root"
},
"Action": "sts:AssumeRole"
}
]
}
ํด๋น IAM Role์๋ Primary Account์ Lambda ํจ์๊ฐ Secondary Account์ RDS์ EC2์ ํ๊น , ์ค์ง, ์์ ๋ฑ์ ํ ์ ์๋ IAM Policy๊ฐ Attach๋์ด ์์๋ค.
1-3. 1-1์ ์คํ ์ ๋ฐ์ดํธ
1-1์์ ์์ฑํ ์คํ > update > use current stack์ ํตํด remote account id๋ฅผ ์ถ๊ฐํ์. ๋ค๋ฅธ ๊ฐ์ ์์ ํ ํ์ ์์ด [ Provide Organization Id OR List of Remote Account Ids ] ์ 1-2์ remote account id๋ฅผ ์ถ๊ฐํ์ฌ ์คํ์ ์ ๋ฐ์ดํธํ์.
DynamoDB > ConfigTable > config ์์ดํ ์ ํ์ธํ์. DynamoDB ์ฝ์์์ ํ์ธํ๋ ๊ฒฝ์ฐ ํ ์ด๋ธ ์ ํ ํ [ explore items ] ๋ฒํผ์ ํตํด ์์ดํ ์ ์์ธํ ํ์ธํ ์ ์๋ค.
config์๋ [ remote_account_ids ] ์์ฑ์ด ์์ด์ผ ํ๊ณ 1-2์ remote account id๊ฐ ๊ทธ ๊ฐ์ผ๋ก ์์ด์ผ ํ๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ 1-2 account์์๋ ์ธ์คํด์ค ์ค์ผ์ค๋ฌ๊ฐ ๋์ํ์ง ์๋๋ค.
2. Custom Schedule ์์ฑ
์ค์ผ์ค์ ์์ฑํ๋ ค๋ฉด AWS Cloudformation์ผ๋ก ์คํ ๋ฐฐํฌ ํ 3๊ฐ์ง ๋ฐฉ๋ฒ์ ์ด์ฉํ์ฌ ์ค์ผ์ค๋ง ๊ท์น์ ์์ฑํ ์ ์๋ค.
โ Amazon DynamoDB ์ฝ์ : DynamoDB์์ ์ผ์ ์ ์์ฑํ๊ธฐ ์ํด ์ฝ์์์ ๊ตฌ์ฑ ํ ์ด๋ธ(ConfigTable)์์ ์ผ์ ์ค ํ๋๋ฅผ ์์ ํ๋ค.
โก ์ค์ผ์ค๋ฌ CLI : ์ค์ผ์ค๋ฌ CLI์์ ์ผ์ ์ ๋ง๋ค๋ ค๋ฉด ํด๋น ๋ช ๋ น์ ์ฌ์ฉํ๋ค. ⇒ Scheduler CLI
โข AWS CloudFormation ์ฌ์ฉ์ ์ง์ ๋ฆฌ์์ค : ์ฌ์ฉ์ ์ ์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ์ฌ ์์ฝ์ ์์ฑํ๋ ค๋ฉด ์๋ฃจ์ ์ ์ฌ์ฉ์ ์ ์ ๋ฆฌ์์ค์ ํด๋น ํ๋๋ฅผ ์ถ๊ฐํ๋ค. ๋จ, ์ฌ์ฉ์ ์ง์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ์ฌ ์์ฝ์ ์์ฑํ๋ ๊ฒฝ์ฐ DynamoDB ์ฝ์ ๋๋ ์ค์ผ์ค๋ฌ CLI๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ์์ฝ์ ์ญ์ ํ๊ฑฐ๋ ์์ ํ ์ ์๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์คํ์ ์ ์ฅ๋ ๋งค๊ฐ ๋ณ์์ ํ ์ด๋ธ์ ๊ฐ ์ฌ์ด์ ์ถฉ๋์ด ๋ฐ์ํ๋ค
3๊ฐ์ง ๋ฐฉ๋ฒ ์ค ๊ฐ์ฅ ์ง๊ด์ ์ผ๋ก ์ํํ ์ ์์๋ scheduler CLI๋ฅผ ํตํด DynamoDB ํ ์ด๋ธ์ period์ schedule ๊ฐ์ ์์ฑํ์๋ค. DynamoDB ํ ์ด๋ธ์ด ์กด์ฌํ๋ Primary Account์ ์ ์ํ ์ํ์์ scheduler-cli ๋ช ๋ น์ด๋ฅผ ์ํํ์๋ค.
๐ท ์ํ๋ ์กฐ๊ฑด : ์์์ผ-๊ธ์์ผ๋ง ๊ฐ๋๋๊ณ ์ฃผ๋ง์๋ ์ค์ง ์ํ. ์ฃผ์ค์๋ ์์นจ 6์๋ถํฐ ์ ๋ 10์๊น์ง๋ง ๊ฐ๋ ์ํ.
2-1. Scheduler CLI ํจํค์ง ๋ค์ด๋ก๋ ( ์ฐธ๊ณ )
2-2. period ์์ฑ
scheduler-cli create-period \
--name mon-fri-6am-10pm \
--stack { 1-1์์ ์์ฑํ CloudFormation Stack ์ด๋ฆ } \
--region ap-northeast-2 \
--begintime 06:00 --endtime 22:00 \
--weekdays mon-fri
2-2. schedule ์์ฑ
scheduler-cli create-schedule \
--name mon-fri-6am-10pm \
--stack { 1-1์์ ์์ฑํ CloudFormation Stack ์ด๋ฆ } \
--region ap-northeast-2 \
--periods mon-fri-6am-10pm \
--timezone Asia/Seoul
schedule์ period๋ ๋ฆฌ์คํธ๋ก ๋ฃ์ ์ ์๋ค. ์ฆ, ํ๋์ ์ค์ผ์ค์ ์ฌ๋ฌ๊ฐ์ period ํ ๋น์ด ๊ฐ๋ฅํ๋ค.
DynamoDB > ConfigTable์ ํ์ธํด๋ณด๋ฉด, ํ๊ธฐ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด schedule๊ณผ period๊ฐ ์์ฑ๋์ด ์์์ ํ์ธํ ์ ์๋ค. ์ด๊ธฐ์ ์์ฑ๋์ด ์๋ schedule๊ณผ period๋ ํ์ ์๋ค๋ฉด ์ญ์ ํด๋ ๋ฌด๋ฐฉํ๋ค.
์ schdeuler-cli๋ฅผ ์ด์ฉํ ๋ช ๋ น์ด๋ฅผ ํตํด ์์ฑ๋ schedule์ ์๋์ ๊ฐ์ attribute๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
Ref. AWS Docs: Schedule definitions
enforced, retain_running ๋ฐ stop_new_instances๋ ์คํ์๊ฐ ์ธ์ ์๋ ์ค์ง/์์๊ณผ ๊ด๋ จ๋ attribute์ด๋ ์ฐธ๊ณ ํ์.
๐ก ํ๊น ์ ๋ต ์ฐธ๊ณ ๐ก
AWS Whitepaper: Best Practices for Tagging AWS Resources
3. ์ค์ผ์ค๋ฌ๋ฅผ ์ ์ฉํ ์ธ์คํด์ค์ ํ๊น
1-1์์ ์ ๋ ฅํ TagName์ ํด๋นํ๋ ๊ฐ์ Tag Key, 2-2์์ ์์ฑํ schedule ์ด๋ฆ์ Tag Value๋ก ํ์ฌ ์ค์ผ์ค๋ ๋ฅผ ์ ์ฉํ ์ธ์คํด์ค์ ํ๊น ์ ํ์. ์ฌ๋ฌ ์ธ์คํด์ค์ ์ผ๊ด๋ก ์ ์ฉํ ์์๋ Tag Editor๋ฅผ ์ด์ฉํ๋ ๊ฒ๋ ์ ์ฉํ๋ค.
โ ๏ธ ๋ฐฑ์ ์๊ฐ ๊ณ ๋ ค โ ๏ธ
๋จ, RDS ์๋ ๋ฐฑ์ ์ด ์คํ๋๋ ค๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ available ์ํ์ฌ์ผ ํ๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ available ์ธ์ ์ํ์ธ ๊ฒฝ์ฐ, ์์ปจ๋ storage_full ์ํ์ธ ๊ฒฝ์ฐ ์๋ ๋ฐฑ์ ์ด ์คํ๋์ง ์๋๋ค.
Ref. AWS Docs: RDS ๋ฐฑ์ ์์
3์ ํ๊น ๊น์ง ์ ์๋ฃํ๋ค๋ฉด ์ ํด์ง ์๊ฐ์ ์ธ์คํด์ค๊ฐ ์์๋๊ณ ์ค์ง๋จ์ ํ์ธํ ์ ์๋ค.
RDS์ EC2์ ์ค์ผ์ค๋ฌ ์ ์ฉ ์ฑ๊ณต~~! ๐
๐ง๐ง Troubleshooting
ํธ๋ฌ๋ธ ์ํ ์, main account์ CloudWatch > Log group์์ {1-1์ ์คํ ์ด๋ฆ}-logs๋ฅผ ํ์ธํ์.
Ref. Instance Scheduler on AWS > Troubleshooting
๐ ์ฐธ๊ณ ๋งํฌ
- AWS Docs: Resource Scheduler
- AWS Docs: Automate starting and stopping AWS instances
- AWS Docs: Step 2 (Optional): Launch the remote stack in secondary accounts
- ๊ธฐ์ ๋ธ๋ก๊ทธ: How to Implement AWS Instance Scheduler in an AWS Organization for Cross-Account Cost Savings
- ๊ธฐ์ ๋ธ๋ก๊ทธ: ํจ์จ์ ์ธ ๋น์ฉ ๊ด๋ฆฌ๋ฅผ ์ํ AWS Instance Scheduler ์ค์
- AWS Docs: Scheduler CLI