데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      Lambda에서 AWS CLI를 사용하려면 어떻게 해야할까?

      zero 25.04.04
      976 5 1
      DEVOTEE 요약
      Lambda 함수에서 AWS CLI 명령을 실행하기 위해, AWS CLI 모듈을 포함한 Lambda Layer를 생성하고 적용하는 방법을 설명합니다. 먼저 virtualenv를 사용하여 AWS CLI 및 필요한 라이브러리들을 가상환경에 설치한 후, 해당 파일들을 Lambda Layer로 패키징합니다. 이 Layer를 Lambda 함수에 적용하면 AWS CLI 명령을 직접 실행하여 boto3로는 실행할 수 없는 기능을 수행할 수 있습니다.
      DEVOTEE 추천 블로그

      Intro

      Python으로 작성한 Lambda 함수를 사용해서 AWS 리소스를 호출하여 관리하는 케이스는 흔합니다.

      이러한 경우 AWS CLI보다는 일반적으로 boto3 라이브러리를 사용하는데요.

      아래 CLI의 경우에는 boto3로 구현이 불가한 기능입니다.

      • aws s3 sync

      • aws eks update-kubeconfig

      때문에 위 기능을 수행하려면 AWS CLI를 통해 리소스를 호출해야 합니다.


      AWS Lambda 런타임 환경에서는 기본적으로 AWS CLI를 지원하지 않으므로, Lambda Layer를 통하여 AWS CLI Python 모듈을 포함 시키는 방법을 공유 드리겠습니다.

      (AWS CLI는 다소 특이한 Python 모듈이기 때문에, 일반적인 Lambda Layer 생성 과정에서 몇 가지 과정들을 추가로 수행해주어야 합니다.)


      1. Python 가상환경 만들기

      Lambda Layer에 넣어줄 AWS CLI 및 종속 라이브러리들만 패키징하기 위해, 별도의 가상 환경을 만들어 줍니다.

      ### virtualenv 라이브러리 설치
      $ pip install virtualenv
      
      ### 가상환경 생성
      $ virtualenv ~/venv_awscli
      
      ### 가상환경 실행
      $ source ~/venv_awscli/bin/activate


      2. AWS CLI 설치 및 Lambda Layer 패키지 디렉토리 구성

      AWS CLI를 포함한 종속 라이브러리를 설치하고, AWS CLI 라이브러리 패키지 폴더 뿐 아니라, 명령어 실행파일인 'aws' 파일도 Lambda Layer 패키지 디렉토리로 옮겨주어야 합니다.

      ※ Lambda Layer zip 파일 내의 /bin/ 디렉토리는 Lambda 실행 환경에선 /opt/bin/ 디렉토리가 됩니다.

      /opt/bin/ 디렉토리는 Lambda function의 PATH 환경 변수에 포함되어 있기 때문에 Lambda function은 aws 명령을 경로 지정 없이 실행할 수 있습니다.

      ### 가상환경 내에서 AWS CLI 및 종속 라이브러리 설치
      $ pip install awscli
      
      ### Lambda Layer 디렉토리 생성
      $ mkdir ~/lambda_dir
      
      ### AWS CLI 라이브러리 패키지 및 'aws' 실행파일 복사
      $ cp -r ~/venv_awscli/python3.xx/site-packages/* ~/lambda_dir
      $ cp -r ~/venv_awscli/bin/aws ~/lambda_dir


      3. 'aws' 실행파일 인터프리터 수정

      이대로 Lambda Layer 패키지를 적용하게 되면, Lambda 함수는 aws 실행파일을 인지하지 못합니다.

      기존 'aws' 실행파일 첫 줄에 있는 인터프리터 경로(/usr/bin/python)을 Python 인터프리터 경로(/var/lang/bin/python)로 수정해주어야 합니다.

      $ sed -i "1s/.*/\#\!\/var\/lang\/bin\/python/" ~/lambda_dir/aws


      4. 라이브러리 패키징 및 Lambda Layer 생성

      Lambda Layer에 라이브러리를 업로드하려면 zip 파일로 묶어주어야 합니다.

      $ zip -r awscli-lambda-layer.zip ~/lambda_dir/*

      그리고 나서 AWS 웹콘솔을 통해 Lambda Layer를 생성해줍니다.

      image.png


      5. Lambda Layer 적용 및 함수 테스트

      아래 함수는 간단하게 AWS CLI 버전을 확인하는 코드로, AWS CLI인 'aws' 명령어로 동작합니다.

      import subprocess
      
      def lambda_handler(event, context):
          try:
              command = ["aws", "--version"]
              result = subprocess.run(command ,capture_output=True, text=True)
              return {
                  "statusCode": 200,
                  "body": f"Completed!\n{result.stdout}"
              }
          except Exception as e:
              return {
                  "statusCode": 500,
                  "body": f"Error: {str(e)}"
              }

      먼저 비교를 위해 Layer를 적용하지 않고 함수 테스트를 실행하여 결과를 보겠습니다.

      image.png

      -> 현재 Lambda 함수에는 아무런 Layer도 적용되어있지 않기 때문에, 해당 코드를 실행하면 아래와 같이 'aws' 명령어를 찾지 못하는 에러가 발생합니다.


      이제 Lambda Layer를 적용하고 테스트를 해보겠습니다.

      image.png

      -> 위에서 생성한 Layer를 함수에 추가하고 다시 테스트를 수행합니다.


      image.png

      -> 저희가 패키징한 AWS CLI 라이브러리가 잘 적용되어, 'aws' 명령을 잘 수행하였습니다.


      이로써 저희는 aws s3 sync와 같이 boto3에서 실행 불가능한 명령을 AWS CLI를 통해 Lambda에서 실행할 수 있게 되었습니다.

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      zero 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기