본문으로 건너뛰기
김신건의 로그

[AWS] SSM State Manager: 원하는 상태 유지

· 수정 · 📖 약 4분 · 1,454자/단어 #aws #cloud #ssm #systems-manager #configuration #drift #compliance
AWS State Manager, SSM State Manager, State Manager, Configuration Drift, SSM Association, 구성 드리프트

정의

AWS SSM State Manager관리형 노드 (EC2, 온프레미스) 가 항상 정의된 상태를 유지하도록 정기적으로 확인 + 적용 하는 Systems Manager 기능. “SSM Agent 최신 버전 유지”, “CloudWatch Agent 설치되어 있어야 함”, “특정 서비스 실행 중이어야 함” 같은 “원하는 상태 (desired state)” 를 선언하고 정기 실행으로 강제.

한 줄 요약: 구성 드리프트 (configuration drift) 를 자동 감지 + 자동 복구 하는 서비스.

왜 State Manager 인가

구성 드리프트의 문제

시간이 지나면 서버 상태가 서서히 어긋남:

  • 담당자가 SSH 로 직접 수정 (temporary fix 라며)
  • 자동 업데이트로 예상 밖 버전
  • 신규 노드가 최신 초기화 스크립트 반영 안 됨
  • 3개월 전 결정한 표준이 흐지부지

결과: “제가 알기론 동일한데요…” 라고 하는 서버가 사실은 다 다름.

전통적 대응의 한계

  • Cron 스크립트: 실행 이력 감사 어려움
  • Configuration Management (Chef/Puppet/Ansible): 별도 인프라 + 학습
  • Run Command 정기 실행: 실행은 되지만 컴플라이언스 뷰 없음

State Manager 의 답

  • Association: “이 노드 그룹” + “이 문서 (SSM Document)” + “이 스케줄” 을 묶은 선언
  • 정기 실행: 스케줄대로 자동 (cron / rate)
  • 컴플라이언스 뷰: 어느 노드가 준수 / 위반인지 대시보드
  • 자동 복구: 상태가 어긋나면 스크립트로 다시 적용

Association: State Manager 의 핵심 단위

Association 은 “노드 X 는 문서 Y 의 상태를 스케줄 Z 로 유지해야 함” 이라는 선언.

flowchart LR
    A["Association"]

    A --> Target["대상<br/>(태그 매칭)<br/>tag:Env=prod"]
    A --> Doc["SSM Document<br/>(적용할 스크립트)<br/>AWS-UpdateSSMAgent 등"]
    A --> Sched["스케줄<br/>rate(1 day)"]
    A --> Compl["Compliance<br/>결과 리포트"]

    Sched -.->|"트리거"| Exec["실행"]
    Doc -.-> Exec
    Target -.-> Exec

    Exec --> Report["성공/실패<br/>Compliance 업데이트"]

구성 요소:

  • 이름 (Association Name)
  • Document (실행할 스크립트, AWS 제공 또는 커스텀)
  • Target (태그, 인스턴스 ID, 리소스 그룹)
  • Schedule (cron 또는 rate)
  • 파라미터
  • 출력 (S3 / CloudWatch Logs)
  • Compliance 심각도

Association 예제

예 1: SSM Agent 항상 최신 유지

aws ssm create-association \
  --name "AWS-UpdateSSMAgent" \
  --targets "Key=tag:ManagedBy,Values=SSM" \
  --schedule-expression "rate(7 days)" \
  --compliance-severity CRITICAL \
  --association-name "keep-ssm-agent-updated"

의미:

  • 매주 tag:ManagedBy=SSM 인 모든 노드에 AWS-UpdateSSMAgent 실행
  • Agent 가 최신이 아니면 자동 업데이트
  • 실패한 노드는 CRITICAL 컴플라이언스 위반으로 표시

예 2: CloudWatch Agent 필수 설치

# 커스텀 Document: ensure-cw-agent.yaml
schemaVersion: '2.2'
description: 'CloudWatch Agent 설치 및 실행 상태 유지'
mainSteps:
  - action: aws:runShellScript
    name: installAndStart
    inputs:
      runCommand:
        - '#!/bin/bash'
        - 'if ! systemctl is-active --quiet amazon-cloudwatch-agent; then'
        - '  yum install -y amazon-cloudwatch-agent'
        - '  systemctl enable --now amazon-cloudwatch-agent'
        - 'fi'
