Skip to content

계정 이관 워크플로의 서버 접속 SSM 전환 - #1219

Merged
m-a-king merged 2 commits into
devfrom
infra/1210-migrate-ssm
Oct 15, 2026
Merged

m-a-king merged 2 commits into
devfrom
infra/1210-migrate-ssm

Conversation

@m-a-king

Copy link
Copy Markdown
Collaborator

한눈에

계정 이관 작업이 서버에 접속하는 경로 전환

  • 이전: 계정 이관 작업이 서버의 SSH 포트(22)로 직접 접속
    • 새 계정 서버는 이관 작업 구간에만 SSH 포트를 임시로 엶
    • 옛 계정 서버는 SSH 포트가 열려 있어야 함
  • 이관 작업이 AWS 의 원격 접속 서비스(SSM)를 거쳐 접속
    • 옛 계정 서버에는 옛 계정 키로 접속
  • 원인: 지금 계정의 SSH 포트가 모두 닫힘
    • 다음 이관에서는 지금 계정이 옛 계정이 됨
  • 머지 직후 바뀌는 서비스 없음
    • 이관 작업은 사람이 직접 실행할 때만 돎

Situation

계정 이관 워크플로의 SSM 전환

  • 계정 이관 워크플로의 서버 접속 SSM 전환 #1210
  • SSH 직접 접속이 남았던 이유
  • 추가
    • 구·신 계정 서버의 Name 태그가 같음 (piki-prod-app 등)
      • 결과: infra 공용 액션만으로는 두 서버의 ssh 별칭이 겹침
    • prod 이관의 배포 워크플로는 main 커밋을 체크아웃함
      • 결과: dev 에만 있는 이 레포 액션을 배포 워크플로 안에서 못 씀

Task

계정 이관 워크플로의 SSM 전환

Action

접속 경로 전환

대상 이전 이후
신 계정 앱 서버 (서버 준비·리허설·컷오버 스모크·검증 진단) 22번 임시 개방 뒤 IP 로 SSH infra 공용 액션으로 SSM 경유 SSH. 별칭은 Name 태그
구 계정 앱 서버 (인증서 복사·freeze·롤백·dev DB 덤프) IP 로 직접 SSH. 22번 개방 전제 새 액션 migrate-src-ssh 로 SSM 경유 SSH. 별칭은 src-<Name 태그>
prod DB 서버 SSM Run Command 동일
22번 임시 개방 액션 있음 삭제

구 계정 접속 액션 추가

  • 구 계정 키를 AWS 프로필로 기록
    • 원인: job 의 기본 자격은 OIDC 로 잡은 신 계정
    • 셸 내장 printf 로 기록. 키가 프로세스 목록에 뜨지 않음
  • infra 공용 액션을 alias·aws-profile 입력으로 호출
  • Name 태그로 찾은 서버의 공인 IP 가 도메인 A 레코드와 다르면 중단
    • 원인: 구 계정 키가 엉뚱한 계정을 가리켜도 Name 태그는 맞을 수 있음
선택지 장점 비용
구 계정도 SSM 경유 SSH (채택) 지금의 ssh·scp 스트리밍 코드 그대로 사용 infra 공용 액션 입력 2개 추가
구 계정은 SSM Run Command 만 infra 변경 없음 명령 출력이 약 24KB 에서 잘려 dev DB 덤프·인증서 묶음 전달 불가

TLS 인증서 복사 위치 이관

선택지 결과
이관 워크플로 서버 준비 job (채택) dev 브랜치의 액션 사용 가능
배포 워크플로 유지 prod 이관 때 main 커밋 체크아웃이라 새 액션 없음
  • 신 서버에 인증서가 이미 있으면 구 서버 접속과 복사를 건너뜀
    • 원인: 컷오버 뒤 서버 준비 job 을 다시 돌리면 도메인이 신 서버라 IP 가드에 걸림
  • 배포 워크플로가 이관 모드에서 인증서가 없으면 발급 대신 중단
    • 서버 준비 job 을 먼저 돌리라고 안내
    • 원인: DNS 가 아직 구 서버라 HTTP-01 발급이 원리적으로 실패함

