2025幎7æ23æ¥

ãã®èšäºãã·ã§ã¢
ããããŒã°ïŒæ°äººãšã³ãžãã¢ã®æ²å
ç°äžïŒæ°äººïŒãå 茩ïŒå€§å€ã§ãïŒECSã§ãµãŒãã¹ãç«ã¡äžãããã§ããã©ããããŒãªã³ã°ã¢ããããŒããã£ãŠããã®ãæšå¥šãããŠããBlue/Greenãããã€ãã¯æšå¥šãããªãã£ããã§ãïŒã§ããããã£ãŠã©ã£ã¡ãè¯ããã§ããïŒïŒã
äœè€å 茩ãããŒãç°äžããèœã¡çããŠãã³ãŒããŒã§ã飲ã¿ãªãã説æãããã座ã£ãŠåº§ã£ãŠããŸãã¯æ·±åŒåžã ããã
ç°äžãã¯ã...ïŒãŽã¯ãŽã¯ïŒã§ãæ¬åœã«ããŒãªã³ã°ã¢ããããŒãã ãã§å€§äžå€«ãªãã§ããããïŒã
äœè€å 茩ããŸããŸãããã®äžå®ãªæ°æã¡ãåããããå®éãåãæåã¯ãããŒãªã³ã°ïŒéç·ïŒäœããçŸå³ããã®ïŒãã£ãŠæãã ã£ããããïŒç¬ïŒã
第1ç« ïŒããŒãªã³ã°ã¢ããããŒãã£ãŠãªãããïŒ
äœè€å 茩ããŸãã¯åºæ¬ãã説æããããããŒãªã³ã°ã¢ããããŒãã£ãŠããã®ã¯ãæ¢åã®ã€ã³ã¹ã¿ã³ã¹ãå°ããã€æ°ããŒãžã§ã³ã«çœ®ãæããŠããæ¹æ³ãªãã ãã
ç°äžãå°ããã€...ã§ããïŒã
äœè€å 茩ãããïŒäŸãã°ãåã®ãµãŒãã¹ã«4ã€ã®ã¿ã¹ã¯ãåããŠããšãããããããŒãªã³ã°ã¢ããããŒãã ãšããããªæãã«ãªãïŒã
ãããŒãªã³ã°ã¢ããããŒãã®æµãã
åæç¶æ
ïŒå€ãããŒãžã§ã³ã®ã¿ã¹ã¯4ã€çšŒå ðŠðŠðŠðŠ
â
æ°ããŒãžã§ã³ã®ã¿ã¹ã¯ã2ã€è¿œå ðŠðŠðŠðŠð©ð©ïŒèš6ã¿ã¹ã¯ïŒ
â
ãã«ã¹ãã§ãã¯æåç¢ºèª â
â
å€ãããŒãžã§ã³ã®ã¿ã¹ã¯ã2ã€åé€ ðŠðŠð©ð©
â
ããã«æ°ããŒãžã§ã³ã2ã€è¿œå ðŠðŠð©ð©ð©ð©
â
æåŸã«å€ãã¿ã¹ã¯ãåé€ ð©ð©ð©ð©ïŒå®äºïŒïŒ
ç°äžãããïŒãªãã»ã©ã段éçã«çœ®ãæããŠãããã§ããïŒã
äœè€å 茩ãããããããšïŒèšå®ãã·ã³ãã«ã§ãããããªæãã§æžãããïŒã
{
"deploymentConfiguration": {
"maximumPercent": 200,
"minimumHealthyPercent": 100
}
}
ç°äžããã®æ°åã®æå³ãããåãããªãã§ã...ã
äœè€å
茩ãããŒãããããmaximumPercent: 200
ã£ãŠããã®ã¯ããæå€§ã§éåžžã®2åãŸã§ã¿ã¹ã¯ãèµ·åããŠããããã£ãŠæå³ãminimumHealthyPercent: 100
ã¯ãå¥å
šãªã¿ã¹ã¯ã¯æäœã§ãéåžžã®100%ã¯ç¶æããŠããã£ãŠæå³ãªãã ãã
ç°äžãã€ãŸãã4ã¿ã¹ã¯ãªãæå€§8ã¿ã¹ã¯ãŸã§èµ·åã§ããŠãæäœã§ã4ã¿ã¹ã¯ã¯å¥å šã«åããŠãªããšãã¡ã£ãŠããšã§ããïŒã
äœè€å èŒ©ãæ£è§£ïŒåã飲ã¿èŸŒã¿æ©ããããªãïŒã
ããŒãªã³ã°ã¢ããããŒãã®ã¡ãªããã»ãã¡ãªãã
äœè€å 茩ãããŒãªã³ã°ã¢ããããŒãã®è¯ããšãããšæªããšããããŸãšãããšãããªæãããªïŒã
ãã¡ãªããã
- ð° ã³ã¹ããå®ãïŒè¿œå ã®ã€ã³ãã©ãäžèŠïŒ
- ð èªåã§ãã«ã¹ãã§ãã¯ããªããæŽæ°
- ð åé¡ãçºçããŠã圱é¿ç¯å²ãéå®ã§ãã
- â¡ èšå®ãç°¡å
ããã¡ãªããã
- ð å®å šãªããŒã«ããã¯ãé£ãã
- ð ãããã€äžã¯æ°æ§ããŒãžã§ã³ãæ··åš
- ð åŸæ¹äºææ§ãå¿ èŠ
ç°äžãåŸæ¹äºææ§ã£ãŠäœã§ããïŒã
äœè€å 茩ãäŸãã°ãããŒã¿ããŒã¹ã®ã«ã©ã ãåé€ãããããªå€æŽããããšããå€ãããŒãžã§ã³ã®ã¢ããªããŸã åããŠããšããã®ã«ã©ã ãåç §ããããšããŠãšã©ãŒã«ãªã£ã¡ããã§ããïŒããããã®ãé¿ããããã«ãæ°æ§äž¡æ¹ã§åãããã«äœãå¿ èŠãããã£ãŠããšã ããã
ç°äžããªãã»ã©...ããã¯ç¢ºãã«æ°ãã€ããªããšãããŸããããã
第2ç« ïŒBlue/Greenãããã€ã¡ã³ãã®è¬
äœè€å 茩ããããæ¬¡ã¯ãBlue/Greenãããã€ã¡ã³ãã«ã€ããŠèª¬æããããããã¯ãéãç°å¢ããšãç·ã®ç°å¢ããçšæããæ¹æ³ã ããã
ç°äžãéãšç·...äœã ãã«ã©ãã«ã§ããïŒã
äœè€å 茩ãååãã«ã©ãã«ãªã ããããªããŠãèãæ¹ãå šç¶éããã ãBlue/Greenã¯ãæ°ç°å¢ïŒGreenïŒãå®å šã«æ§ç¯ããŠããäžæ°ã«åãæ¿ããæ¹æ³ãªãã ããã
graph TD
A[Blueç°å¢çšŒåäž ðŠ] -->|æ°ç°å¢æ§ç¯| B[Greenç°å¢æ§ç¯ ð©]
B -->|ãã¹ã宿œ| C[ãã¹ãå®äº â
]
C -->|ãã©ãã£ãã¯ç§»è¡éå§| D[段éçãªç§»è¡ ð]
D -->|å®å
šç§»è¡| E[Greenç°å¢ã«å®å
šç§»è¡ ð©]
E -->|åé¡ãªã| F[Blueç°å¢åé€ ðïž]
E -->|åé¡çºç| G[Blueç°å¢ã«å³æããŒã«ãã㯠ð]
ç°äžãããŒãããã ãšç°å¢ã2ã€å¿ èŠã«ãªããã§ãããã
äœè€å 茩ãããïŒã ããã³ã¹ãã¯åããã£ã¡ãããã©ããã®åå®å šæ§ã¯é«ããã ãèšå®äŸã¯ãããªæãïŒã
resource "aws_ecs_service" "main" {
deployment_controller {
type = "CODE_DEPLOY"
}
load_balancer {
target_group_arn = aws_lb_target_group.blue.arn
container_name = "app"
container_port = 80
}
}
Blue/Greenãããã€ã¡ã³ãã®ã¡ãªããã»ãã¡ãªãã
ãã¡ãªããã
- â¡ è¿ éãªããŒã«ããã¯ãå¯èœ
- 𧪠ãã¹ãç°å¢ãšããŠãå©çšå¯èœ
- ð« ããŒãžã§ã³ã®æ··åšããªã
- â° ããŠã³ã¿ã€ã ãªãã§åãæ¿ãå¯èœ
ããã¡ãªããã
- ðž ã³ã¹ããé«ãïŒç°å¢ã2ã€çšæïŒ
- ð ãªãœãŒã¹äœ¿çšéãå€ã
- ð åãæ¿ãæã®ã»ãã·ã§ã³ç®¡çãå¿ èŠ
ç°äžãããŒããã©ã£ã¡ãäžé·äžçã§ãã...ã
äœè€å 茩ããããªãã ããã ããç¶æ³ã«å¿ããŠäœ¿ãåããããšã倧äºãªãã ãã
第3ç« ïŒå®éã®éçšã§ã®æ²åãããã
äœè€å 茩ãå®éã®éçšã§ã¯ãè²ã ãªãã©ãããããã ããåã®çµéšè«ã話ããããã
ã±ãŒã¹1ïŒããŒãªã³ã°ã¢ããããŒãã§ã®å€§å€±æ
äœè€å 茩ãå»å¹Žã®ããšãªãã ãã©ãWebã¢ããªã®ã¢ããããŒãã§ããŒãªã³ã°ã¢ããããŒãã䜿ã£ããã ãã§ããæ°ããŒãžã§ã³ã§APIã®ä»æ§ã倿Žãã¡ãã£ãŠã...ã
ç°äžãããããã£ãŠãŸãããªãã§ããïŒã
äœè€å 茩ãè¶ ãŸããã£ãïŒå€ãããŒãžã§ã³ã®ããã³ããšã³ããæ°ããAPIãåŒã³åºãããšããŠããšã©ãŒãé »çºãããã ãã客ããããã®ã¯ã¬ãŒã ã®åµã§ããã®æ¥ã¯åŸ¹å€ã§ããŒã«ããã¯äœæ¥ããããïŒæ¶ïŒã
# ç·æ¥ããŒã«ããã¯ã®æ§å
$ aws ecs update-service --service my-service --task-definition old-task-def
# ãé ŒãïŒæ»ã£ãŠããïŒãã£ãŠç¥ããªããå®è¡ãã
ç°äžãããã¯å€§å€ã§ããã...ã§ããè¯ãå匷ã«ãªãããã§ããã
äœè€å 茩ããããªãã ãããããã¯ãåŸæ¹äºææ§ããã¡ããšèããããã«ãªã£ãããäŸãã°ããããªé¢šã«ãã«ã¹ãã§ãã¯ã匷åããããïŒã
# ã¿ã¹ã¯å®çŸ©ã§ã®ãã«ã¹ãã§ãã¯èšå®
healthCheck:
command: ["CMD-SHELL", "curl -f http://localhost/health || exit 1"]
interval: 30
timeout: 5
retries: 3
startPeriod: 60
ã±ãŒã¹2ïŒBlue/Greenãããã€ã¡ã³ãã§ã®æåäœéš
äœè€å 茩ãäžæ¹ã§ãå€§èŠæš¡ãªããŒã¿ããŒã¹ãã€ã°ã¬ãŒã·ã§ã³ãå¿ èŠãªãšãã¯ãBlue/Greenãããã€ã¡ã³ãã§æãããããšããããã ãã
ç°äžãã©ããªç¶æ³ã ã£ããã§ããïŒã
äœè€å 茩ããŠãŒã¶ãŒããŒãã«ã®æ§é ãå€§å¹ ã«å€æŽããå¿ èŠããã£ãŠããæ®éã«ããŒãªã³ã°ã¢ããããŒãã§ãã£ããã確å®ã«é害ãèµ·ããç¶æ³ã ã£ããã
-- ãããªæãã®ãã€ã°ã¬ãŒã·ã§ã³
CREATE TABLE users_new (
id BIGINT PRIMARY KEY,
name VARCHAR(255),
email VARCHAR(255),
profile_data JSONB, -- æ°ãã远å
created_at TIMESTAMP
);
-- ããŒã¿ç§»è¡
INSERT INTO users_new
SELECT id, name, email, '{}', created_at FROM users;
äœè€å 茩ãBlue/Greenã ãšãGreenç°å¢ã§å®å šã«ãã¹ãããŠããåãæ¿ãããããããå®å¿ã ã£ãããåãæ¿ããäžç¬ã ã£ãããã
ç°äžããªãã»ã©ïŒãã£ã±ãç¶æ³ã«å¿ããŠäœ¿ãåããéèŠãªãã§ãããã
第4ç« ïŒå€æåºæºããã¹ã¿ãŒããã
äœè€å 茩ãããããå®éã«ã©ã£ã¡ã䜿ããè¿·ã£ããšãã®å€æåºæºãæããããã
ããŒãªã³ã°ã¢ããããŒããéžã¶ã¹ãå Žé¢
äœè€å 茩ããããªãšãã¯ããŒãªã³ã°ã¢ããããŒãããªã¹ã¹ã¡ã ãïŒã
- ð å°èŠæš¡ãªãã°ãã£ãã¯ã¹
- ð ã»ãã¥ãªãã£ãããã®é©çš
- ðŠ ã³ã³ããã€ã¡ãŒãžã®æŽæ°
- âš å°ããªæ©èœè¿œå
- ð° ã³ã¹ããæãããå Žå
ç°äžãå ·äœçã«ã¯ã©ããªæãã§ããïŒã
äœè€å 茩ãäŸãã°ãããã°åºåã®åœ¢åŒãã¡ãã£ãšå€æŽããšããUIã®è²ã倿Žããšãããããã圱é¿ã®å°ãªã倿ŽãªãããŒãªã³ã°ã¢ããããŒãã§ååã ããã
Blue/Greenãããã€ã¡ã³ããéžã¶ã¹ãå Žé¢
äœè€å 茩ãéã«ããããªãšãã¯Blue/Greenãéžãã æ¹ããããïŒã
- ðïž å€§èŠæš¡ãªã¢ãŒããã¯ãã£å€æŽ
- ðïž ããŒã¿ããŒã¹ã¹ããŒãã®å€æŽ
- ð ãã¬ãŒã ã¯ãŒã¯ã®ã¡ãžã£ãŒããŒãžã§ã³ã¢ãã
- 𧪠å®å šãªãã¹ããå¿ èŠãªæ©èœè¿œå
- ðš ããã·ã§ã³ã¯ãªãã£ã«ã«ãªãµãŒãã¹
ç°äžãããã·ã§ã³ã¯ãªãã£ã«ã«ã£ãŠïŒã
äœè€å 茩ãèŠããã«ãããããæ¢ãŸã£ããäŒç€Ÿã倧å€ãªããšã«ãªããã£ãŠãããµãŒãã¹ã®ããšã ããæ±ºæžã·ã¹ãã ãšããéèŠãªAPIãšãããã
第5ç« ïŒç£èŠãšãã©ãã«ã·ã¥ãŒãã£ã³ã°
äœè€å 茩ããããã€æŠç¥ãéžãã ããæ¬¡ã¯ç£èŠãéèŠã ããã©ã¡ãã®æ¹æ³ã§ãããã£ãããšç£èŠèšå®ãããŠãããªããšãåé¡ã«æ°ã¥ãã®ãé ãã¡ããããããã
ç£èŠèšå®ã®äŸ
# CloudWatch Alarmsèšå®äŸ
alarms:
- name: HighErrorRate
metric: ErrorRate
threshold: 1%
period: 60
evaluationPeriods: 2
action: "äœããããããïŒãšã©ãŒçãäžãã£ãŠãïŒ"
- name: HighLatency
metric: p95Latency
threshold: 500ms
period: 300
evaluationPeriods: 3
action: "ã¬ã¹ãã³ã¹ãé
ããªã£ãŠãïŒèª¿æ»éå§ïŒ"
ç°äžããããŒãããã ãèšå®ããã®ã倧å€ããã§ãã...ã
äœè€å 茩ãæåã¯å€§å€ã ãã©ãäžåºŠèšå®ãã¡ããã°åŸã¯æ¥œã ããç¹ã«ãšã©ãŒçãšã¬ã¹ãã³ã¹æéã¯å¿ é ã ãããããããããªããã§ãé害ã®çºèŠæéãå šç¶éããããã
ãã©ãã«ã·ã¥ãŒãã£ã³ã°ã®å®äŸ
äœè€å 茩ãå®éã«ãã©ãã«ãèµ·ãããšãã®å¯ŸåŠæ³ãæããŠããããã
ããŒãªã³ã°ã¢ããããŒãã§ãã«ã¹ãã§ãã¯ã倱æããå ŽåïŒ
# ãŸãã¯ãµãŒãã¹ã®ç¶æ
確èª
$ aws ecs describe-services --service my-service
# ã¿ã¹ã¯ã®è©³çŽ°ç¢ºèª
$ aws ecs describe-tasks --tasks task-id
# ãã°ç¢ºèª
$ aws logs get-log-events --log-group-name /ecs/my-service
äœè€å 茩ã倧æµã®å Žåããã°ãèŠãã°åå ãåãããããOutOfMemoryããšããConnection refusedããšããåããããããšã©ãŒãåºãŠãããšãå€ãããããã
Blue/Greenãããã€ã¡ã³ãã§åãæ¿ãã«å€±æããå ŽåïŒ
# å³åº§ã«ããŒã«ããã¯
$ aws deploy stop-deployment --deployment-id deployment-123
$ aws deploy create-deployment --application-name my-app --deployment-group-name my-group --revision revisionType=S3,s3Location=bucket=my-bucket,key=old-version.zip
ç°äžãããŒã«ããã¯ã£ãŠããããªã«ç°¡åã«ã§ãããã§ããïŒã
äœè€å 茩ãBlue/Greenã®æå€§ã®ã¡ãªããããããªãã ãåé¡ãèµ·ããŠãããã¯ããå ã«æ»ããŸãŒããã£ãŠæãã§ãæ°åã§å ã®ç°å¢ã«æ»ããããããã
第6ç« ïŒå®è·µçãªTips
äœè€å 茩ãæåŸã«ãå®éã«éçšããäžã§ã®å®è·µçãªTipsãæããããã
ããŒãªã³ã°ã¢ããããŒãã®ã³ã
1. 段éçãªèšå®å€æŽ
{
"deploymentConfiguration": {
"maximumPercent": 150, // æåã¯æ§ããã«
"minimumHealthyPercent": 75 // 段éçã«èª¿æŽ
}
}
2. ãã«ã¹ãã§ãã¯ã®å·¥å€«
# Dockerfileã§ã®ãã«ã¹ãã§ãã¯
HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
CMD curl -f http://localhost:8080/health || exit 1
Blue/Greenãããã€ã¡ã³ãã®ã³ã
1. ã»ãã·ã§ã³ç®¡ç
# Nginxã§ã®ã»ãã·ã§ã³ç¶æèšå®
upstream backend {
ip_hash; # IPããŒã¹ã§ã»ãã·ã§ã³ç¶æ
server blue.example.com;
server green.example.com backup;
}
2. ããŒã¿ããŒã¹æ¥ç¶ã®å·¥å€«
# ã¢ããªã±ãŒã·ã§ã³åŽã§ã®æ¥ç¶åãæ¿ã
def get_db_connection():
if os.environ.get('DEPLOYMENT_COLOR') == 'green':
return connect_to_green_db()
else:
return connect_to_blue_db()
ç°äžããªãã»ã©ïŒçްãã工倫ããã£ã±ããããã§ãããã
äœè€å 茩ããããªãã ãæåã¯åºæ¬çãªèšå®ããå§ããŠãåŸã ã«çްãããšããã調æŽããŠããã°ããããã
çµç« ïŒç°äžããã®æé·
ç°äžãå 茩ã仿¥ã¯æ¬åœã«ããããšãããããŸããïŒãããã§ãããŒãªã³ã°ã¢ããããŒããšBlue/Greenãããã€ã¡ã³ãã®éããããåãããŸãããã
äœè€å 茩ãã©ãããããŸããŠïŒã§ãçµå±ç°äžããã®ãµãŒãã¹ã¯ã©ã£ã¡ã䜿ãããšã«ããã®ïŒã
ç°äžãããŒã£ãšãåã®ãµãŒãã¹ã¯å°èŠæš¡ãªWebã¢ããªã§ã倧ããªã¹ããŒã倿Žããªãã®ã§ãããŒãªã³ã°ã¢ããããŒãã§è¡ãããšæããŸãïŒã
äœè€å 茩ããã倿ã ãïŒã§ããå°æ¥çã«ãµãŒãã¹ã倧ãããªã£ãããBlue/Greenãæ€èšããŠã¿ãŠããã
ç°äžãã¯ãïŒããšãç£èŠèšå®ãã¡ãããšãããŸãããšã©ãŒçãšã¬ã¹ãã³ã¹æéã®ç£èŠã¯å¿ é ã§ãããïŒã
äœè€å 茩ãå®ç§ïŒåãªã倧äžå€«ã ããäœãå°ã£ãããšããã£ããããŸããã€ã§ãèããŠããã
ç°äžãããããšãããããŸãïŒããã§å®å¿ããŠãããã€ã§ããŸãïŒã
ãŸãšã
ECSã§ã®ãããã€æŠç¥éžæã¯ããµãŒãã¹ã®ç¹æ§ãèŠä»¶ã«ãã£ãŠæ±ºãŸããŸããéèŠãªã®ã¯ïŒ
- ããŒãªã³ã°ã¢ããããŒã: ã³ã¹ãå¹çéèŠãå°èŠæš¡å€æŽã«é©ããŠãã
- Blue/Greenãããã€ã¡ã³ã: å®å šæ§éèŠãå€§èŠæš¡å€æŽãéèŠãªãµãŒãã¹ã«é©ããŠãã
ã©ã¡ããéžãã§ããé©åãªç£èŠèšå®ãšãã©ãã«ã·ã¥ãŒãã£ã³ã°ã®æºåãæ¬ ãããŸãããæåã¯åºæ¬çãªèšå®ããå§ããŠãåŸã ã«éçšããŠããŠãèç©ããŠãããŸãããïŒ
ãã®èšäºããECSã§ã®ãããã€æŠç¥éžæã«æ©ãå šãŠã®ãšã³ãžãã¢ã®å©ãã«ãªãã°å¹žãã§ããHappy Deploying! ð
ãã®èšäºã圹ã«ç«ã£ããã·ã§ã¢ããŠãã ãã
ECSãããã€æŠç¥ã«ã€ããŠã®ãã¬ããžãã¿ããªã§å ±æããŸãããïŒ