AWS CDK Python에서 작업하기 - AWS Cloud Development Kit (AWS CDK) v2

AWS CDK v2 개발자 안내서입니다. 구형 CDK v1은 2022년 6월 1일에 유지 보수에 들어갔고 2023년 6월 1일에 지원이 종료되었습니다.

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

AWS CDK Python에서 작업하기

Python은 에서 완전히 지원되는 클라이언트 AWS Cloud Development Kit (AWS CDK) 언어이며 안정적인 것으로 간주됩니다. Python으로 작업하면 AWS CDK 표준 Python 구현 (CPython), 가상 환경, Python 패키지 설치 프로그램 pip 등 친숙한 도구가 사용됩니다. virtualenv AWS 구성 라이브러리를 구성하는 모듈은 pypi.org를 통해 배포됩니다. Python 버전의 이벤트는 Python 스타일 식별자 (예: 메서드 이름) 를 사용합니다. AWS CDK snake_case

모든 에디터나 IDE를 사용할 수 있습니다. 많은 AWS CDK 개발자들이 공식 확장 프로그램을 통해 Python을 잘 지원하는 Visual Studio Code (또는 이에 상응하는 오픈 소스 VScodium) 를 사용합니다. Python에 포함된 IDLE 편집기는 시작하기에 충분합니다. 의 Python 모듈에는 유형 힌트가 있으며, 이는 유형 유효성 AWS CDK 검사를 지원하는 린팅 도구 또는 IDE에 유용합니다.

Python 시작하기

를 사용하려면 AWS 계정과 자격 증명이 있어야 AWS CDK하며 Node.js 및 툴킷이 설치되어 있어야 합니다. AWS CDK 시작하기 AWS CDK를 참조하세요.

파이썬 AWS CDK 응용 프로그램에는 Python 3.6 이상이 필요합니다. 아직 설치하지 않았다면 python.org에서 운영 체제와 호환되는 버전을 다운로드하십시오. Linux를 실행하는 경우 시스템에 호환되는 버전이 설치되어 있거나 배포판의 패키지 관리자 (yum, apt 등) 를 사용하여 설치할 수 있습니다. Mac 사용자는 macOS용 리눅스 스타일 패키지 관리자인 Homebrew에 관심이 있을 수 있습니다.

참고

타사 언어 지원 중단: 언어 버전은 공급업체 또는 커뮤니티에서 EOL (End Of Life) 을 공유할 때까지만 지원되며 사전 통지로 변경될 수 있습니다.

Python 패키지 설치 프로그램과 가상 환경 관리자도 필요합니다. pip virtualenv 호환되는 Python 버전의 Windows 설치에는 다음과 같은 도구가 포함됩니다. Linux에서는 pip 패키지 관리자에 별도의 패키지로 virtualenv 제공될 수 있습니다. 또는 다음 명령을 사용하여 설치할 수도 있습니다.

python -m ensurepip --upgrade python -m pip install --upgrade pip python -m pip install --upgrade virtualenv

권한 오류가 발생하는 경우 --user 플래그를 사용하여 위 명령을 실행하여 모듈이 사용자 디렉토리에 설치되도록 하거나 를 사용하여 sudo 모듈을 시스템 전체에 설치할 수 있는 권한을 얻으십시오.

참고

리눅스 배포판은 Python 3.x의 실행 파일 이름을 사용하고 python3 Python 2.x 설치를 python 참조하는 것이 일반적입니다. 일부 배포판에는 python 명령이 Python 3을 참조하도록 하는 설치 가능한 선택적 패키지가 있습니다. 그렇지 않으면 프로젝트의 메인 cdk.json 디렉터리에서 편집하여 애플리케이션을 실행하는 데 사용되는 명령을 조정할 수 있습니다.

참고

Windows에서는 py 실행 파일인 Windows용 >Python 런처를 사용하여 Python (및pip) 을 호출할 수 있습니다. 무엇보다도 런처를 사용하면 사용하려는 설치된 Python 버전을 쉽게 지정할 수 있습니다.

Windows 버전의 Python을 설치한 후에도 명령줄에 입력하여 python Windows Store에서 Python을 설치하라는 메시지가 표시되면 Windows의 앱 실행 별칭 관리 설정 패널을 열고 Python용 앱 설치 프로그램 항목 두 개를 끄십시오.

프로젝트 생성

빈 디렉터리에서 cdk init 호출하여 새 AWS CDK 프로젝트를 생성합니다. --language옵션을 사용하고 다음을 지정합니다python.

