ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 세마포어 CI로 Github CI/CD 구축하기 - 4. 환경변수 설정하기, AWS CLI 계정 credentials 파일 생성하기
    Project/CICD 2022. 7. 25. 00:49
    728x90
    반응형

     

     작업시 AWS 계정 정보 같은 여러가지 민감 정보를 사용할 때가 있는데, 이를 코드에 그대로 넣고 github에 올려버리면 불특정 다수에게 노출되는 위험성이 있다. 사실 회사의 작업 repository는 private repo이기때문에 그대로 넣고 올려도 엄청난 문제 상황이 예상되지 않지만 데이터 보안에 대한 경각심은 데이터 엔지니어로써 기본적으로 가져야할 부분이라고 생각한다. 해서 최대한 권한이 부여된 정보들을 볼 수 없도록 하는 방법들을 생각해봤다.

     

     배포 파일은 python을 이용하므로 크게

    1. env파일에 관련 변수들을 저장하고 해당 파일을 github에서 encycrpt하기
    2. Github의 secrets 기능 사용하기 (repository단위로 설정할 수 있다)
    3. Semaphore의 secrets 설정하기

     이렇게 세 가지 방법이 있었는데, 3번이 가장 간단해서 3번을 사용했다. 이렇게 등록한 환경변수는 빌드시 가상 머신에서 사용된다. 

     

    AWS Credentials 파일 생성하기

     먼저 등록하는 방법을 이야기하기 전에 AWS credentials 파일을 어떻게 생성해야할 지 의문이 생길 수 있다. AWS CLI를 사용하려면 해당 머신의 .aws폴더에 인증된 계정의 configure와 credential 파일이 저장되어 있어야한다. yaml파일에서 command를 통해 빌드 할 때마다 계정인증을 해줘도 되지만 번거롭기때문에 그냥 인증 파일을 환경에 등록하는 방법을 선택했다.

     

    1.  AWS에서 IAM 계정으로 로그인 한 뒤 access ID를 생성한다. 생성받는 방법은 여러가지가 있는데 콘솔을 통해서 하는게 제일 편할 것 같다 (공식문서)
    2.  위의 과정의 따라 access key를 발급받으면 access key ID와 scecret access key라는 것이 생긴다. 본인 로그인 정보이므로 비밀스럽고 소중한 공간에 보관하도록 한다.
    3.  내 컴퓨터의 터미널에 aws configure를 치면 AWS Aceess Key ID, AWS Secret Access Key, Default region name, Default output format을 입력하라는 메세지가 차례로 뜬다.
      앞의 두 개는 위에서 발급받은 정보를 입력해주면 되고, Default region은 내가 AWS를 사용할 때 주로 사용하는 리전을 쓰면 된다 (서울이라면 ap-northeast-2 이런 식으로).
      Default output은 aws명령어를 수행했을 때 출력값을 어떤 형태로 받을지에 대한 건데 보통 text아니면 json으로 받으면 된다.

    4. 다 입력하고나면 /Users/[유저이름] 경로에 .aws라는 폴더가 생성되고, 그 안에 config와 credentials라는 파일이 생성돼 있을 것이다. 해당 파일을 데스크탑으로 복사해준다.

    $cp ~/.aws/config ~/.aws/credentials ~/Desktop/

    5. 데스크탑에 생성된 파일을 아래 과정을 통해 등록해준다.

     

     Semaphore에 환경변수 등록하기

     1. 해당 프로젝트의 Settings > Secrets > Setup global secrets에 들어간다.

     2. New Secret을 선택하면 다음과 같은 화면이 보인다.

    • Name of the Secret: 해당 secret의 이름을 설정한다 (사용자 정의). 나중에 yaml파일에서 불러올 때 사용한다.
    • 등록하고자하는 값이 파일일 경우 (e.g. AWS 계정 configure 파일)
      1. Configureation Files쪽의 inbox(/path/to/file이라고 적혀있는 부분)에 파일을 저장하고자 하는 경로를 입력한다. (Add Configuration File 버튼을 클릭하면 여러 개를 등록할 수 있다.)
        • AWS configre file: /home/semaphore/.aws/config
        • AWS credential file: /home/semaphore/.aws/credential
      2. 위에서 데스크탑에 복사해놓은 파일을 각각 Upload File 버튼을 사용해 불러온다. 불러온 파일은 암호화되어 등록된다.
    • 등록하고자하는 값이 텍스트인 경우 (e.g. DB user id, 비밀번호 등)
      1. Environment Variables쪽의 inbox에 Variable Name에 키값을 등록한다 (해당 값이 무엇인지).
      2. Value에 등록하고자 하는 값을 등록한다.
        예를 들어, 등록하고자 하는 값이 DB user의 비밀번호일 경우, Variable Name에는 DB-PWD, value에는 실제 비밀번호를 넣으면 된다.

    Semaphore secrets 사용하기

     yaml파일에서 사용하는 방법은 두 가지이다.

    • Global job config에 등록하는 경우: 전체 block에서 사용 가능하다
    • task에 등록하는 경우: 해당 block에서만 사용 가능하다.
    version: v1.0
    name: My blue project
    agent:
      machine:
        type: e1-standard-2
        os_image: ubuntu1804
    
    global_job_config:
      secrets:
        - name: aws-credentials
    blocks:
      - name: Test
        task:
          secrets:
            - name: db-admin
            
          jobs:
          - name: Run tests
            commands:
              - checkout
              
      - name: Deploy
        task:
          jobs:
            - name: Run tests
              commands:
                - checkout

     위와 같이 yaml을 작성했을 경우, Name of Secret을 aws-credentials로 등록한 환경 설정은 Test와 Deploy 블록에서 모두 적용된다. 하지만 db-admin으로 등록한 환경설정은 Test 블록에서만 적용되며, Deploy블록에서는 적용되지 않는다.

     

     Environment Variables로 등록한 값은 yaml파일에서 위와 같이 불러와서 환경변수처럼 사용할 수 있다. 예를 들어, 다음과 같이 정의되어 있는 secret일 경우,

    • Name of Secret: DB-ADMIN
    • Variable Name: DB-USERNAME
    • Value: admin

     yaml파일의 global job config/ task에서 DB-ADMIN으로 불러오고 python에서 다음과 같이 사용하면 된다.

    import os
    
    print(os.environ["DB-USERNAME"]) #출력값: admin
    728x90
    반응형

    댓글