AWS Cloud Development Kit (AWS CDK)のエスケープハッチを使用して、L2 および L3 構成の子オブジェクトを取得したいと考えています。
簡単な説明
3つのAWS CDK抽象化レイヤーがあります:
- L1 コンストラクトは、関連する AWS CloudFormation リソースタイプに対応した1 対1の関係になっています。これは、AWS CDK の最も基本的なコンストラクトレイヤーです。
- L2 コンストラクトは多数の L1 コンストラクトをラップすることができ、そのデフォルトの子オブジェクトは関連するリソースタイプの L1 コンストラクトです。その他の L1 構成子オブジェクトは、L2 子オブジェクトの指定されたプロパティに基づいてAWS CloudFormation テンプレートに合成されます。
- L3コンストラクトは AWS CDK 抽象化レイヤーの最高レベルであり、多くの L2および L1コンストラクトをラップできます。
詳細については、抽象化とエスケープハッチ」を参照してください。
解決策
AWS CDK エスケープハッチを使用して、L3 コンストラクトの Amazon Elastic Kubernetes Service (Amazon EKS) クラスターから子オブジェクトを取得します。
**注:**これらの手順では、Python プログラミング言語を使用します。手順は他のどのプログラミング言語でも同様です。お使いのプログラミング言語に合わせてコード構文を調整してください。
Python の L3コンストラクトを使用したAmazon EKS クラスターの例:
vpc = ec2.Vpc(self, "Vpc",
ip_addresses=ec2.IpAddresses.cidr("192.168.0.0/25")
)
eks_object = eks.Cluster(self, "HelloEKS",
version=eks.KubernetesVersion.V1_25,
vpc=vpc,
vpc_subnets=[ec2.SubnetSelection(subnet_type=ec2.SubnetType.PRIVATE_WITH_EGRESS)]
)
1. [node.find\ _all ()] 属性を使用して、Amazon EKS クラスター内の L3 コンストラクトのすべての子オブジェクトを取得します。
for child in eks_object.node.find_all():
print(child.node.id)
前述のコマンドを使用すると、L3 コンストラクトのすべての子 ID が出力されます。
プリントアウトの例:
HelloEKS
...
NodegroupDefaultCapacity
NodeGroupRole
...
2. L3 コンストラクトの子IDを出力したら、[node.find\ _child ()] 属性を使用して目的の子IDを取得します。
**重要:**必ず AWS コマンドラインインターフェイス (AWS CLI) コマンドをすべて確認し、[例] の文字列のすべてのインスタンスを自分の値に置き換えてください。例えば、[example\ _child\ _id] をターゲットの子ID に置き換えてください。
l2_nodeGroup = eks_object.node.find_child(example_child_id)
このコマンドの使用後、目的の子IDのL2コンストラクトが出力されます。
プリントアウトの例:
<aws_cdk.aws_eks.Nodegroup object at 0x7ffa9c7b2910>
**注:[**変数 [l2\ _NodeGroup] を使用して[Nodegroup] のプロパティ、属性、メソッドを呼び出して、関連するリソースを変更できます。
3. [node.find\ _all ()] 属性を使用して、L2 コンストラクトのすべての子オブジェクトを取得します。
for child in l2_nodeGroup.node.find_all():
print(child.node.id)
前述のコマンドを使用すると、L2 コンストラクトのすべての子 ID が出力されます。
プリントアウトの例:
NodegroupDefaultCapacity
NodeGroupRole
ImportNodeGroupRole
4. L2コンストラクトの子IDが出力された後、[node.find\ _child ()] 属性を使用して目的の子IDを取得します。
l2_nodeGroup_role = l2_nodeGroup.node.find_child(example_child_id)
print(l2_nodeGroup_role)
上記のコマンドを使用した後、L2 レイヤーのオブジェクトは [aws\ _IAM.Role] レベルで戻ります。
5. [aws\ _IAM.Role] レベルの場合は、次の [** node.default\ _child**] 属性を使用して L1 [CFnRole] コンストラクトオブジェクトにアクセスしてください。
l1_nodeGroup_role = l2_nodeGroup_role.node.default_child
print(l1_nodeGroup_role)
前述のコマンドを使用すると、L1 レイヤーのデフォルトの子が戻ります。
注: [node.find\ _all ()] または [** node.default\ _child**] を使用して子オブジェクトを取得する場合、そのコンストラクトの機能を使用して CloudFormation テンプレートの制御を強化できます。
それでも子オブジェクトを取得できなければ、AWS サポートに連絡するか、AWS CDK の問題についてGitHubウェブサイトで新しい問題を作成してください。
関連情報
CDK の上位レベルの構成と CloudFormation リソースの間にギャップがある場合、リソースプロパティ値をカスタマイズする方法を教えてください。