mkdir my-project cd my-project cdk init app --language python

cdk init프로젝트 폴더 이름을 사용하여 클래스, 하위 폴더, 파일 등 프로젝트의 다양한 요소에 이름을 지정합니다. 폴더 이름의 하이픈은 밑줄로 변환됩니다. 하지만 이름은 Python 식별자의 형식을 따라야 합니다. 예를 들어, 숫자로 시작하거나 공백을 포함해서는 안 됩니다.

새 프로젝트를 사용하려면 해당 가상 환경을 활성화하세요. 이렇게 하면 프로젝트의 종속성을 전역적으로 설치하는 대신 프로젝트 폴더에 로컬로 설치할 수 있습니다.

source .venv/bin/activate
참고

이를 Mac/Linux 명령으로 인식하여 가상 환경을 활성화할 수 있습니다. Python 템플릿에는 Windows에서 동일한 명령을 사용할 수 있도록 하는 배치 파일인 source.bat가 포함되어 있습니다. 기존 Windows .\venv\Scripts\activate 명령어인, 도 작동합니다.

CDK Toolkit v1.70.0 또는 이전 버전을 사용하여 AWS CDK 프로젝트를 초기화한 경우 가상 환경이 대신 디렉터리에 있습니다. .env .venv

중요

작업을 시작할 때마다 프로젝트의 가상 환경을 활성화하십시오. 그렇지 않으면 거기에 설치된 모듈에 액세스할 수 없으며 설치한 모듈은 Python 글로벌 모듈 디렉터리로 이동합니다 (또는 권한 오류가 발생합니다).

가상 환경을 처음 활성화한 후 앱의 표준 종속 항목을 설치하세요.

python -m pip install -r requirements.txt

AWS 구성 라이브러리 모듈 관리

Python 패키지 설치 프로그램을 사용하여 필요한 다른 패키지뿐 아니라 앱에서 사용할 수 있도록 AWS Construct Library 모듈을 설치하고 업데이트하십시오. pip pip또한 해당 모듈의 종속 항목을 자동으로 설치합니다. 시스템이 독립형 pip 명령으로 인식되지 않는 경우 다음과 pip 같이 Python 모듈로 호출하십시오.

python -m pip PIP-COMMAND

대부분의 AWS CDK 구문은 안에 있습니다. aws-cdk-lib 실험 모듈은 와 같은 aws-cdk.SERVICE-NAME.alpha 이름을 가진 별도의 모듈에 있습니다. 서비스 이름에는 aws 접두사가 포함됩니다. 모듈 이름이 확실하지 않은 경우 PyPI에서 검색하세요. 예를 들어, 아래 명령은 라이브러리를 설치합니다. AWS CodeStar

python -m pip install aws-cdk.aws-codestar-alpha

일부 서비스의 구조는 둘 이상의 네임스페이스에 있습니다. 예를 들어, 이외에도aws-cdk.aws-route53, 및 라는 aws-route53-targets 이름의 Amazon Route 53 네임스페이스가 세 개 더 있습니다. aws-route53-patterns aws-route53resolver

참고

CDK API 레퍼런스의 Python 에디션에도 패키지 이름이 나와 있습니다.

AWS Construct Library 모듈을 Python 코드로 가져오는 데 사용되는 이름은 다음과 같습니다.

import aws_cdk.aws_s3 as s3 import aws_cdk.aws_lambda as lambda_

응용 프로그램에서 AWS CDK 클래스와 AWS Construct Library 모듈을 가져올 때는 다음 방법을 따르는 것이 좋습니다. 이 가이드라인을 따르면 코드를 다른 AWS CDK 응용 프로그램과 일관되게 작성할 수 있을 뿐만 아니라 이해하기 쉽게 만들 수 있습니다.

  • 일반적으로 최상위 수준에서 aws_cdk 개별 클래스를 가져옵니다.

    from aws_cdk import App, Construct
  • 에서 많은 클래스가 필요한 경우 개별 aws_cdk 클래스를 가져오는 cdk 대신 의 네임스페이스 별칭을 사용할 수 있습니다. 둘 다 하지 마세요.

    import aws_cdk as cdk
  • 일반적으로 짧은 네임스페이스 별칭을 사용하여 AWS Construct Libraries를 가져오세요.

    import aws_cdk.aws_s3 as s3