aws ssm create-association \
  --name "ensure-cw-agent" \
  --targets "Key=tag:Env,Values=prod" \
  --schedule-expression "rate(1 day)" \
  --compliance-severity HIGH

매일 실행해 CloudWatch Agent 가 없거나 죽어있으면 재설치/시작.

예 3: 보안 설정 강제 (SSH 포트 22 만 허용)

schemaVersion: '2.2'
description: 'SSH 는 22, root 로그인 금지, 비밀번호 인증 금지'
mainSteps:
  - action: aws:runShellScript
    inputs:
      runCommand:
        - 'sed -i "s/^#\?Port .*/Port 22/" /etc/ssh/sshd_config'
        - 'sed -i "s/^#\?PermitRootLogin .*/PermitRootLogin no/" /etc/ssh/sshd_config'
        - 'sed -i "s/^#\?PasswordAuthentication .*/PasswordAuthentication no/" /etc/ssh/sshd_config'
        - 'systemctl restart sshd'

담당자가 SSH 로 임시로 root 로그인 켜놓으면 다음 실행 시 다시 꺼짐.

스케줄 표현

  • Rate: rate(1 hour), rate(7 days)
  • Cron: cron(0 3 ? * SUN *) (매주 일요일 03:00 UTC)
  • On-change (2024+): 대상 변경 감지 시 즉시 실행

Compliance (컴플라이언스) 뷰

State Manager 실행 결과가 SSM Compliance 로 자동 집계.

flowchart TB
    A1["Association 1<br/>실행 결과"]
    A2["Association 2<br/>실행 결과"]
    A3["Association N"]

    A1 --> C["Compliance 데이터<br/>노드 × Association × Status"]
    A2 --> C
    A3 --> C

    C --> Dash["SSM Compliance Dashboard"]
    C --> Config["AWS Config Rules<br/>(자동 감시)"]
    C --> SH["Security Hub<br/>(조직 전체 뷰)"]

상태:

  • COMPLIANT: 마지막 실행 성공
  • NON_COMPLIANT: 실패 (심각도 별로 표시)

활용:

  • 조직 전체에서 어느 노드가 뒤처졌는지 즉시 파악
  • 감사 리포트 자동 생성
  • 위반 감지 시 EventBridge 로 알림

State Manager vs Automation vs Run Command

Similar 하지만 목적이 다름.

Run CommandAutomationState Manager
성격일회성 명령다단계 워크플로지속적 상태 유지
실행 시점사용자가 트리거사용자 또는 이벤트정기 자동
컴플라이언스XXO (기본)
재실행매번 수동수동 or 이벤트자동
대표 사용”지금 nginx 재시작""AMI 만들고 인스턴스 교체""SSM Agent 최신 유지”

결정:

  • 한 번만 실행 → Run Command
  • 여러 단계 워크플로 → Automation
  • 항상 특정 상태 유지 → State Manager

흔한 Association 패턴

1. 부팅 시 초기화 (applyOnlyAtCronInterval: false)

새 EC2 가 태그 매칭 되는 순간 즉시 실행.

  • 신규 노드 자동 설정
  • 오토스케일링으로 늘어난 인스턴스 표준화

2. 정기 검증 (Scheduled)

매일/주 등 정기 실행으로 드리프트 감지 + 복구.

3. On-Demand (스케줄 없음)

Association 만 정의하고 수동으로 실행 (start-associations-once). 배포 시점에.

실전 예제 (조합)

시나리오: 신규 프로덕션 EC2 노드가 반드시 다음을 유지해야 함.

  1. SSM Agent 최신 (매주)
  2. CloudWatch Agent 설치 + 실행 (매일)
  3. Patch Manager Baseline 스캔 (매일)
  4. 보안 설정 (SSH port 22 만, root 금지) (매일)
  5. Sudo 로그 파일 로테이션 설정 (매주)

각각 별도 Association 으로 정의. tag:Env=prod 매칭. 모두 컴플라이언스 대시보드에서 통합 관측.

