ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 람다 함수의 Gihtub 관리, 자동 업데이트 구현
    Technique/형상관리 2022. 8. 21. 15:38
    반응형

    시작에 앞서

    반갑습니다.

    현재 저희 팀에서 복수의 람다 함수를 운용 중에 있습니다.

    물론 AWS 에서 제공하고 있는 버전 관리 시스템도 유용하게 사용하고 있지만, 코드를 조금 더 상세하게 관리하고 싶은 의견들도 많았으며, 주로 람다를 생산해 내는 저 조차도 필요성을 느끼고 있기에 이번 기회에 Github에 이주시켜 보고자 합니다,

    이왕 Github 관리하는 이상, 현재 운용 중인 애플리케이션처럼, PR 이 마지가 된 이후엔 자동으로 deploy 되었으면 하는 마음이 있었기에, 이번 작업을 실행하게 되었습니다.

    당부의 말

    다양한 시도 끝에 수작업으로 만들어진 코드입니다. 굉장히 조잡할 수도 있으니, 수정안에 대해서 좋은 의견이 있으시다면 코멘트 부탁드립니다.

    원하는 액션이 없었기에 실행하게 된 작업니다. 향후 좋은 액션이 마켓에 등장하게 된다면 액션 내용에 대해서도 공유 부탁드립니다.

    원했던 상황

    하고자 했던 작업들은 간단했습니다.

    • AWS 아카운트 내에서 사용 중인 여러 람다 함수를 모두 관리
    • Merge 가 되는 경우 새로운 버전으로의 deploy
      • 저장소 전체가 deploy 되는 것이 아니라 이번에 작업된 함수만

    이 2가지를 만족시키는 액션이 현재로선 보이지 않았기에 작업을 시작하게 되었습니다.

    작업은 일전에도 공유한 적이 있는 Github Actions를 활용하였고, 트리거는 branch 대한 merge행위, PR아 merge 되어 close 되는 경우가 발생했을 경우를 상정하고 있습니다.

     

    앞서 이야기 했든 유용한 액션이 없었기 때문에 aws 커맨드를 github actions 상에서 이용하는 방법으로 진행했습니다.

    제가 조사한 바에 따르면 람다 관련 액션들은 대부분 1 레포지토리 1 함수 또는 특정 함수를 지정하는 식으로 보였기에 (제 인식이 잘못되었다면 죄송합니다) 저희가 원하는 2번째 조건의 액션을 찾을 수 없었습니다.

     

    상황을 정리하자면

    이런 식의 운용 구성을 원하고 있었습니다.

    복수의 파일을 업데이트 하더라도 대응가능한 상황을 대응하고 싶었습니다 (굳이)

     

    실행

    위의 흐름을 아래와 같이 실행하였습니다.

    //.github/worflows/merge.yml
    name: Deploy작업
    on:
      pull_request:
        branches:
          - develop
          - master
        types: [closed]
    
    jobs:
      deploy:
        if: github.event.pull_request.merged == true
        runs-on: ubuntu-latest
        environment:
          name: ${{ github.ref }}
        steps:
          - name: Checkout
            uses: actions/checkout@v3
          - uses: jitterbit/get-changed-files@v1
            id: files
            with:
              format: space-delimited
    
          - name: Configure AWS Credentials
            uses: aws-actions/configure-aws-credentials@v1
            with:
              aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
              aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
              aws-region: ap-northeast-1
    
          - name: Python Setup
            uses: actions/setup-python@v3
            with:
              python-version: '3.9'
    
          ## pip로awscli를Install
          ## 1. 변경이 발생한 파일 리스트를 foreach 로 반복하며 특정 확장자의 파일만 취득
          ## 2. .py(현 코드의 경우) 를 발견 → 파일명을 lambda_function.py로 변경 (현재 운용중인 람다함수의 파일명 )
          ## 3. 해당 파일을 .zip 으로 압축하여 해당 AWS 환경에 업로드 실행
          - name: Lambda Build & Update
            run: |
              pip3 install awscli 
              for changed_file in ${{ steps.files.outputs.added_modified }}; do
                if [[ ${changed_file##*.} == "py" ]]; then
                  cp `echo ${changed_file}` lambda_function.py && ls -al
                  zip -r package.zip lambda_function.py
                  aws lambda update-function-code --function-name `echo ${changed_file} | sed 's/src\///g' | sed 's/\.py//g'` --zip-file fileb://package.zip --publish
                fi
              done
    

    되도록 다양한 파일 확장자를 지정하도록 설정해보았습니다. 크게 의미는 없어 보입니다.

    한번에 여러 함수에 대한 작업이 발생할 수 있는 상황을 고려했기 때문에 이런 식의 흐름을 선택하였습니다.

     

    위의 상황을 조금 더 첨언하자면, 저희의 경우 AWS가 2가지 아카운트가 존재합니다.

    하나는 테스트 환경용 아카운트, 또 하는 프로덕션 아카운트 입니다. 환경에 따라 별도의 아카운트를 활용하고 있습니다.

    따라서 Github Actions를 실행 시킬 때에도 어느 브런치에 마지 되느냐에 따라 아카운트 정보를 Github Envrionments 를 활용하여 나누어 두었습니다.

     즉 쉽게 말해

    브런치가

    develop -> 개발 환경master -> 프로덕션 환경

    마무리하며

    이번에는 람다 함수를 관리하는 액션을 만들어 보았습니다.

    이전부터 필요한 기능이었는데 생각보다 여유가없다보니 생각보다 시간이 오래 걸렸던 것 같습니다.

    저는 비지니스 개발과 더불어 이러한 팀 내 개발에 도움이 되는 다양한 서포팅을 하는 작업에 왠지 모르게 조금 더 의욕이 앞서는 편입니다. 이 외에도 애플리케이션의 퍼포먼스 상황 체크나 애플리케이션 로깅 관리, AWS 비용 확인 등 조금 더 재미있는 주제로 의미 있는 결과를 만들어 낼 수 있다면 관련 포스팅을 작성할 수 있도록 노력하겠습니다.

     

    제 경험이 누군가에게 도움이 될 수 있다면 기쁩니다. 다들 즐거운 개발 하세요 :)

    반응형

    댓글

Designed by Tistory.