모듈을 설치한 후 프로젝트 파일을 업데이트하세요. 이 requirements.txt 파일에는 프로젝트의 종속성이 나열되어 있습니다. 를 사용하는 pip freeze 것보다 수동으로 수행하는 것이 가장 좋습니다. pip freezePython 가상 환경에 설치된 모든 모듈의 현재 버전을 캡처합니다. 이는 다른 곳에서 실행할 프로젝트를 번들링할 때 유용할 수 있습니다.

하지만 일반적으로 최상위 종속성 (앱이 직접 의존하는 모듈) 만 나열하고 해당 라이브러리의 종속성은 나열하지 않아야 합니다. requirements.txt 이 전략을 사용하면 종속성을 더 간단하게 업데이트할 수 있습니다.

업그레이드를 requirements.txt 허용하도록 편집할 수 있습니다. 호환성이 더 높은 버전으로 ~= 업그레이드하려면 == 앞의 버전 번호를 로 바꾸거나 버전 요구 사항을 완전히 제거하여 사용 가능한 최신 모듈 버전을 지정할 수 있습니다.

업그레이드가 가능하도록 적절하게 requirements.txt 편집한 후에는 다음 명령을 실행하여 프로젝트에 설치된 모듈을 언제든지 업그레이드할 수 있습니다.

pip install --upgrade -r requirements.txt

에서 종속성 관리 Python

Python에서는 응용 프로그램이나 setup.py 구성 라이브러리에 종속성을 삽입하여 종속성을 지정합니다. requirements.txt 그런 다음 PIP 도구를 사용하여 종속성을 관리합니다. PIP는 다음 방법 중 하나로 호출됩니다.

pip command options python -m pip command options

python -m pip호출은 대부분의 시스템에서 pip 작동하므로 PIP 실행 파일이 시스템 경로에 있어야 합니다. pip작동하지 않으면 로 교체해 보세요. python -m pip

cdk init --language python 명령은 새 프로젝트를 위한 가상 환경을 만듭니다. 이렇게 하면 각 프로젝트에 고유한 버전의 종속성과 기본 requirements.txt 파일을 지정할 수 있습니다. 프로젝트 작업을 시작할 source .venv/bin/activate 때마다 이 가상 환경을 실행하여 활성화해야 합니다. Windows에서는 .\venv\Scripts\activate 대신 실행하십시오.

CDK 애플리케이션

다음은 예 requirements.txt 파일입니다. PIP에는 종속성 잠금 기능이 없으므로 다음과 같이 == 연산자를 사용하여 모든 종속성에 대해 정확한 버전을 지정하는 것이 좋습니다.

aws-cdk-lib==2.14.0 aws-cdk.aws-appsync-alpha==2.10.0a0

pip install 모듈을 설치해도 모듈이 자동으로 추가되지는 않습니다. requirements.txt 직접 해야 합니다. 종속 항목의 최신 버전으로 업그레이드하려면 에서 requirements.txt 버전 번호를 편집하십시오.

프로젝트 생성 또는 편집 후 프로젝트 종속성을 설치하거나 requirements.txt 업데이트하려면 다음을 실행하십시오.

python -m pip install -r requirements.txt
작은 정보

pip freeze 명령은 설치된 모든 종속성 버전을 텍스트 파일에 쓸 수 있는 형식으로 출력합니다. 와 함께 pip install -r 요구 사항 파일로 사용할 수 있습니다. 이 파일은 모든 종속성 (전이 종속성 포함) 을 테스트할 때 사용한 정확한 버전에 고정하는 데 편리합니다. 나중에 패키지를 업그레이드할 때 문제가 발생하지 않도록 하려면 freeze.txt (not) 와 같은 별도의 파일을 사용하십시오. requirements.txt 그런 다음 프로젝트의 종속성을 업그레이드할 때 다시 생성하세요.

서드파티 구성 라이브러리

라이브러리에서는 종속성이 지정되므로 setup.py 애플리케이션에서 패키지를 사용할 때 전이적 종속성이 자동으로 다운로드됩니다. 그렇지 않으면 패키지를 사용하려는 모든 애플리케이션이 종속성을 해당 패키지로 복사해야 합니다. requirements.txt 여기에 setup.py 예가 나와 있습니다.

from setuptools import setup setup( name='my-package', version='0.0.1', install_requires=[ 'aws-cdk-lib==2.14.0', ], ... )

개발용 패키지를 작업하려면 가상 환경을 만들거나 활성화한 후 다음 명령을 실행합니다.

python -m pip install -e .

