Python AWS CDK での の操作 - AWS Cloud Development Kit (AWS CDK) v2

これは AWS CDK v2 デベロッパーガイドです。古い CDK v1 は 2022 年 6 月 1 日にメンテナンスを開始し、2023 年 6 月 1 日にサポートを終了しました。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Python AWS CDK での の操作

Python は、 で完全にサポートされているクライアント言語であり AWS Cloud Development Kit (AWS CDK) 、安定していると見なされます。Python AWS CDK で を操作するには、標準の Python 実装 (CPython)、 を使用した仮想環境virtualenv、Python パッケージインストーラ など、使い慣れたツールを使用しますpip。 AWS コンストラクトライブラリを構成するモジュールは、pypi.org 経由で配布されます。の Python バージョンでは AWS CDK 、Python スタイルの識別子 (snake_caseメソッド名など) を使用します。

任意のエディタまたは IDE を使用できます。多くの AWS CDK デベロッパーは、Visual Studio Code (またはオープンソースの同等の VSCodium) を使用します。これは、公式の拡張機能 を介して Python を良好にサポートしています。開始するには、Python に含まれている IDLE エディタで十分です。の AWS CDK Python モジュールにはタイプヒントがあります。これは、型検証をサポートするリンティングツールまたは IDE に役立ちます。

Python の開始方法

を使用するには AWS CDK、 AWS アカウントと認証情報が必要で、Node.js と AWS CDK Toolkit がインストールされている必要があります。の開始方法 AWS CDK を参照してください。

Python AWS CDK アプリケーションには Python 3.6 以降が必要です。まだインストールしていない場合は、python.org からオペレーティングシステムの互換性のあるバージョンをダウンロードします。Linux を実行する場合、システムに互換性のあるバージョンが付属しているか、ディストリビューションのパッケージマネージャー (yumaptなど) を使用してインストールできます。Mac ユーザーは、macOS 用の Linux スタイルのパッケージマネージャーである Homebrew に興味があるかもしれません。

注記

サードパーティー言語の非推奨: 言語バージョンは、ベンダーまたはコミュニティによって共有される EOL (サポート終了) までのみサポートされ、事前通知により変更される可能性があります。

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を使用してモジュールをシステム全体でインストールするアクセス許可を取得します。

注記

Linux ディストリビューションでは、Python 3python3.x の実行ファイル名を使用することが一般的であり、Python 2.x のインストールpythonを参照しています。一部の Distros には、Python 3 を参照するようにpythonコマンドにインストールできるオプションのパッケージがあります。これを行わない場合は、プロジェクトのメインディレクトリcdk.jsonで を編集することで、アプリケーションの実行に使用するコマンドを調整できます。

注記

Windows では、実行可能ファイル >Windows 用の Python ランチャーを使用して py Python (および pip) を呼び出すことができます。 https://docs.python.org/3/using/windows.html#launcher特に、ランチャーを使用すると、使用するインストール済みバージョンの Python を簡単に指定できます。

コマンドラインpythonで と入力すると、Windows ストアから Python のインストールに関するメッセージが表示される場合、Python の Windows バージョンをインストールした後でも、Windows の「アプリ実行エイリアス管理設定パネル」を開き、Python の 2 つの App Installer エントリをオフにします。

「プロジェクトの作成」

空のディレクトリで を呼び出して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 パッケージインストーラー pipを使用して、アプリケーションで使用する AWS コンストラクトライブラリモジュール、および必要な他のパッケージをインストールおよび更新します。 pip は、それらのモジュールの依存関係も自動的にインストールします。システムがスタンドアロンコマンドpipとして認識しない場合は、次のように Python モジュールpipとして を呼び出します。

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、、、 という名前の Amazon Route 53 名前空間が aws-route53-targets3 つ追加されていますaws-route53-patternsaws-route53resolver

注記

CDK API リファレンスの Python エディションには、パッケージ名も表示されます。

Construct Library モジュールを AWS Python コードにインポートするために使用される名前は次のようになります。

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

アプリケーションに AWS CDK クラスと AWS コンストラクトライブラリモジュールをインポートするときは、次のプラクティスをお勧めします。これらのガイドラインに従うことで、コードが他の AWS CDK アプリケーションと一貫性を持ち、理解しやすくなります。

  • 通常、最上位の から個々のクラスをインポートしますaws_cdk

    from aws_cdk import App, Construct
  • から多数のクラスが必要な場合はaws_cdk、個々のクラスをインポートcdkする代わりに、 の名前空間エイリアスを使用できます。両方は避けてください。

    import aws_cdk as cdk
  • 通常、短い名前空間エイリアスを使用して AWS ライブラリの作成 をインポートします。

    import aws_cdk.aws_s3 as s3

モジュールをインストールしたら、プロジェクトの依存関係を一覧表示するプロジェクトの requirements.txt ファイルを更新します。これを行うのは、 を使用するのではなく、手動で行うのが最善ですpip freeze。 は、Python 仮想環境にインストールされているすべてのモジュールの最新バージョンをpip freezeキャプチャします。これは、プロジェクトをバンドルして他の場所で実行する場合に役立ちます。

ただし、通常、 requirements.txtは最上位の依存関係 (アプリケーションが直接依存するモジュール) のみをリストし、それらのライブラリの依存関係をリストしないでください。この戦略により、依存関係の更新が簡単になります。

を編集requirements.txtしてアップグレードを許可できます。==前述のバージョン番号を に置き換えて、互換性のある上位バージョンへのアップグレード~=を許可するか、バージョン要件を完全に削除して、利用可能な最新バージョンのモジュールを指定します。

