>백엔드 개발 >파이썬 튜토리얼 >코드를 재사용 가능한 AWS Lambda 레이어로 작성, 디버그 및 배포하십시오.

코드를 재사용 가능한 AWS Lambda 레이어로 작성, 디버그 및 배포하십시오.

DDD
DDD원래의
2025-01-30 00:23:09157검색
aws 람다 레이어는 다른 람다와 코드를 재사용 할 수있는 좋은 방법입니다. 기존 PIP 패키지에 대한 레이어를 만드는 방법에 대한 많은 튜토리얼을 보았지만 자신의 코드로 수행하는 방법을 설명하고 Lambda와 함께 디버깅 할 수있는 많은 자습서를 보지 못했습니다. 내 시나리오에서는이 레이어를 사용하여 레이어와 여러 람다를 갖고 AWS 환경을 시뮬레이션하는 람다와 레이어의 코드를 디버깅 할 수 있습니다. 나는 당신이 이미 Template.yml로 만든 Lambda 함수를 가지고 있다고 가정합니다. 그렇지 않은 경우 Lambda https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html을 만드는 방법에 대한 다음 기사를 확인하십시오. 작성한 후 ZIP 파일로 다운로드하여 코드와 Template.yml을 추출 할 수 있습니다.

레이어 준비

먼저, 레이어의 폴더 구조를 설정해야합니다. 나는 레이어라는 폴더를 만들고 싶고 각 레이어마다 자체 폴더를 만듭니다. AWS Lambda는 레이어에 대한 특정 폴더 구조가 필요하며 각 계층의 코드는 파이썬/ 폴더에 있습니다. 자세한 내용은 다음 링크를 참조하십시오. https://docs.aws.amazon.com/lambda/latest/dg/packaging-layers.html 우리의 계층은 layer_utils라고합니다. 그런 다음 Python 폴더 내부에 폴더 Layer_utils를 넣고 내부에 Code와 함께 request_handler.py 및 processor.py 파일을 만듭니다. 또한 Python이 패키지로 인식하는 데 필요한 init 처럼 보이는 방식입니다

request_handler.py는 URL로 요청을 받고 라이브러리 요청을 사용하여 데이터를 가져 와서 반환 할 프로세서를 호출합니다. ./ Layers/Layer_utils/Python/Layer_Utils/Processor.py
./ Layers/Layer_utils/Python/Layer_utils/request_handler.py

layers/
└── layer_utils/
    └── python/
        ├── layer_utils/
        │   ├── __init__.py
        │   └── request_handler.py
        │   └── processor.py

여기서, 프로세서 import process_data 만 대신 layer_utils.processor import process_data에서 호출하여 프로세서 함수를 가져 오는 방법에 유의해야합니다. 절대 경로를 사용하면 나중에 가져 오기 오류를 피할 수 있습니다

레이어 포장

좋아, 이제 우리는 계층 코드를 만들었습니다. 그러나 우리는 아직 끝나지 않았습니다. 우리는 이제 Lambda 코드에서 사용할 수 있도록 PIP로 편집 가능한 패키지를 만들어야합니다. 우리는 PEP 660 스타일을 따라야합니다. 요구 사항 .txt 및 pyproject.toml의 두 파일을 만들어야합니다. 첫 번째에는이 레이어에 필요한 모든 외부 라이브러리가 포함됩니다. 두 번째는 PIP를 사용하여 편집 가능한 패키지를 만들고 모든 종속성이 설치되도록 해야하는 파일입니다. 이렇게하면 끊임없이 다시 포장 할 필요없이 레이어 코드를 편집 할 수 있습니다 (디버그해야합니다). 이것은 나무가 처럼 보이는 방식입니다 pyproject.toml은 PIP에서 우리의 레이어와 함께 패키지를 만드는 데 사용됩니다.
./ Layers/Layer_utils/Python/pyproject.toml

이 파일에서는 패키지를 만들려면 SetUptools 패키지가 필요하며 휠 패키지는 코드를 분산 형식으로 포장하는 데 사용됩니다. 요구 사항 .txt는 계층에 필요한 모든 외부 모듈을 나타냅니다. 우리의 경우 우리는 요청 모듈 만 필요하지만 필요한만큼 추가 할 수 있습니다.

./ Layers/Layer_Utils/Python/reamustry.txt
layers/
└── layer_utils/
    └── python/
        ├── layer_utils/
        │   ├── __init__.py
        │   └── request_handler.py
        │   └── processor.py