PIP는 전이적 종속성을 자동으로 설치하지만 한 패키지의 복사본은 하나만 설치할 수 있습니다. 종속성 트리에서 가장 많이 지정된 버전이 선택되며, 설치되는 패키지 버전에 대한 최종 결정권은 항상 애플리케이션에 있습니다.

AWS CDK Python의 관용구

언어 충돌

Python에서 lambda 는 언어 키워드이므로 AWS Lambda 구성 라이브러리 모듈 또는 Lambda 함수의 이름으로 사용할 수 없습니다. 이러한 충돌에 대한 Python 규칙은 변수 이름에서와 lambda_ 같이 후행 밑줄을 사용하는 것입니다.

규칙에 따라 구문의 두 번째 인수에는 이름이 AWS CDK 지정됩니다. id 스택과 구문을 직접 작성할 때 매개 변수를 호출하면 객체의 고유 식별자를 반환하는 Python 내장 함수를 id id() “그림자”로 만듭니다. 이 함수는 자주 사용되지는 않지만, 예를 들어 구문에 이 함수가 필요할 경우 인수 이름을 바꾸세요. construct_id

인수 및 속성

모든 AWS Construct Library 클래스는 구문이 정의되는 범위 (구성 트리의 상위), id, props라는 세 가지 인수를 사용하여 인스턴스화됩니다. props는 구문이 생성하는 리소스를 구성하는 데 사용하는 키/값 쌍의 번들입니다. 다른 클래스와 메서드에서도 인수에 “속성 번들” 패턴을 사용합니다.

scopeid는 항상 키워드 인수가 아닌 위치 인수로 전달되어야 합니다. 구문이 scope 또는 id라는 속성을 허용하는 경우 이름이 변경되므로 scopeid는 항상 키워드 인수가 아닌 위치 인수로 전달되어야 합니다.

Python에서 props는 키워드 인자로 표현됩니다. 인수에 중첩된 데이터 구조가 포함된 경우 인스턴스화 시 자체 키워드 인수를 취하는 클래스를 사용하여 이러한 데이터 구조를 표현합니다. 구조화된 인수를 사용하는 다른 메서드 호출에도 동일한 패턴이 적용됩니다.

예를 들어, Amazon S3 버킷의 add_lifecycle_rule 메서드에서 transitions 속성은 Transition 인스턴스 목록입니다.

bucket.add_lifecycle_rule( transitions=[ Transition( storage_class=StorageClass.GLACIER, transition_after=Duration.days(10) ) ] )

클래스를 확장하거나 메서드를 재정의할 때 부모 클래스에서는 이해할 수 없는 추가 인수를 원하는 용도로 사용할 수 있습니다. 이 경우 관용구를 사용해도 상관없는 인수는 받아들이고, 키워드 전용 인수를 사용하여 원하는 인수를 받아들여야 합니다. **kwargs 부모 생성자나 오버라이드된 메서드를 호출할 때는 예상한 인수만 전달하세요 (대개 그냥). **kwargs 부모 클래스나 메서드가 예상하지 않은 인수를 전달하면 오류가 발생합니다.

class MyConstruct(Construct): def __init__(self, id, *, MyProperty=42, **kwargs): super().__init__(self, id, **kwargs) # ...