Associations
├─ keep-ssm-agent (rate 7 days)      → AWS-UpdateSSMAgent
├─ ensure-cw-agent (rate 1 day)      → custom document
├─ scan-patches (rate 1 day)         → AWS-RunPatchBaseline (Operation=Scan)
├─ enforce-ssh-config (rate 1 day)   → custom document
└─ setup-logrotate (rate 7 days)     → custom document

요금

  • State Manager 자체 무료
  • 하위 Run Command / SSM Agent 통신 등 표준 무료
  • S3 / CloudWatch Logs 저장은 별도

함정

WARNING

Association 이 실패하는데 알림 없음 = 조용히 드리프트 지속. Compliance NON_COMPLIANT 를 EventBridge 로 감지 → SNS 알림.

CAUTION

스크립트가 idempotent 하지 않음 = 매번 실행하면 부작용. if ! installed; then install; fi 스타일로.

WARNING

잘못된 Association 이 대량 파괴 가능. 예: rm -rf /var/log/* 을 매일 실행. Dev 환경에서 충분히 테스트.

IMPORTANT

applyOnlyAtCronInterval: true 는 새 노드 즉시 실행 안 함. 신규 노드 초기 설정에는 false.

CAUTION

재시작 필요한 변경 = 스크립트가 재시작 유발 시 서비스 중단. Maintenance Window 와 조합 (State Manager 는 Maintenance Window 없이 정시 실행).

WARNING

Association 수 관리 안 하면 카오스. 이름 규약 ({env}-{purpose}), 태그 매칭 명확히.

IMPORTANT

동시성 (max-concurrency) 지정. Run Command 처럼 대량 동시 실행 방지. 특히 재시작 유발 스크립트.

관련 위키

이 글의 용어 (9개)
[AWS] CloudWatch: 메트릭, 로그, 알람cloud
정의 CloudWatch = AWS 의 모니터링 + 로그 + 알람 통합 서비스. 메트릭 수집, 로그 집계, 대시보드, 알람, 이상 감지를 하나의 서비스에서 제공. 사용 상황 | …
[AWS] Config (Resource Configuration Tracking)cloud
정의 AWS Config 는 AWS 계정 안 리소스의 구성 (configuration) 상태를 지속 기록 하고, 정책 규칙 (Config Rules) 위반을 자동 감지하는 서비스…
[AWS] EventBridge: 이벤트 버스, 스케줄러, partner sourcescloud
정의 EventBridge = AWS 의 통합 event bus. 옛 CloudWatch Events 의 후계. AWS service 이벤트 + custom 이벤트 + SaaS …
[AWS] S3: object storage, storage classes, lifecyclecloud
정의 S3 = AWS 의 object storage. bucket + key + object. 11 9's durability (99.999999999%), 무한 확장. 2026…
[AWS] SNS: pub-sub 알림, fan-out 패턴cloud
정의 SNS (Simple Notification Service) = pub-sub 메시징. Publisher 가 Topic 에 발행하면 모든 Subscriber 에 동시에 fa…
[AWS] SSM Automation: 운영 워크플로 런북cloud
정의 AWS SSM Automation 은 여러 단계로 이루어진 운영 워크플로를 런북 (runbook) 이라는 문서로 정의하고 실행 하는 Systems Manager 기능. 각 …
[AWS] SSM Patch Manager: OS 패치 자동화cloud
정의 AWS SSM Patch Manager 는 수십 - 수천 개의 EC2 / 온프레미스 서버에 OS 및 애플리케이션 패치를 정책 기반으로 자동 적용 하는 Systems Mana…
[AWS] SSM Run Command: 다수 서버 명령 실행cloud
정의 AWS SSM Run Command 는 하나의 API 호출로 수십 - 수천 개의 EC2 및 온프레미스 서버에 명령을 원격 실행 하는 Systems Manager 기능. SS…
[AWS] Systems Manager: 노드 운영 도구 모음 (인덱스)cloud
정의 AWS Systems Manager (SSM) 는 AWS / 온프레미스 / 멀티클라우드에 걸친 노드 (서버, 인스턴스, VM, IoT 등) 를 대규모로 안전하게 관리 / 운…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기