GitHub Actions 시니어 기술면접
새 면접Q. 마이크로서비스 아키텍처로 구성된 10개 이상의 서비스를 운영 중입니다. 각 서비스마다 독립적인 배포 파이프라인이 필요하지만, 공통 보안 정책(SAST, 컨테이너 스캔), 승인 프로세스, 알림 규칙은 일관되게 적용되어야 합니다. GitHub Actions를 활용하여 이러한 요구사항을 효율적으로 구현할 수 있는 아키텍처를 설계해주세요.
재사용 가능한 워크플로우와 중앙 집중식 관리 방식을 고려해보세요.
Reusable Workflow와 Composite Action을 조합한 계층형 아키텍처를 설계합니다. 먼저 조직 레벨의 중앙 저장소에 공통 보안 스캔, 승인 프로세스를 Reusable Workflow로 정의하고, 각 서비스 저장소에서는 workflow_call 이벤트로 이를 호출합니다. 환경별 배포 설정은 Environment Secrets와 Required Reviewers를 활용하여 중앙에서 관리하고, 공통 빌드 스텝은 Composite Action으로 패키징합니다. 또한 Organization 레벨의 Secrets와 Variables를 활용하여 API 키, 레지스트리 정보 등을 통합 관리하며, GitHub Apps를 통한 토큰 발급으로 권한을 세밀하게 제어합니다. 모니터링은 Workflow Run API를 활용한 대시보드를 구축하여 모든 서비스의 배포 현황을 한눈에 파악할 수 있도록 합니다.
- • Reusable Workflow를 통한 공통 로직 중앙화
- • Organization Secrets/Variables로 설정 통합 관리
- • Composite Action으로 재사용 가능한 빌드 스텝 패키징
- • Environment 기능으로 승인 프로세스 표준화
- • Workflow Run API를 활용한 통합 모니터링
멀티 레포지토리 환경에서 CI/CD 파이프라인의 일관성을 유지하고 중복을 제거하여 유지보수 비용을 절감할 때 사용됩니다.
Reusable Workflow와 Composite Action의 선택 기준은 무엇이며, 각각 어떤 상황에서 더 적합한가요?
Q. 프로덕션 배포 워크플로우가 간헐적으로 실패하는 현상이 발생했습니다. 에러 로그에는 'Resource not reachable' 메시지만 남아있고, 같은 커밋으로 재실행하면 성공하기도 합니다. GitHub-hosted runner를 사용 중이며, 워크플로우는 외부 API 호출, Docker 이미지 빌드 및 푸시, Kubernetes 배포 단계로 구성되어 있습니다. 이 문제를 체계적으로 진단하고 해결하는 접근 방법을 설명해주세요.
GitHub-hosted runner의 특성과 네트워크 불안정성, 그리고 각 단계별 재시도 전략을 고려해보세요.
먼저 워크플로우 로그를 상세 분석하여 어느 단계에서 실패하는지 특정합니다. GitHub-hosted runner는 매번 새로운 IP에서 실행되므로, 외부 API나 레지스트리의 rate limiting 또는 방화벽 규칙이 원인일 수 있습니다. 각 단계에 retry 로직을 추가하되, actions/github-script나 커스텀 스크립트로 exponential backoff를 구현합니다. Docker 레지스트리 연결 실패라면 대체 미러나 캐싱 전략을 도입하고, Kubernetes API 타임아웃이라면 연결 타임아웃과 재시도 횟수를 조정합니다. 근본적 해결을 위해 Self-hosted runner 도입을 검토하여 고정 IP와 안정적인 네트워크 환경을 확보하고, 실패 시 Slack이나 PagerDuty로 즉시 알림을 받도록 설정합니다. 또한 각 단계별 실행 시간과 성공률을 메트릭으로 수집하여 패턴을 분석하고, 필요시 단계를 분리하여 격리된 job으로 실행합니다.
- • GitHub-hosted runner의 IP 변경과 네트워크 불안정성 이해
- • 단계별 재시도 로직 구현 (exponential backoff)
- • Self-hosted runner 도입으로 환경 안정성 확보
- • 상세 로깅과 메트릭 수집으로 패턴 분석
- • 단계 분리와 격리를 통한 장애 영역 최소화
외부 의존성이 많은 배포 파이프라인에서 간헐적 네트워크 오류로 인한 배포 실패를 최소화할 때 필요합니다.
Self-hosted runner를 도입할 때 보안상 고려해야 할 주요 사항은 무엇인가요?
Q. GitHub Actions 워크플로우에서 AWS 리소스에 접근해야 하는 상황입니다. 기존에는 장기 유효한 AWS Access Key를 GitHub Secrets에 저장하여 사용했는데, 보안팀에서 키 로테이션 부담과 유출 위험을 이유로 개선을 요구했습니다. OIDC(OpenID Connect)를 활용한 keyless 인증 방식으로 전환하는 설계와 구현 방법, 그리고 이를 통해 얻을 수 있는 보안상 이점을 설명해주세요.
GitHub Actions의 OIDC 토큰과 AWS IAM Role의 신뢰 관계 설정이 핵심입니다.
GitHub Actions는 각 워크플로우 실행 시 OIDC JWT 토큰을 자동 발급하며, 이를 AWS STS AssumeRoleWithWebIdentity API와 연동하여 임시 자격증명을 획득합니다. AWS에서 IAM Identity Provider를 생성하고 GitHub의 OIDC endpoint(token.actions.githubusercontent.com)를 등록한 후, IAM Role의 Trust Policy에서 특정 저장소와 브랜치만 허용하도록 조건을 설정합니다(subject claim 검증). 워크플로우에서는 aws-actions/configure-aws-credentials 액션을 사용하여 role-to-assume 파라미터로 IAM Role ARN을 지정하면, 액션이 자동으로 OIDC 토큰 교환과 임시 자격증명 설정을 처리합니다. 이 방식은 장기 키가 저장소에 존재하지 않아 유출 위험이 없고, 임시 자격증명은 1시간 후 자동 만료되며, 세밀한 조건 설정으로 특정 브랜치나 환경에서만 접근을 허용할 수 있습니다. 또한 CloudTrail 로그에서 어떤 워크플로우 실행이 AWS 리소스에 접근했는지 추적 가능하여 감사 요구사항도 충족합니다.
- • OIDC JWT 토큰을 활용한 keyless 인증 구현
- • IAM Role Trust Policy에서 subject claim으로 세밀한 권한 제어
- • 임시 자격증명 사용으로 유출 위험 최소화
- • 특정 저장소/브랜치/환경에 대한 조건부 접근 제어
- • CloudTrail 통합으로 감사 추적 가능
클라우드 리소스 접근 시 장기 자격증명 관리 부담을 없애고, 최소 권한 원칙을 적용하여 보안 수준을 높일 때 사용됩니다.
OIDC subject claim에 포함할 수 있는 정보에는 어떤 것들이 있으며, 보안 강화를 위해 어떤 조건을 추가로 설정할 수 있나요?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!