실패 경로 보강

  • 서버 준비 job 에 SSM 등록 대기 추가 (최대 10분)
    • 원인: 갓 뜬 서버는 SSM Agent 등록 전일 수 있음
  • 리허설에 구 앱 서버 SSH 사전 점검 추가 (읽기 전용 docker ps)
    • 원인: 컷오버 freeze 경로가 막혀 있으면 다운타임 밖에서 드러나야 함
  • 롤백 스크립트가 상태 파일을 호스트 검사보다 먼저 확인
    • 원인: 구 서버 접속 준비가 실패한 실행은 freeze 도 없었음
  • 롤백의 docker start 를 3회 재시도
    • 원인: SSM 채널이 한 번 늦게 열려도 구 서비스가 내려간 채 남음
  • DB 이전 스크립트와 롤백 스크립트의 ssh 접속 시간 제한 15초 지정 제거
    • 원인: 명령줄 값이 공용 액션 설정의 30초를 덮음 (ssh -G 실측)
    • 30초는 SSM 세션이 열리는 시간까지 감안한 값

독립 리뷰 반영

  • 대화 맥락 없는 리뷰어에게 diff 리뷰를 맡김. 확정 결함 0건
지적 반영
구 계정 키 권한 목록에 세션 채널 권한 누락 머리 주석에 ssm:TerminateSession·ssmmessages:OpenDataChannel 추가
ssh 접속 시간 제한 15초가 SSM 설정을 덮음 지정 제거. 롤백 재시도 추가
컷오버 뒤 서버 준비 재실행이 구 계정에 의존 신 서버 인증서가 있으면 구 계정 접속 생략
배포 단독 실행 시 인증서 누락 원인이 안 보임 이관 모드에서 발급 대신 안내 후 중단

정리

  • 쓰이지 않게 된 DB 주소 출력 삭제

Result

검증 범위

항목 방법 결과
프로필 경유 SSM 터널 가짜 env 자격 아래 로컬에서 dev 앱 서버로 시도 sshd 배너 도달. 일부러 틀린 키에서만 거부
프로필 우선순위 가짜 env 키 아래 --profile·AWS_PROFILE 비교 플래그만 프로필 사용
구 서버 IP 가드 지금 계정을 구 계정으로 보고 dev·prod 실제 값 대조 둘 다 일치
배포 인증서 단계의 이관 분기 원격 스크립트를 로컬에서 인증서 없는 상태로 실행 안내 출력 후 exit 1
워크플로 정적 검사 이관 워크플로 검증 스크립트·actionlint 새 지적 0건
  • 위험: 이관 전체는 실제 이관 때만 돌아 끝까지 검증 불가
    • 리허설의 사전 점검이 컷오버 전에 구 서버 접속 경로를 실제로 확인함
  • 조건: 다음 이관 전 MIGRATE_SOURCE_AWS_* 를 지금 계정 키로 교체
    • 필요 권한은 워크플로 머리 주석
    • 그 키로 start-session 을 한 번 실측

후속


연관 이슈

- 22번 임시 개방 액션(ssh-gate) 삭제
  - 원인: #1211 뒤 지금 계정의 22번 인바운드 0건
    - 결과: 다음 이관에서 구 계정 쪽 SSH 3곳(cert 복사·freeze·dev 덤프)이 막힘
