본문 바로가기
트러블 슈팅

자동 배포 workflow 외부 IP 접근 불가 (feat. self-hosted)

by CodingMasterLSW 2025. 7. 17.

github action workflow 파일 작성 중, 배포 과정에서 오류가 발생했다.

 

위와 같은 오류가 발생했고, 발생 지점의 코드는 다음과 같다.

deploy:
    needs: build
    runs-on: ubuntu-latest
    environment: dev
    steps:
      - name: EC2 배포
        uses: appleboy/ssh-action@v0.1.5
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ${{ secrets.EC2_USER }}
          key: ${{ secrets.EC2_PRIVATE_KEY }}
          script: |
            docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPOSITORY }}:latest  
            docker-compose up -d
            docker logout


오류 메세지를 보니 스크립트 코드 실행 전 EC2 인스턴스에 접근조차 못 하고 있다고 판단했다. 왜 접근을 못 하지? 고민을 하고 있었는데, EC2 인스턴스의 보안그룹 문제일수도 있겠다는걸 빠르게 캐치할 수 있었다.

 

보안그룹을 확인해봤는데, SSH 접근 IP가 우테코 내부로 한정되어 있었다. 결국 보안그룹의 한정된 IP로 인해 외부 IP인 github actions에서 EC2 Instance에 접근을 하지 못 해 발생한 오류였다.

 

해결방법 : Github Action Self Runner

 

외부에서 내 EC2 인스턴스에 접근을 하지 못 한다면, 내부에 미리 설치를 해놓으면 된다!

 

https://github.com/actions/runner

 

GitHub - actions/runner: The Runner for GitHub Actions :rocket:

The Runner for GitHub Actions :rocket:. Contribute to actions/runner development by creating an account on GitHub.

github.com

 

Github Action에서는 runner라는 오픈 소스를 제공해준다. 나는 해당 러너를 EC2 Instance 내부에 설치했다. 

Github Actions -> EC2 Instance로 통신하는게 아니라, EC2 Instance -> Github Actions로 통신하는 구조다. 관계가 바뀌면 외부에서 EC2 인스턴스에 접근을 할 필요가 없다. 위의 구조로 바뀌면 인바운드 규칙이 중요하지 않다.

 

위와 같은 이유로, EC2 Instance 내부에 self-runner를 설치하면 외부 IP가 어딘지 상관없이 자동 배포 파이프라인을 구성할 수 있다.

 

Runner 설치는 공식문서를 참고하자.

https://docs.github.com/en/actions/how-tos/hosting-your-own-runners/managing-self-hosted-runners/adding-self-hosted-runners

 

Adding self-hosted runners - GitHub Docs

You can add a self-hosted runner to a repository, an organization, or an enterprise.

docs.github.com

 

설치를 마치고 나면 반드시 실행을 해줘야한다. 필자는 처음에

./run.sh

명령어를 통해 실행했는데, 실행하고 아무것도 할 수가 없어서 이후에

nohup ./run.sh &

로 실행 명령어를 바꿔주었다.

 

 

정상적으로 실행이 되면 Status가 활성화된다.

 

활성화가 되면 이제 Github Action Script에서 runs-on을 통해 EC2 Instance에 바로 접근을 할 수 있다.

 

deploy:
    needs: build
    runs-on: [self-hosted, linux, ARM64]
    environment: dev
    steps:
      - name: EC2 배포
        run: |
          docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPOSITORY }}:latest
          cd /home/ubuntu/docker
          docker-compose down
          docker-compose up -d --build
          docker image prune -f

 

외부 IP에서 접근을 할 수 없어서 어떻게 해야할 지 감도 안 잡혔는데, self-hosted 라는 키워드를 빠르게 캐치할 수 있어 다행이다. (폰트 최고)


Self-hosted의 단점

 

Self-hosted를 사용하는 환경에서는 private Repository를 권장한다.

 

다른 사람이 fork 한다음에 pr을 보내면 외부에서 악의적인 코드를 실행시킬 수 있다는 문제점이 존재한다. 우테코 프로젝트 Repository는 public이기 때문에 더 좋은 방법이 있는지 고민을 해봐야 할 것 같다.