향후 릴리스에서 우연히 귀하의 재산에 사용한 이름을 가진 새 부동산이 AWS CDK 추가될 수 있습니다. 이렇게 해도 구문이나 메서드 사용자에게 기술적인 문제는 발생하지 않지만 (속성이 '체인' 위로 '전달되지 않기 때문에 부모 클래스나 오버라이드된 메서드는 단순히 디폴트 값을 사용함) 혼란을 야기할 수 있습니다. 속성의 이름을 지정하여 구문에 명확하게 속하도록 하면 이러한 잠재적 문제를 피할 수 있습니다. 새 속성이 많으면 해당 속성을 적절한 이름의 클래스로 묶어 단일 키워드 인수로 전달하십시오.

누락된 값

누락되거나 AWS CDK 정의되지 None 않은 값을 나타내는 데 사용됩니다. 를 사용하여 작업할 **kwargs 때는 속성이 제공되지 않은 경우 사전의 get() 메서드를 사용하여 기본값을 제공하십시오. 이 kwargs[...] 경우 값이 누락될 수 KeyError 있으므로 사용하지 마십시오.

encrypted = kwargs.get("encrypted") # None if no property "encrypted" exists encrypted = kwargs.get("encrypted", False) # specify default of False if property is missing

일부 AWS CDK 메서드 (예tryGetContext(): 런타임 컨텍스트 값 가져오기) 가 반환될 수 있으며None, 이 경우 명시적으로 확인해야 합니다.

인터페이스 사용

Python에는 다른 언어처럼 인터페이스 기능이 없지만 비슷한 추상 기본 클래스가 있습니다. (인터페이스에 익숙하지 않다면 Wikipedia에 대한 소개를 참고하세요.) TypeScript구현된 언어는 인터페이스를 제공하며, 구문 및 기타 AWS CDK 객체에는 특정 클래스로부터 상속되는 대신 특정 인터페이스를 준수하는 객체가 필요한 경우가 많습니다. AWS CDK 따라서 는 AWS CDK JSII 계층의 일부로 자체 인터페이스 기능을 제공합니다.

클래스가 특정 인터페이스를 구현한다는 것을 나타내려면 데코레이터를 사용하면 됩니다. @jsii.implements

from aws_cdk import IAspect, IConstruct import jsii @jsii.implements(IAspect) class MyAspect(): def visit(self, node: IConstruct) -> None: print("Visited", node.node.path)

타입에 대한 위험

Python은 모든 변수가 모든 유형의 값을 참조할 수 있는 동적 타이핑을 사용합니다. 매개 변수와 반환 값에는 유형으로 주석을 달 수 있지만 이는 “힌트”이므로 적용되지 않습니다. 즉, Python에서는 잘못된 유형의 값을 구문에 쉽게 전달할 수 AWS CDK 있습니다. 정적 형식 언어에서처럼 빌드 중에 형식 오류가 발생하는 대신 JSII 계층 (Python과 TypeScript 코어 사이를 변환) 이 예상치 못한 유형을 처리할 수 없을 때 런타임 오류가 발생할 수 있습니다. AWS CDK

경험상 Python 프로그래머가 범하는 유형 오류는 이러한 범주에 속하는 경향이 있습니다.

  • 구문에 컨테이너 (Python 목록 또는 사전) 가 필요한 경우 단일 값을 전달하거나 그 반대의 경우도 마찬가지입니다.

  • layer 1 (CfnXxxxxx) 구문과 관련된 유형의 값을 L2 또는 L3 구문에 전달하거나 그 반대로 전달합니다.

AWS CDK Python 모듈에는 유형 주석이 포함되어 있으므로 이를 지원하는 도구를 사용하여 유형을 쉽게 처리할 수 있습니다. 예를 들어 이러한 기능을 지원하는 IDE를 사용하지 않는 경우 빌드 프로세스의 한 PyCharm단계로 MyPy형식 유효성 검사기를 호출하는 것이 좋습니다. 유형 관련 오류에 대한 오류 메시지를 개선할 수 있는 런타임 유형 검사기도 있습니다.

합성 및 배포

AWS CDK 앱에 정의된 스택은 아래 명령을 사용하여 개별적으로 또는 함께 합성하고 배포할 수 있습니다. 일반적으로 프로젝트를 실행할 때는 프로젝트의 기본 디렉터리에 있어야 합니다.

  • cdk synth: 앱에 있는 하나 이상의 스택에서 AWS CloudFormation 템플릿을 합성합니다 AWS CDK .

  • cdk deploy: 앱에 있는 하나 이상의 스택으로 정의된 리소스를 에 배포합니다. AWS CDK AWS

단일 명령으로 합성하거나 배포할 여러 스택의 이름을 지정할 수 있습니다. 앱이 스택을 하나만 정의하는 경우 스택을 지정할 필요가 없습니다.

cdk synth # app defines single stack cdk deploy Happy Grumpy # app defines two or more stacks; two are deployed

와일드카드* (원하는 수의 문자) 및? 를 사용할 수도 있습니다. (임의의 단일 문자) 를 사용하여 패턴별로 스택을 식별할 수 있습니다. 와일드카드를 사용할 때는 패턴을 따옴표로 묶으십시오. 그렇지 않으면 셸이 툴킷으로 전달되기 전에 현재 디렉토리의 파일 이름으로 확장하려고 할 수 있습니다. AWS CDK

cdk synth "Stack?" # Stack1, StackA, etc. cdk deploy "*Stack" # PipeStack, LambdaStack, etc.
작은 정보

스택을 배포하기 전에 명시적으로 합성할 필요는 없습니다. 이 단계를 cdk deploy 수행하면 최신 코드가 배포되도록 할 수 있습니다.

명령의 전체 설명서를 보려면 을 참조하십시오. cdk AWS CDK 툴킷 (cdk명령)