我学习了CDK Pipelines:AWS CDK 应用程序的持续交付教程,该教程概述了如何使用新的CodePipeline API创建自变异 CDK 管道。
本教程创建一个 CodePipeline,每次将更改推送到 master 分支时,都会自动从 GitHub 存储库检索 CDK 源代码。CDK 代码定义了一个 lambda,其中包含与 CDK 一起定义的打字稿处理程序。
对于我的用例,我想定义一个自变异 CodePipeline,每当我推送到包含应用程序源代码的第二个存储库时也会触发该代码管道。第二个存储库还将包含一个构建规范,它使用我的应用程序生成 Docker 映像并将该映像上传到 ECR。然后,新映像将在我的管道的应用程序阶段部署到 Fargate 集群。
我ApplicationBuild在 PublishAssets 阶段之后创建了一个阶段,其中包括一个 CodeBuild 项目。CodeBuild 项目从我的存储库中读取并构建/上传图像到 ECR;但是,我需要一种方法将此 CodeBuild 链接到管道的部署。我不清楚如何使用新的 cdk CodePipeline API 来执行此操作。
我有一个使用 JavaScript 构建的 AWS CDK 堆栈。堆栈有多个 lambda。其中大部分是用 JavaScript 编写的。我想在 python 中添加一个 lambda 。当我不导入外部依赖项时,python lambda 工作正常,但在安装它们时不理解。我尝试将软件包安装在一个package文件夹或一个python文件夹中,并按照这些文章的建议进行压缩,但没有成功:
https://docs.aws.amazon.com/lambda/latest/dg/python-package.html https://aws.amazon.com/premiumsupport/knowledge-center/lambda-import-module-error-python/
我收到的错误是"Unable to import module 'py1': No module named 'x'"
(x 指我尝试导入的任何包名称)
我的javascript CDK库代码是这样的:
// javascript lambda
new lambda.Function(this, 'lambda-js1', {
functionName: `js1`,
code: lambda.Code.fromAsset('assets/lambdajs'),
handler: 'js1.handler',
runtime: lambda.Runtime.NODEJS_14_X,
})
// python lambda
new lambda.Function(this, 'lambda-py1', {
functionName: `py1`,
code: lambda.Code.fromAsset('assets/lambdapy'),
handler: 'py1.handler',
runtime: lambda.Runtime.PYTHON_3_8,
})
Run Code Online (Sandbox Code Playgroud)
assets/lambdapy我在使用中安装了依赖项
pip install x
pip install --target ./package x
pip install -t …Run Code Online (Sandbox Code Playgroud) 我只是采用 Eventbridge ETL 设计模式,但在部署时它给了我这个错误:
\n[100%] 失败: docker login --username AWS --password-stdin https://315997497220.dkr.ecr.us-west-2.amazonaws.com退出,错误代码 1:
\n\n\n\xe2\x9d\x8c the-eventbridge-etl 失败:错误:无法发布一个或多个\nassets。请参阅上面的错误消息以获取更多信息。在\nObject.publishAssets\n(/home/mubashir/.nvm/versions/node/v16.3.0/lib/node_modules/aws-cdk/lib/util/asset-publishing.ts:25:11)\nat processTicksAndRejections (节点:内部/进程/task_queues:96:5)\ nat Object.deployStack \ n(/home/mubashir/.nvm/versions/node/v16.3.0/lib/node_modules/aws-cdk/lib/api/deploy- stack.ts:237:3)\nat CdkToolkit.deploy\n(/home/mubashir/.nvm/versions/node/v16.3.0/lib/node_modules/aws-cdk/lib/cdk-toolkit.ts:194: 24)\nat initCommandLine\n(/home/mubashir/.nvm/versions/node/v16.3.0/lib/node_modules/aws-cdk/bin/cdk.ts:267:9)\n无法发布一项或多项资产。请参阅上面的错误消息以了解\n更多信息。
\n
我采取的步骤。Github 仓库有一个我关注的视频
\nnpx cdkp init the-eventbridge-etl --lang=python\ncd the-eventbridge-etl\npython3 -m venv .env\nsource .env/bin/activate\npip install -r requirements.txt\ncdk synth\ncdk deploy\nRun Code Online (Sandbox Code Playgroud)\n我收到的第一个错误与引导有关。所以我引导。
\nexport CDK_NEW_BOOTSTRAP=1\nnpx cdk bootstrap aws://315997497220/us-east-2 --cloudformation-execution-policies arn:aws:iam::aws:policy/AdministratorAccess --trust 315997497220 aws://315997497220/us-east-2\nRun Code Online (Sandbox Code Playgroud)\n我自然地更新了 cdk.json 文件以使用上述引导技术。我已经尝试了所有引导技术,无论是否带有限定符,以及随后对 cdk.json 的更改。我不认为这是引导程序问题。
\n我收到上述错误,但我不知道问题是什么。我没有对代码进行任何更改。
\n我有一个使用 CDK 开发的架构,其中包含 S3 存储桶和事件通知,该通知将针对每个上传到 S3 的文件向 SQS 发送一条消息。
效果很好。
现在我正在尝试激活加密,并且我有以下内容:
所以我假设缺少一些权限,但我不知道如何修复它。
我是否需要向 SQS 添加缺少的权限才能从 S3 读取数据?或者 S3 是否有权将消息发送到加密的 SQS?
尝试使用 AWS CDK 部署 Gatsby 站点,但 BucketDeployment 始终失败,并显示错误消息:
CREATE_FAILED | Custom::CDKBucketDeployment | DeploySiteCustomResourceE47C9748 Received response status [FAILED] from custom resource. Message returned: Command '['/opt/awscli/aws', 's3', 'cp', 's3://cdk-xxxXXXXX-assets-xxx/assets/xxxXXXXXXXX.zip', '/tmp/tmpXXX/XXXXX']' died with <Signals.SIGKILL: 9>
Run Code Online (Sandbox Code Playgroud)
文件大小仅为 163MB,因此不会超过 500MB 的限制。
使用 gatsby-plugin-s3 我得到一个错误,指出该站点有超过 50 条路由规则。
如何使用 CDK 解决这个问题?我尝试过使用网站重定向位置,但这也不起作用。
桶部署
CREATE_FAILED | Custom::CDKBucketDeployment | DeploySiteCustomResourceE47C9748 Received response status [FAILED] from custom resource. Message returned: Command '['/opt/awscli/aws', 's3', 'cp', 's3://cdk-xxxXXXXX-assets-xxx/assets/xxxXXXXXXXX.zip', '/tmp/tmpXXX/XXXXX']' died with <Signals.SIGKILL: 9>
Run Code Online (Sandbox Code Playgroud) 我有一个 CDK 项目,它创建一个在 ECS 上部署应用程序的 CodePipeline。我之前一切都正常,但 VPC 使用 NAT 网关,这最终导致成本太高。所以现在我尝试在不需要 NAT 网关的情况下重新创建该项目。我快要完成了,但现在当 ECS 服务尝试启动任务时遇到了问题。所有任务都无法启动,并出现以下错误:
ResourceInitializationError: unable to pull secrets or registry auth: execution resource retrieval failed: unable to retrieve secret from asm: service call has been retried 5 time(s): failed to fetch secret
Run Code Online (Sandbox Code Playgroud)
此时,我已经忘记了我尝试过的不同事情,但我将在这里发布相关内容以及我的一些尝试。
ResourceInitializationError: unable to pull secrets or registry auth: execution resource retrieval failed: unable to retrieve secret from asm: service call has been retried 5 time(s): failed to fetch secret
Run Code Online (Sandbox Code Playgroud)
我在某处读到,它可能与 Fargate 版本 1.4.0 与 1.3.0 有关,但我不确定需要更改什么才能允许任务访问它们需要运行的内容。
默认 API 网关响应采用以下形式:{"message":$context.error.messageString}。通过控制台更改此模板,"error"例如将其包装在对象中,效果很好。但是,当我在 CDK 中尝试时,在部署过程中出现错误Invalid mapping expression specified
代码(注意这实际上是默认模板):
webServiceApi.addGatewayResponse('4XX', {
type: apigw.ResponseType.DEFAULT_4XX,
responseHeaders: COMMON_HEADERS,
templates: {
'application/json': '{"message":$context.error.messageString}',
},
});
Run Code Online (Sandbox Code Playgroud)
任何更改都会发生这种情况,包括我能找到的所有 AWS 编写的示例。AWS 中的各个地方都没有充分记录:CDK、SDK、API Gateway 和 CloudFormation,因此我很难找出那里出了什么问题?
云形成错误
Resource handler returned message: "Invalid mapping expression specified: Validation Result: warnings : [], errors : [Invalid mapping expression specified: *] (Service: ApiGateway, Status Code: 400, Request ID: [TRUNCATED], Extended Request ID: null)" (RequestToken: [TRUNCATED], HandlerErrorCode: InvalidRequest)
Run Code Online (Sandbox Code Playgroud) amazon-web-services aws-cloudformation aws-lambda aws-api-gateway aws-cdk
我想自动安装EFS到我EC2 instance使用的 AWS CDK。
我创建了文件系统:
self.file_system = efs.FileSystem(
scope=self,
id="Efs",
vpc=self.vpc,
file_system_name="EFS",
removal_policy=RemovalPolicy.DESTROY,
)
Run Code Online (Sandbox Code Playgroud)
和 EC2 实例:
self.ec2_instance = ec2.Instance(
scope=self,
id="ec2Instance",
instance_name="my_ec2_instance",
instance_type=ec2.InstanceType.of(
instance_class=ec2.InstanceClass.BURSTABLE2,
instance_size=ec2.InstanceSize.MICRO,
),
machine_image=ec2.AmazonLinuxImage(
generation=ec2.AmazonLinuxGeneration.AMAZON_LINUX_2
),
vpc=self.vpc,
vpc_subnets=ec2.SubnetSelection(subnet_type=ec2.SubnetType.PUBLIC),
key_name="ec2-key-pair",
security_group=ec2_security_group,
)
Run Code Online (Sandbox Code Playgroud)
现在我需要做什么才能将它们连接起来?我看到很多在控制台上执行此操作的示例,但到目前为止我还没有找到在 AWS CDK 中执行此操作的方法。
我可以像这样创建一个具有跨帐户委托的新托管区域
const parentZone = new route53.PublicHostedZone(this, 'HostedZone', {
zoneName: 'someexample.com',
crossAccountZoneDelegationPrincipal: new iam.AccountPrincipal('12345678901'),
crossAccountZoneDelegationRoleName: 'MyDelegationRole',
});
Run Code Online (Sandbox Code Playgroud)
这非常简单。但是如果托管区域已经存在怎么办
const parentHostedZone = route53.PublicHostedZone.fromLookup(this, 'HostedZone', {
domainName: 'someexample.com',
})
Run Code Online (Sandbox Code Playgroud)
如何向该区域添加委托?
我正在将 CDK 包的相对路径导入切换为绝对路径导入,并在运行时出现此错误cdk synth:
$ cdk synth
Error: Cannot find module 'lib/CodePipelineStack'
Run Code Online (Sandbox Code Playgroud)
我按照此方法使用打字稿中的绝对路径进行导入以设置文件中的baseUrl和。pathstsconfig.json
不知道为什么它不起作用。
我的项目结构如下所示:
我的 tsconfig.json 是:
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"bin/*": [ "./bin/*" ],
"lib/*": [ "./lib/*" ],
"test/*": [ "./test/*" ]
},
"target": "ES2018",
"module": "commonjs",
"lib": [
"es2018"
],
"declaration": true,
"strict": true,
"noImplicitAny": true,
"strictNullChecks": true,
"noImplicitThis": true,
"alwaysStrict": true,
"noUnusedLocals": false,
"noUnusedParameters": false,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": false,
"inlineSourceMap": true,
"inlineSources": true,
"experimentalDecorators": …Run Code Online (Sandbox Code Playgroud) aws-cdk ×10
amazon-s3 ×2
aws-lambda ×2
python ×2
amazon-ec2 ×1
amazon-ecs ×1
amazon-kms ×1
amazon-sqs ×1
amazon-vpc ×1
docker ×1
gatsby ×1
node.js ×1
typescript ×1