23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
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 생성 과정에서 몇 가지 과정들을 추가로 수행해주어야 합니다.)
Lambda Layer에 넣어줄 AWS CLI 및 종속 라이브러리들만 패키징하기 위해, 별도의 가상 환경을 만들어 줍니다.
### virtualenv 라이브러리 설치
$ pip install virtualenv
### 가상환경 생성
$ virtualenv ~/venv_awscli
### 가상환경 실행
$ source ~/venv_awscli/bin/activateAWS 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이대로 Lambda Layer 패키지를 적용하게 되면, Lambda 함수는 aws 실행파일을 인지하지 못합니다.
기존 'aws' 실행파일 첫 줄에 있는 인터프리터 경로(/usr/bin/python)을 Python 인터프리터 경로(/var/lang/bin/python)로 수정해주어야 합니다.
$ sed -i "1s/.*/\#\!\/var\/lang\/bin\/python/" ~/lambda_dir/awsLambda Layer에 라이브러리를 업로드하려면 zip 파일로 묶어주어야 합니다.
$ zip -r awscli-lambda-layer.zip ~/lambda_dir/*그리고 나서 AWS 웹콘솔을 통해 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를 적용하지 않고 함수 테스트를 실행하여 결과를 보겠습니다.
-> 현재 Lambda 함수에는 아무런 Layer도 적용되어있지 않기 때문에, 해당 코드를 실행하면 아래와 같이 'aws' 명령어를 찾지 못하는 에러가 발생합니다.
이제 Lambda Layer를 적용하고 테스트를 해보겠습니다.
-> 위에서 생성한 Layer를 함수에 추가하고 다시 테스트를 수행합니다.
-> 저희가 패키징한 AWS CLI 라이브러리가 잘 적용되어, 'aws' 명령을 잘 수행하였습니다.
이로써 저희는 aws s3 sync와 같이 boto3에서 실행 불가능한 명령을 AWS CLI를 통해 Lambda에서 실행할 수 있게 되었습니다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.