アップグレードを許可するように適切にrequirements.txt編集された で、このコマンドを実行して、プロジェクトにインストールされているモジュールをいつでもアップグレードします。

pip install --upgrade -r requirements.txt

での依存関係の管理 Python

Python では、依存関係を指定するには、requirements.txtアプリケーションまたはコンストラクトライブラリsetup.pyに を入力します。その後、依存関係は 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 ( ではなく) など、別の ファイルを使用します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 は推移的な依存関係を自動的にインストールしますが、インストールできるパッケージのコピーは 1 つだけです。依存関係ツリーで最も高いバージョンが選択されます。アプリケーションには、インストールされるパッケージのバージョンが常に最後の単語になります。

AWS CDK Python の idioms

言語の競合

Python では、 lambdaは言語キーワードであるため、 AWS Lambda コンストラクトライブラリモジュールまたは Lambda 関数の名前として使用することはできません。このような競合の Python の規則では、lambda_変数名に のように末尾のアンダースコアを使用します。

慣例により、 AWS CDK コンストラクトの 2 番目の引数は という名前になりますid。独自のスタックとコンストラクトを記述するときは、Python 組み込み関数 をパラメータid「シャドウ」を呼び出しid()、オブジェクトの一意の識別子を返します。この関数はあまり使用されませんが、コンストラクトで必要になった場合は、 など、 引数の名前を変更しますconstruct_id

引数とプロパティ

すべての AWS Construct Library クラスは、3 つの引数を使用してインスタンス化されます。つまり、コンストラクトが定義されているスコープ (コンストラクトツリー内の親)、id props です。これは、コンストラクトが作成するリソースの設定に使用するキーと値のペアのバンドルです。他のクラスやメソッドでは、引数に「属性のバンドル」パターンも使用します。

scopeid は、常にキーワード引数ではなく位置引数として渡す必要があります。これは、コンストラクトが scope または id という名前のプロパティを受け入れると名前が変わるためです。

Python では、props はキーワード引数として表現されます。引数にネストされたデータ構造が含まれている場合、これらはインスタンス化時に独自のキーワード引数を取るクラスを使用して表現されます。同じパターンが、構造化引数を取る他のメソッド呼び出しに適用されます。

例えば、Amazon S3 バケットの add_lifecycle_ruleメソッドでは、 transitionsプロパティはTransitionインスタンスのリストです。

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

クラスを拡張したり、メソッドを上書きしたりする場合、親クラスでは理解できない独自の目的で追加の引数を受け入れることをお勧めします。この場合、**kwargsidiom の使用には関係ない引数を受け入れ、キーワードのみの引数を使用して関心のある引数を受け入れる必要があります。親のコンストラクタまたはオーバーライドされたメソッドを呼び出すときは、予期している引数のみを渡します (多くの場合、 のみ**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 オブジェクトには、特定のクラスから継承するのではなく、特定のインターフェイスに準拠するオブジェクトが必要になることがよくあります。そのため、 は JSII レイヤーの一部として独自のインターフェイス機能 AWS CDK を提供します。

クラスが特定のインターフェイスを実装していることを示すには、 デ@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 と AWS CDKの TypeScript コアの間で変換されます) が予期しない型に対応できない場合にランタイムエラーが発生することがあります。

経験上、Python プログラマーが行うタイプエラーは、これらのカテゴリに分類される傾向があります。

  • コンストラクトがコンテナ (Python リストまたはディクショナリ) を期待する単一の値を渡す、またはその逆。

  • レイヤー 1 (CfnXxxxxx) コンストラクトに関連付けられたタイプの値を L2 または L3 コンストラクトに、またはその逆に渡す。

AWS CDK Python モジュールには型注釈が含まれているため、それらをサポートするツールを使用して型をサポートできます。など、これらをサポートする IDE を使用していない場合はPyCharmMyPyタイプ検証をビルドプロセスのステップとして呼び出すことができます。タイプ関連のエラーのエラーメッセージを改善できるランタイムタイプチェッカーもあります。

合成とデプロイ

AWS CDK アプリケーションで定義されたスタックは、以下のコマンドを使用して個別に、または一緒に合成およびデプロイできます。通常、発行するときは、プロジェクトのメインディレクトリにある必要があります。

  • cdk synth: AWS CDK アプリケーション内の 1 つ以上のスタックから AWS CloudFormation テンプレートを合成します。

  • cdk deploy: AWS CDK アプリケーション内の 1 つ以上のスタックで定義されたリソースを にデプロイします AWS。

1 つのコマンドで合成またはデプロイする複数のスタックの名前を指定できます。アプリケーションが 1 つのスタックのみを定義している場合は、指定する必要はありません。

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

ワイルドカード * (任意の文字数) と ? (任意の 1 文字) を使用して、パターンでスタックを識別することもできます。ワイルドカードを使用する場合は、パターンを引用符で囲みます。それ以外の場合、シェルは AWS CDK Toolkit に渡される前に、現在のディレクトリ内のファイルの名前に拡張しようとすることがあります。

cdk synth "Stack?" # Stack1, StackA, etc. cdk deploy "*Stack" # PipeStack, LambdaStack, etc.
ヒント

スタックをデプロイする前に明示的に合成する必要はありません。 はこのステップcdk deployを実行して、最新のコードがデプロイされるようにします。

cdk コマンドの完全なドキュメントについては、「」を参照してくださいAWS CDK ツールキット (cdk コマンド)