python-3.x - 使用 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__()
方法中。
关于为什么我的 IDE 中没有显示错误的任何想法?解决了所有依赖项,找到了方法,但是当我运行时,什么也没有发生?
我怎么能看到任何错误消息,没有错误消息出现
$cdk deploy
,它只是创建堆栈,而不是 S3 存储桶,即使我有代码可以调用和创建 S3 存储桶。
这令人沮丧,它应该工作。
我有其他要在下面创建的子目录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,这还没有解决
解决方案
不完全确定,但我想这取决于你的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()
推荐阅读
- google-sheets-formula - Query Function not working in Google Sheets
- java - 未找到参数,需要 javafx.stage.Stage
- javascript - 如何制作 HTML 标头 (
- javascript - Chrome 扩展程序:单击扩展程序图标时转到站点
- javascript - 制作一个抓取特定 HTML 行的 Chrome 扩展程序,第一次编码
- safari - 由于 Content-Security-Policy 问题,Safari 无法从 blob 创建 Worker
- python - 包装器的 Genism 模块属性错误
- google-sheets - 如果单元格中的日期是今天,则清除单元格
- c# - “LoggerSinkConfiguration”不包含“调试”的定义
- java - 如何从 JSON Android/Java 动态获取值