- 신 계정 박스는 infra ssm-ssh 로 접속. 별칭은 Name 태그
- 구 계정 박스는 새 액션 migrate-src-ssh 로 접속
  - 구 계정 키를 AWS 프로필로 써 두고 ssm-ssh 의 alias·aws-profile 입력 사용 (infra#140)
  - 별칭은 src-<Name 태그>
  - Name 태그 박스의 공인 IP 가 도메인 A 레코드와 다르면 중단
- 구 앱 박스 TLS cert 복사를 deploy.yml 에서 migrate.yml provision 으로 이관
  - 원인: prod 이관의 deploy.yml 은 main 커밋을 체크아웃함
    - 결과: dev 에만 있는 이 레포 액션을 못 볼 수 있음
- provision 에 신 앱 박스 SSM 등록 대기 추가
  - 원인: 갓 뜬 박스는 SSM Agent 등록 전일 수 있음
- rehearsal 에 구 앱 박스 SSH 사전 점검 추가 (읽기 전용 docker ps)
  - 원인: 컷오버 freeze 경로가 막혀 있으면 다운타임 밖에서 드러나야 함
- migrate-unfreeze.sh 가 상태 파일을 호스트 검사보다 먼저 봄
  - 원인: 구 박스 SSH 준비가 실패한 실행은 freeze 도 없었음
- 쓰이지 않게 된 config 출력 db_ip_output 삭제
- 구 계정 키 필요 권한에 ssm:TerminateSession·ssmmessages:OpenDataChannel 추가 (머리 주석)
  - 원인: OpenDataChannel 이 없으면 세션이 열리자마자 끊김 (iam_people.tf 실측)
- migrate-db.sh·migrate-unfreeze.sh 의 ssh ConnectTimeout=15 제거
  - 원인: 명령줄 값이 ssm-ssh 설정의 30초를 덮음 (ssh -G 실측)
- migrate-unfreeze.sh 의 docker start 를 3회 재시도
  - 원인: SSM 채널이 한 번 늦게 열려도 구 서비스가 내려간 채 남음
- provision 이 신 박스에 cert 가 있으면 구 박스 접속과 cert 복사를 건너뜀
  - 원인: 컷오버 뒤 재실행은 도메인이 신 박스라 IP 가드에 걸림
- deploy.yml 이관 모드에서 cert 가 없으면 certbot 대신 provision 선행 안내 후 중단
  - 원인: DNS 가 구 박스라 HTTP-01 발급이 원리적으로 실패함
@m-a-king m-a-king added the infra 운영 환경 (IaC·클라우드 리소스·secret·배포 workflow) label Oct 15, 2026
@m-a-king m-a-king linked an issue Oct 15, 2026 that may be closed by this pull request
@m-a-king m-a-king self-assigned this Oct 15, 2026
@coderabbitai

coderabbitai Bot commented Oct 15, 2026

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration
  • Configuration used: Repository: TeamPiKi/core/.coderabbit.yml
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: a3d3a7d4-e4e4-4ae6-b216-014e133577a2
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown

Discord 스레드 연동용 메타데이터입니다. discord-pr-bot 워크플로가 자동 생성하며, 수정·삭제하면 PR 과 Discord 알림 연동이 끊깁니다.

@m-a-king
m-a-king merged commit a731461 into dev Oct 15, 2026
8 checks passed
@m-a-king
m-a-king deleted the infra/1210-migrate-ssm branch October 15, 2026 05:47
m-a-king added a commit that referenced this pull request Oct 15, 2026
- extractor·renderer 배포 호출에서 migration_host 제거
  - 원인: 두 레포가 SSM 전환 때 그 입력을 지움
    - 결과: 사이드 배포를 켜면 dispatch 가 Unexpected inputs(422)로 거부됨
- renderer 호출에 migration_role_arn(이관용 역할) 추가
  - 원인: 두 레포는 넘겨받은 역할의 계정에서 Name 태그로 박스를 찾음
    - 결과: 역할이 빠지면 기본 역할(구 계정)로 배포해 구 박스를 덮어씀
- side_hosts 는 IP 출력 대신 두 박스 존재 확인만 함
- core 배포 job 주석에서 cert 복사 언급 삭제 (#1219 로 provision 이관)
m-a-king added a commit that referenced this pull request Oct 15, 2026
- /etc/letsencrypt/live 확인을 sudo test -d 로 교체
  - 원인: live 는 700 root 라 ubuntu 의 [ -d ] 는 cert 가 있어도 거짓 (dev 박스 실측)
  - 결과(이전): 평소 배포는 매번 certbot 호출. 갱신 대상이 아니라 no action 으로 끝나 드러나지 않음
  - 결과(이전): #1219 의 이관 모드 분기는 cert 를 옮겨 둔 뒤에도 "cert 없음" 으로 배포를 멈춤
m-a-king added a commit that referenced this pull request Oct 19, 2026
- prod 이관의 rewire 가 extractor·renderer repo 수준 배포 역할 변수를 신 계정 값으로 교체
  - extractor AWS_ECR_PUSH_ROLE_ARN · renderer AWS_DEPLOY_ROLE_ARN
  - 원인: 세 repo 배포가 잡은 역할의 계정에서 Name 태그로 박스를 찾음. 역할 변수가 곧 배포 대상 계정
  - 원인: 2차 이관 뒤 extractor 가 6일간 켜져 있던 구 계정 박스로 배포 성공(#1174)
  - 두 박스는 전 환경 공용이라 prod 이관에서만 동작
- 역할 ARN 은 infra_apps 의 기본 name_prefix 이름으로 IAM 에 조회
  - 원인: 두 역할은 각 repo terraform state 소관
  - 대안: 사이드 repo checkout 뒤 terraform output
    - 기각: rewire 에 checkout·init 두 벌 추가. Name 태그 박스 확인도 이미 이름 고정
- 값을 못 얻거나 쓰기가 거부되면 rewire 를 부분 실패로 종료
- core Environment 의 EC2_HOST 쓰기 제거
  - 원인: SSM 경유 전환(#1219) 뒤 core·extractor·renderer 어느 워크플로도 EC2_HOST 를 읽지 않음
  - rewire 가 deploy_core 의 앱 IP 를 더는 쓰지 않아 needs 에서 deploy_core 제거
- finalize 수동 정리 안내 갱신
  - EC2_HOST 행 삭제. rewire 실패 때 두 사이드 repo 역할 행 표시
  - 경고 문구의 고정 건수 삭제. rewire 성공 시 역할 항목 없음
- 구 앱 박스 주소 해소 주석의 참조 정정
  - deploy.yml 의 EC2_HOST 검증을 도메인 가드로 교체
m-a-king added a commit that referenced this pull request Oct 19, 2026
* infra: 계정 이관 rewire 의 사이드 repo 배포 역할 갱신

- prod 이관의 rewire 가 extractor·renderer repo 수준 배포 역할 변수를 신 계정 값으로 교체
  - extractor AWS_ECR_PUSH_ROLE_ARN · renderer AWS_DEPLOY_ROLE_ARN
  - 원인: 세 repo 배포가 잡은 역할의 계정에서 Name 태그로 박스를 찾음. 역할 변수가 곧 배포 대상 계정
  - 원인: 2차 이관 뒤 extractor 가 6일간 켜져 있던 구 계정 박스로 배포 성공(#1174)
  - 두 박스는 전 환경 공용이라 prod 이관에서만 동작
- 역할 ARN 은 infra_apps 의 기본 name_prefix 이름으로 IAM 에 조회
  - 원인: 두 역할은 각 repo terraform state 소관
  - 대안: 사이드 repo checkout 뒤 terraform output
    - 기각: rewire 에 checkout·init 두 벌 추가. Name 태그 박스 확인도 이미 이름 고정
- 값을 못 얻거나 쓰기가 거부되면 rewire 를 부분 실패로 종료
- core Environment 의 EC2_HOST 쓰기 제거
  - 원인: SSM 경유 전환(#1219) 뒤 core·extractor·renderer 어느 워크플로도 EC2_HOST 를 읽지 않음
  - rewire 가 deploy_core 의 앱 IP 를 더는 쓰지 않아 needs 에서 deploy_core 제거
- finalize 수동 정리 안내 갱신
  - EC2_HOST 행 삭제. rewire 실패 때 두 사이드 repo 역할 행 표시
  - 경고 문구의 고정 건수 삭제. rewire 성공 시 역할 항목 없음
- 구 앱 박스 주소 해소 주석의 참조 정정
  - deploy.yml 의 EC2_HOST 검증을 도메인 가드로 교체

* infra: migrate.yml 의 OLD_ACCOUNT_ID 갱신

- 996918499382 를 현재 계정 731770491043 으로 교체
  - 원인: 2차 이관 finalize 수동 정리 항목이 남음
  - 위험: 그대로 두면 다음 이관이 이미 떠난 계정을 원본으로 삼음

* infra: 이관 finalize 의 역할 안내 기준을 rewire 완료 여부로 전환

- rewire job 이 done 출력을 노출. finalize 가 job 결과 대신 그 값으로 수동 행 표시
  - 원인: CROSS_REPO_TOKEN 이 없으면 rewire 가 아무것도 안 바꾸고 success 로 끝남
  - 원인: 직전 커밋이 경고 문구의 역할 항목을 rewire 성공 시 빼서 그 경우 안내가 사라짐(리뷰 지적)
  - 실패·건너뜀·토큰 없음 전부 미완료로 표시
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

infra 운영 환경 (IaC·클라우드 리소스·secret·배포 workflow)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

계정 이관 워크플로의 서버 접속 SSM 전환

1 participant