AWS CDK 解析器
这个 AwsCdkResolver 能够解决任何 CfnOutput
由您的 AWS CDK 应用程序定义。 在这个例子中,我们创建一个S3 Bucket 与 AWS CDK 连接,并传递其( 所生成的部署时间)
名称为 Kubernetes 的环境变量 CronJob 资源.
import * as aws from 'aws-cdk-lib';
import * as k8s from 'cdk8s';
import * as kplus from 'cdk8s-plus-27';
import { AwsCdkResolver } from '@cdk8s/awscdk-resolver';
const awsApp = new aws.App();
const stack = new aws.Stack(awsApp, 'aws');
const k8sApp = new k8s.App({ resolvers: [new AwsCdkResolver()] });
const manifest = new k8s.Chart(k8sApp, 'Manifest');
const bucket = new aws.aws_s3.Bucket(stack, 'Bucket');
const bucketName = new aws.CfnOutput(stack, 'BucketName', {
value: bucket.bucketName,
});
new kplus.CronJob(manifest, 'CronJob', {
schedule: k8s.Cron.daily(),
containers: [{
image: 'job',
envVariables: {
// directly passing the value of the `CfnOutput` containing
// the deploy time bucket name
BUCKET_NAME: kplus.EnvValue.fromValue(bucketName.value),
}
}]
});
awsApp.synth();
k8sApp.synth();
在cdk8s合成过程中,自定义解析器会检测到 bucketName.value 这不是一个具体的价值,
但它是一个价值 CfnOutput然后它将执行AWS服务呼叫,以便获取
实际价值来自您账户中部署的基础设施。 这意味着,按照顺序
页:1 cdk8s synth 要成功,必须执行 之后 aWS CDK 资源
已经部署。 因此,你的部署工作流程(概念上)应该是:
cdk deploycdk8s synth
注意
AwsCdkResolver实值 仅限 能够获取具有CfnOutput为他们定义.
权限
自运行以来 cdk8s synth 现在需要执行AWS服务电话,它必须能够访问
到一组AWS证书。 全权证书必须允许下列一系列行动:
cloudformation:DescribeStacks
请注意,cdk8要求的行动比通常需要的行动要小得多
部署 AWS CDK 应用程序。 因此建议不重复使用同样的一套全权证书,
转而建立一个缩小范围 ReadOnly 用于 cdk8s 解析器的角色.
交叉仓库工作流程
正如我们所看到的,你的 cdk8s 应用程序需要访问您云应用程序中定义的对象。 如果两个申请
定义在同一文件中,这是微不足道的实现。 如果放在不同的文件里 很简单 import 说明就够了.
然而,如果这些应用程序在两个单独的储存库中管理,怎么办? 这使得它有点狡猾,但仍有可能.
在这种情况下, cdk.ts 在 AWS CDK 应用程序中,存储在一个专用寄存器中.
import * as aws from 'aws-cdk-lib';
const awsApp = new aws.App();
const stack = new aws.Stack(awsApp, 'aws');
const bucket = new aws.aws_s3.Bucket(stack, 'Bucket');
const bucketName = new aws.CfnOutput(stack, 'BucketName', {
value: bucket.bucketName,
});
awsApp.synth();
为了 cdk8s 应用程序具有交叉寄存器访问, 我们需要曝光 AWS CDK 对象实例
通过软件包寄存器。 为此,将 AWS CDK 应用程序分解为以下文件:
app.ts
import * as aws from 'aws-cdk-lib';
const awsApp = new aws.App();
const stack = new aws.Stack(awsApp, 'aws');
const bucket = new aws.aws_s3.Bucket(stack, 'Bucket');
// export the thing we want to have available for cdk8s applications
export const bucketName = new aws.CfnOutput(stack, 'BucketName', {
value: bucket.bucketName,
});
// note that we don't call awsApp.synth here
main.ts
import { awsApp } from './app.ts'
awsApp.synth();
现在,发表 app.ts 文件到软件包管理器,以便您 cdk8s 应用程序可以安装并导入.
这种方法可能有些反常, 因为通常我们只公布课程 给软件包管理者,
非实例。 实际上,这些类型的应用程序引入了一个新的使用案例,需要共享实例.
从概念上来说,这和写作状态没什么不同* 联合国 它允许我们留下
在我们的编程语言的边界, 和它的打字保证.
* 联合国 事实上,我们只是发布指令 获取状态,而不是国家本身.
假设 app.ts 发表于 my-cdk-app 包,我们 cdk8s 应用程序现在看起来是这样:
import * as k8s from 'cdk8s';
import * as kplus from 'cdk8s-plus-27';
// import the desired instance from the AWS CDK app.
import { bucketName } from 'my-cdk-app';
import { AwsCdkResolver } from '@cdk8s/awscdk-resolver';
const k8sApp = new k8s.App({ resolvers: [new AwsCdkResolver()] });
const manifest = new k8s.Chart(k8sApp, 'Manifest');
new kplus.CronJob(manifest, 'CronJob', {
schedule: k8s.Cron.daily(),
containers: [{
image: 'job',
envVariables: {
// directly passing the value of the `CfnOutput` containing
// the deploy time bucket name
BUCKET_NAME: kplus.EnvValue.fromValue(bucketName.value),
}
}]
});
k8sApp.synth();