나는 AWS에서 직접 AWS Lambda 레이어 리소스를 호출하여 외부 패키지를 가져 오기 때문에 사용중인 패키지 버전을 추적하는 것이 중요하다고 생각합니다. SAM Local Invoke 또는 SAM Local Start-API를 사용하는 대신 Python 환경에서 직접 Lambda를 실행하여 시스템에서 직접 디버깅하는 경우 PIP에 설치된 로컬 패키지가 배포 된 것과 동일해야합니다. 레이어 패키지. 그에 대한 좋은 튜토리얼이 많기 때문에 외부 계층을 만드는 방법을 설명하지 않을 것입니다 (예 : https://www.keyq.cloud/en/blog/creating-an-aws lambda-layer-for- Python-Requests-Module ).

가상 환경 설정

이제 가상 환경을 만들어 봅시다. 이것은 필요하지 않지만 종속성을 분리하고 Python 환경이 Lambda가 사용할 환경과 일치하도록 권장합니다. 이렇게하려면 프로젝트의 콘솔에서 input

첫 번째는 Python이 -m venv와 함께 Venv 모듈을 실행하고 Venv라는 가상 환경을 만듭니다.

두 번째는 가상 환경 활성화 스크립트를 실행하는 내장 명령 소스를 호출하여 가상 환경을 활성화합니다. Visual Studio 코드를 사용하는 경우 가상 환경으로 전환하라는 메시지가 표시됩니다. 네 라고 말하다.
import requests

def process_data(url):
    """
    Fetches data from a URL.

    Args:
        url (str): The URL to fetch data from.

    Returns:
        str: The fetched content or an error message.
    """
    try:
        response = requests.get(url)
        response.raise_for_status()  # Raise an error for bad status codes
        return response.text[:200]  # Return the first 200 characters of the response
    except requests.RequestException as e:
        return f"Error fetching data: {str(e)}"
이 후에, 당신은 당신의 껍질에서 이런 것을 볼 수 있습니다.

.

처음의 (VENV)는 가상 환경에 있음을 나타냅니다.

때때로 SAM 도구 대신 Python 파일을 직접 실행하는 것을 디버깅하는 것을 좋아합니다 (빠르기 때문에). 이렇게하려면 가상 환경에 모든 외부 패키지를 설치하여 개발 및 디버깅을 위해 로컬로 사용할 수 있습니다.

이것은 SAM 도구없이 로컬 및 직접 디버그하는 데만 필요 하므로이 작업을 수행하지 않으면이 단계를 건너 뛸 수 있습니다.
우리는 이제 레이어를 패키지해야하므로 Lambda는 레이어를 파이썬 패키지로 찾을 수 있습니다.

from layer_utils.processor import process_data

def handle_request(request):
    """
    Handles an incoming request and processes it.

    Args:
        request (dict): The input request data.

    Returns:
        dict: The processed result.
    """
    # Example: Extract 'url' from the request and process it
    if "url" not in request:
        return {"error": "Missing 'data' in request"}

    data = request["url"]
    processed_result = process_data(data)
    return {"result": processed_result}
-e 플래그는 이것이 편집 가능한 패키지임을 나타냅니다. 경로는 pyproject.toml 파일의 위치를 ​​가리 킵니다. 이것을 실행하면 새로운 폴더 layer_utils.egg-info가 생성됩니다. 거기서 할 일이없고 그냥 남겨 두십시오.

디버깅

좋아, 이제 우리가 이것을 어떻게 디버그 할 것인지 봅시다. 이것은 레이어와 람다를 갖춘 내 폴더 구조입니다.


이것은 내 람다의 코드 <pre class="brush:php;toolbar:false">layers/ └── layer_utils/ └── python/ ├── layer_utils/ │ ├── __init__.py │ └── request_handler.py │ └── processor.py </pre>입니다 <p> <br> <the> 파일을 실행할 수 있고 오류없이 유효한 결과를 얻을 수 있습니다. <using> Pylance와 함께 Visual Studio Code를 사용하는 경우 코드가 작동하더라도 레이어 가져 오기가 해결되지 않을 수 있습니다. </using></the></p> <pre class="brush:php;toolbar:false">import requests def process_data(url): &quot;&quot;&quot; Fetches data from a URL. Args: url (str): The URL to fetch data from. Returns: str: The fetched content or an error message. &quot;&quot;&quot; try: response = requests.get(url) response.raise_for_status() # Raise an error for bad status codes return response.text[:200] # Return the first 200 characters of the response except requests.RequestException as e: return f&quot;Error fetching data: {str(e)}&quot; </pre> <p> 이를 해결하려면 작업 공간의 Settings.json을 편집 할 수 있습니다. Control/Command Shift P를 수행하고 환경 설정을 입력하십시오 : 작업 공간 설정 (JSON)을 열고 브래킷 내부에 다음을 추가하십시오 (더 많은 엑스트라 경로가있는 경우 경로를 추가하시면) </p>. <p> </p> <ance> 이제 Pylance는 이것을 잘 해결해야합니다. <p> <img src="https://img.php.cn/upload/article/000/000/000/173816779174617.png" alt="Pylance complaining on VSCode" loading="lazy" style="max-width:90%" style="max-width:90%"> 스택에 레이어를 추가합니다 </p> <to> 이제 Lambdas Template.yml에 레이어를 설정해야합니다. 우리는 리소스 내부에 다음을 추가해야합니다. 섹션 (프로젝트에 따라 콘텐츠를 적응) <p> ./ lambdas/mylambda/template.yml <br> </p> <pre class="brush:php;toolbar:false">from layer_utils.processor import process_data def handle_request(request): &quot;&quot;&quot; Handles an incoming request and processes it. Args: request (dict): The input request data. Returns: dict: The processed result. &quot;&quot;&quot; # Example: Extract 'url' from the request and process it if &quot;url&quot; not in request: return {&quot;error&quot;: &quot;Missing 'data' in request&quot;} data = request[&quot;url&quot;] processed_result = process_data(data) return {&quot;result&quot;: processed_result} </pre> <ur> condenturi에서는 레이어 코드가있는 상대 경로를 어떻게 지칭하는지 알 수 있습니다. AWS SAM 시스템이 Python 폴더를 찾을 것이기 때문에 Python 폴더를 가리키지 않는 방법을 확인하십시오. 런타임이 가상 환경과 LAMNBDA에서 사용하는 런타임과 일치하는지 확인하십시오. <p> 또한 파일의 람다 섹션의 레이어를 참조해야합니다. </p> <h2> <the> 템플릿 파일의 레이어 섹션에 이미 AWS에있는 요청 계층도 있습니다. 이것은 레이어를 로컬로 생성하므로 Sam은 읽어야한다는 것을 알게 될 것입니다. 또한 AWS 배포를 호출 할 때 마다이 레이어를 AWS에 배포합니다. </the> </h2> 샘과의 디버깅 <p> <this> 이것을 테스트합시다. 먼저 구축합시다. 템플릿에 소스 코드의 위치에 표시가 있기 때문에 템플릿을 다른 경로에서 구축하는 데 문제가있었습니다. 이를 피하려면 템플릿 파일의 경로에서 직접 빌드하는 것이 좋습니다. </this></p> <p> <all> 이것은 필요한 모든 종속성을 구축합니다. <strong> <inv> 이제 우리는 그것을 호출 할 수 있습니다. 람다를 테스트하기위한 이벤트 파일을 만들었습니다. ./ lambdas/mylambda/events/event.json <br> </inv></strong></all></p> <inv> 이제 디버깅을 위해 파일을 호출 할 수 있습니다. 이를 위해 Docker를 설치하고 실행해야한다는 것을 기억하십시오. 다시 말하지만, 템플릿 파일이있는 곳에서 이것을 호출해야합니다. <pre class="brush:php;toolbar:false">└── layer_utils └── python ├── layer_utils │ ├── __init__.py │ ├── processor.py │ └── request_handler.py ├── pyproject.toml └── requirements.txt </pre>. <p> <br> <oke> 이것은 template.yml에서 함수를 호출합니다. -D 플래그는 디버그 포트가 5678임을 나타냅니다. -E 플래그는 Lambda에 제출 될 이벤트 파일이 어디에 있는지 나타냅니다. <br><h2> 람다와 레이어를 AWS에 배포하십시오 </h2> <final> 이제 코드를 AWS에 배치하여이를 마무리합시다. <p> <br> </p> <u> -람다를 아직 배치하지 않은 경우 -유도 플래그는 프로세스에 도움이 될 수 있으므로 처음으로 사용할 수 있습니다. 이 작업을 마치면 AWS 콘솔로 가서 레이어를 찾을 수 있습니다. 이제 레이어의 ARN을 사용하여 다른 람다와 함께 레이어를 사용할 수 있습니다. <pre class="brush:php;toolbar:false">layers/ └── layer_utils/ └── python/ ├── layer_utils/ │ ├── __init__.py │ └── request_handler.py │ └── processor.py </pre> </u><p> </p> <p> VSCODE 설정 디버그 <img src="https://img.php.cn/upload/article/000/000/000/173816779293205.png" alt="The lambda layer on the AWS Console" loading="lazy" style="max-width:90%" style="max-width:90%"> <to> vscode를 사용하여 디버그, 브레이크 포인트 설정 등을 사용하려면 몇 가지 추가 단계를 수행해야합니다. </to></p> <add> 디버그 구성을 추가해야합니다. 이렇게하려면 Control/Command Shift P 및 유형 디버그 : 구성 추가 .... 런치 .JSON 파일이 열립니다. 구성을 추가해야합니다. <h2> </h2> ./. vscode/unker.json <p> </p> <p> <deb> 우리는 Sam Local Invoke에 부착 할 디버시를 사용하고 있으며, 여기서 -D 플래그로 호출 할 때 본 포트 5678을 설정합니다. Lambda 코드가있는 디렉토리를 가리키는지 확인하십시오. 더 많은 구성이있는 경우 구성 내부의 부품을 목록에 추가하십시오. </deb></p> <the> 우리는 디버시 라이브러리가 필요합니다. 먼저 요구 사항에 추가하겠습니다. ./ lambdas/mylambda/reimpings.txt <p> <strong> </strong> <install> 이제 pip 로 설치합시다 <br> </install></p> <also also> 또는 요구 사항을 통해 설치할 수도 있습니다 .txt 파일 <pre class="brush:php;toolbar:false">import requests def process_data(url): &quot;&quot;&quot; Fetches data from a URL. Args: url (str): The URL to fetch data from. Returns: str: The fetched content or an error message. &quot;&quot;&quot; try: response = requests.get(url) response.raise_for_status() # Raise an error for bad status codes return response.text[:200] # Return the first 200 characters of the response except requests.RequestException as e: return f&quot;Error fetching data: {str(e)}&quot; </pre> <p> <create> 우리는 AWS_SAM_LOCAL 환경 변수를 정의 할 수있는 환경 파일을 만들어야합니다. 작업 공간 폴더에서 파일 .env를 만듭니다. </create></p> <p> ./ </p> <p> <ine> 여기서 우리는 AWS_SAM_LOCAL을 정의하여 Lambda는 AWS SAM을 통해 로컬로 실행되고 있음을 알게됩니다. <strong> <to> 우리는 또한 파이썬 환경에 환경 파일의 환경 변수를 사용해야한다고 말해야합니다. 이것이 바로 </to></strong>처럼 보이는 방법입니다 ./. vscode/settings.json </ine></p> <pre class="brush:php;toolbar:false">from layer_utils.processor import process_data def handle_request(request): &quot;&quot;&quot; Handles an incoming request and processes it. Args: request (dict): The input request data. Returns: dict: The processed result. &quot;&quot;&quot; # Example: Extract 'url' from the request and process it if &quot;url&quot; not in request: return {&quot;error&quot;: &quot;Missing 'data' in request&quot;} data = request[&quot;url&quot;] processed_result = process_data(data) return {&quot;result&quot;: processed_result} </pre> <need> 마지막으로 Lambda 코드를 수정하여 로컬로 실행할 때 디버거에 첨부 해야하는 것을 알 수 있습니다. 파일의 시작 부분에서 다음 코드 <p>를 추가합니다. ./ lambdas/mylambda/src/lambda_function.py <br> </p> <pre class="brush:php;toolbar:false">└── layer_utils └── python ├── layer_utils │ ├── __init__.py │ ├── processor.py │ └── request_handler.py ├── pyproject.toml └── requirements.txt </pre> <inv inv> 이제 우리는 함수를 호출합니다 (다시 함수가있는 경로에서) : <p> <br> <ole> 콘솔이 디버거가 첨부 될 때까지 대기하는 것을 보여 주면 ... F5를 누르거나 Python Debugger : Debug를 선택하여 Debug를 선택하십시오. </ole></p> <pre class="brush:php;toolbar:false">[project] name = &quot;layer_utils&quot; version = &quot;0.1.0&quot; [build-system] requires = [&quot;setuptools&quot;, &quot;wheel&quot;] build-backend = &quot;setuptools.build_meta&quot; </pre> <are> 그리고 이제 당신은 로컬 레이어와 람다를 디버깅 할 준비가되었습니다! <p> </p></are></inv></need></also></the></add></final></oke></p></inv></ur></to></ance>

위 내용은 코드를 재사용 가능한 AWS Lambda 레이어로 작성, 디버그 및 배포하십시오.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:파이썬 정규 표현다음 기사:파이썬 정규 표현