首页 > 解决方案 > 使用 AWS CDK Python,如何创建子目录、导入 .py 并在其中调用方法?

问题描述

我试图获得使用 AWS CDK Python 创建 S3 存储桶的最简单示例,但没有运气。

我想将创建存储桶的代码放在另一个文件中(该文件存在于子目录中)。

我正在做的事情适用于我开发或开始的所有其他 Python 项目。

过程:

我创建了一个空目录: aws_cdk_python/. 然后,我在该目录中运行:
$cdk init --language python布局结构。

这创建了另一个具有相同名称的子目录aws_cdk_python/,并在该目录中创建了一个 .py,我可以开始在__init__(self)方法中添加代码(构造函数)

我能够在那里添加代码来创建一个 S3 存储桶。

现在我创建了一个子目录,其中包含一个__init__.py和一个名为: create_s3_bucket.py

我将用于在此文件中创建 S3 存储桶的代码放在名为“main”的方法中

file: create_s3_bucket.py

def main(self): 
    <code to create s3 bucket here>

当我运行代码时,它将创建没有错误的 App Stack,但不会创建 S3 存储桶。


这是我的项目布局:

    aws_cdk_python/
        setup.py
        aws_cdk_python/
            aws_cdk_python_stack.py
            my_aws_s3/
                create_s3_bucket.py

setup.py包含以下两行:

        package_dir={"": "aws_cdk_python"},
        packages=setuptools.find_packages(where="aws_cdk_python"),

这里的第二行说查看aws_cdk_python/目录,并在子文件夹中递归搜索 .py 文件

在 aws_cdk_python_stack.py 中,我有这一行:

from my_aws_s3.create_s3_bucket import CreateS3Bucket

然后在 中__init__ in aws_cdk_python_stack.py,我实例化对象: my_aws_s3 = CreateS3Bucket()

然后我像这样打电话:

my_aws_s3.main() <== 创建 S3 存储桶的代码在这里

find_packages()在使用in之前,我在许多 Python 项目中都遵循了这种模式setup.py

我也跑了: $python -m pip install -r requirements.txt这应该拿起指向的依赖项setup.py

问题: - 使用 AWS CDK Python 的任何人都这样做了吗?或者对代码组织有建议?

我不希望整个堆栈的所有代码都在aws_cdk_python_stack.py __init__()方法中。

这令人沮丧,它应该工作。

我有其他要在下面创建的子目录aws_cdk_python/aws_cdk_python/<dir>,放一个__init__.py(空文件)并在顶层导入类aws_cdk_python_stack.py

任何帮助来完成这项工作将不胜感激。


cdk.json看起来像这样(从cdk init --language python

{
  "app": "python app.py",
  "context": {
    "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true,
    "@aws-cdk/core:enableStackNameDuplicates": "true",
    "aws-cdk:enableDiffNoFail": "true",
    "@aws-cdk/core:stackRelativeExports": "true",
    "@aws-cdk/aws-ecr-assets:dockerIgnoreSupport": true,
    "@aws-cdk/aws-secretsmanager:parseOwnedSecretName": true,
    "@aws-cdk/aws-kms:defaultKeyPolicies": true,
    "@aws-cdk/aws-s3:grantWriteWithoutAcl": true,
    "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": true,
    "@aws-cdk/aws-rds:lowercaseDbIdentifier": true,
    "@aws-cdk/aws-efs:defaultEncryptionAtRest": true,
    "@aws-cdk/aws-lambda:recognizeVersionProps": true,
    "@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": true
  }
}

app.py看起来像这样

import os

from aws_cdk import core as cdk
from aws_cdk import core
from aws_cdk_python.aws_cdk_python_stack import AwsCdkPythonStack


app = core.App()
AwsCdkPythonStack(app, "AwsCdkPythonStack",
    )

app.synth()


迄今为止:星期二 2021-12-31,这还没有解决

标签: python-3.xsetuptoolsaws-cdksetup.pycode-organization

解决方案


不完全确定,但我想这取决于你的cdk.json文件是什么样子。它包含要运行的命令cdk deploy。例如:

{
  "app": "python main.py", <===== this guy over here assumes the whole app is instantiated by running main.py
  "context": {
   ...

  }
}

由于我没有在您的项目结构中看到此入口点,因此它可能与此有关。

通常在运行之后cdk init你至少应该能够合成。通常在 app.py 中,您将主App()定义和堆栈和构造放在子文件夹中。堆栈通常在其中实例化,app.py并且结构在堆栈定义文件中实例化。

我希望它对你有进一步的帮助!

编辑:

下面显示了一个工作树的示例:

aws_cdk_python
├── README.md
├── app.py
├── cdk.json
├── aws_cdk_python
│   ├── __init__.py
│   ├── example_stack.py
│   └── s3_stacks                     <= this is your subfolder with s3 stacks
│       ├── __init__.py
│       └── s3_stack_definition.py  <== file with an s3 stack in it
├── requirements.txt
├── setup.py
└── source.bat

aws_cdk_python/s3_stacks/s3_stack_definition.py:

from aws_cdk import core as cdk
from aws_cdk import aws_s3


class S3Stack(cdk.Stack):

    def __init__(self, scope: cdk.Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)
        bucket = aws_s3.Bucket(self, "MyEncryptedBucket",
                        encryption=aws_s3.BucketEncryption.KMS
            )

应用程序.py:

from aws_cdk import core

from aws_cdk_python.s3_stacks.s3_stack_definition import S3Stack


app = core.App()
S3Stack(app, "ExampleStack",
    )

app.synth()


推荐阅读