问题描述
我正在编写 IaC 以在 Amazon EKS + Pulumi 中部署 typescript。我使用 GitHub Actions 作为我的 CI/CD。
目前我可以通过我的管道使用 pulumi 创建 EKS 集群,没有问题,但我还没有想出一种干净的方法来获取生成的 kubeconfig。
我可以通过 frequently documented example 通过导出 cluster.kubeconfig 值然后执行堆栈输出 kubeconfig 子命令来获取 kubeconfig
# code snippet
export const kubeconfig = cluster.kubeconfig;
# command
pulumi stack output kubeconfig > kubeconfig.yml
作为当前的解决方法,我使用此方法在 github 操作中创建 kubeconfig 文件,然后使用 aws s3
cli 命令将文件上传到 s3。
我已经在我的 pulumi iac 中创建了一个带有 kms 加密的私有 s3 存储桶,并在我的 iac 中定义了 kubeconfig 输出。有没有办法编写我的 pulumi 打字稿代码,将输出直接推送到我的 s3 存储桶,而无需这些中间步骤?
UPDATE1:目前的最大努力使我:
const keksAdminBucket = new aws.s3.Bucket("keksAdminBucket",{acl: "private"});
const keksAdminBucketobject = new aws.s3.Bucketobject("keksAdminBucketobject",{
key: "kubeconfig",bucket: keksAdminBucket.id,source: new pulumi.asset.StringAsset(String(cluster.kubeconfig)),serverSideEncryption: "aws:kms",});
index.ts(45,42): error TS2345: Argument of type 'Output<any>' is not assignable to parameter of type 'string | Promise<string>'.
Type 'OutputInstance<any>' is not assignable to type 'string | Promise<string>'.
Type 'OutputInstance<any>' is missing the following properties from type 'Promise<string>': then,catch,[Symbol.toStringTag],finally
解决方法
您应该使用 apply
方法,因为 kubeconfig
是一个 Output<string>
(或 Output<any>
?),而不仅仅是一个 string
:
const keksAdminBucketObject = new aws.s3.BucketObject("keksAdminBucketObject",{
key: "kubeconfig",bucket: keksAdminBucket.id,source: cluster.kubeconfig.apply(s => new pulumi.asset.StringAsset(JSON.stringify(s))),serverSideEncryption: "aws:kms",});
了解有关输出的更多信息并在 docs 中应用。
,答案是:
const keksAdminBucket = new aws.s3.Bucket("keksAdminBucket",{acl: "private"});
const keksAdminBucketObject = cluster.kubeconfig.apply(
(config) =>
new aws.s3.BucketObject("keksAdminBucketObject",{
key: "kubeconfig",source: new pulumi.asset.StringAsset(JSON.stringify(config)),})
)
而且我对它的理解还不够充分,无法解释原因。