[GitHub Actions] 오라클 클라우드 CLI API를 이용한 배포

[GitHub Actions] 오라클 클라우드 CLI API를 이용한 배포
선착순 이벤트 프로젝트 배포전략

시작하기 앞서

Github Actions를 이용하여 CI / CD를 구축할 수 있다.
나는 워크플로우 작업 시 오라클 클라우드 인스턴스에 배포했던 과정에 대해서 조금 찾기 힘들었어서 기록을 남긴다.

인바운드 규칙을 모두 허용하면 배포가 간단하지만 이미 나의 집 Public IP를 통해서만 접근 가능하도록 설정을 다 해두었고 GitHub Actions는 워크플로우 실행마다 Public IP가 변경되어서 매번 인바운드 규칙을 추가 해줘야 했다. (SCP와 SSH를 이용하기 때문)

젠킨스를 사용할 경우 Github WebHook의 Public IP가 따로 있는 걸로 알고 있음.

GitHub Actions와 Oracle Cloud를 함께 사용하기 위한 준비

OCI ID 얻는법

우선 오라클 클라우드를 Github Actions에서 이용하려면 몇가지 준비과정이 필요하다.

    env:
          OCI_CLI_USER: ${{ secrets.OCI_CLI_USER }} # Identity >> My profile
          OCI_CLI_TENANCY: ${{ secrets.OCI_CLI_TENANCY }} # Administration >> Tenancy details
          OCI_CLI_FINGERPRINT: ${{ secrets.OCI_CLI_FINGERPRINT }} # Identity >> My profile >> API keys 
          OCI_CLI_KEY_CONTENT: ${{ secrets.OCI_CLI_KEY_CONTENT }} # Identity >> My profile >> API keys 
          OCI_CLI_REGION: ${{ secrets.OCI_CLI_REGION }} # 지역 확인

워크플로우에서 사용하기 위한 필수 OCI ID

yml에 주석으로 작성 되어있는 Oracle Cloud 메뉴를 찾아보면 User InformationOCID가 있다 나머지 ID도 동일하다

OCI_CLI_USER에 해당하는 데이터 Copy 클릭
OCI_REGION
CLI Environment Variables
Learn how to provide basic configuration information for the Command Line Interface (CLI) as environment variables.

OCI를 이용하기 위한 환경변수 정보

Github Actions 비밀키 등록

아래와 같이 비밀키로 등록해야 워크플로우에서 사용할 수 있다.

프로젝트 저장소에 Settings탭을 들어가면 등록할 수 있다.

사용 방법

update — OCI CLI Command Reference 3.47.0 documentation

security list 추가하는 방법(여기가 핵심)

우선 위 공식문서에서는 JSON 형태로 보내는 법과 JSON File을 만들어 보내는 법 2가지를 알려주는데 JSON으로 하다가 구문 오류가 좀 많이 발생해서 나는 그냥 파일로 했다.

- name: Print public Ip # 깃 워크플로우 인스턴스 IP 얻기
        run: |
          echo "Public IPv4: ${{ steps.ip.outputs.ipv4 }}"        
      - name: Install OCI CLI
        run: |
          curl -L https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.sh | bash -s -- --accept-all-defaults --install-dir ~/lib/oci-cli
          export PATH=~/lib/oci-cli/bin:$PATH
          echo $PATH
        shell: bash

      - name: Configure OCI CLI # OCI 설정
        run: |
          mkdir -p ~/.oci
          echo "${{ secrets.OCI_CLI_KEY_CONTENT }}" > ~/.oci/oci_api_key.pem
          echo "[DEFAULT]
          user=${{ secrets.OCI_CLI_USER }}
          fingerprint=${{ secrets.OCI_CLI_FINGERPRINT }}
          tenancy=${{ secrets.OCI_CLI_TENANCY }}
          region=${{ secrets.OCI_CLI_REGION }}
          key_file=~/.oci/oci_api_key.pem" > ~/.oci/config
      - name: Get existing security list rules # 기존 오라클 클라우드의 인바운드 규칙 정보 가져오기
        run: |
          ~/lib/oci-cli/bin/oci network security-list get --security-list-id ${{ secrets.OCI_CLI_SECURITYLIST_ID }} --query 'data."ingress-security-rules"' --output json > existing-rules.json
      - name: Modify ingress rules # 깃 워크플로우 인스턴스 IP를 오라클 클라우드 보안 리스트에 추가기 위한 json 파일 만들기
        run: |
          IP_ADDRESS="${{ steps.ip.outputs.ipv4 }}"
          NEW_RULE='{"protocol": "6", "source": "'$IP_ADDRESS'/32", "isStateless": false, "tcpOptions": {"destinationPortRange": {"min": 22, "max": 22}}}'
          jq --argjson newRule "$NEW_RULE" '. += [$newRule]' existing-rules.json > merged-ingress-rules.json
      - name: Update Security List # 보안 리스트 업데이트
        run: |
          ~/lib/oci-cli/bin/oci network security-list update \
            --security-list-id ${{ secrets.OCI_CLI_SECURITYLIST_ID }} \
            --ingress-security-rules file://$(pwd)/merged-ingress-rules.json \
            --force > /dev/null # 이거 안쓰면 콘솔에 인바운드 규칙 노출됨...

workflow에서 OCI에 인바운드 규칙 추가

내용만 보면 어지럽지만 대부분 공식문서에서 떠먹여주고 있음

배포 끝나고 existing-rules.json을 다시 업데이트 해주면 GitHub ActionsPublic IP는 제거된다.

참고 문서

일단 아래 링크는 처음에 시도해봤는데 실패할 때마다 어떤 오류가 났는지 상세하게 알 수 없어서 하다가 말았다.

구문 오류인지, 어떤 옵션을 잘못 입력했는지 안 나오고 JS 런타임 에러만 나옴

그러나 이 작업에 필요한 공식문서 링크들을 많이 담고 있어서 한번 읽어보는걸 추천함

GitHub - oracle-actions/run-oci-cli-command: Run Oracle Cloud Infrastructure (OCI) CLI commands
Run Oracle Cloud Infrastructure (OCI) CLI commands - oracle-actions/run-oci-cli-command

마무리

Github Actions로 배포자동화 만드는건 깃 공식문서나 다른 인터넷 보고도 할 수 있어서 할만한데 OracleCloud를 이용하면서 SecurityList까지 신경 쓰면서 하려다 보니 난이도가 좀 있었다.
AWS는 편하다고 하는데 (아직 안써봄) OracleCloud의 무료 인스턴스 장점이 너무 커서 AWS를 이용해봐야겠다는 생각이 전혀 안든다..