sparse-intern-71089
07/21/2021, 11:43 PMbored-table-20691
07/22/2021, 12:05 AMbusy-journalist-6936
07/22/2021, 3:31 AMbusy-journalist-6936
07/22/2021, 4:38 AMconst 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(cluster.kubeconfig),
serverSideEncryption: "aws:kms",
});busy-journalist-6936
07/22/2021, 4:52 AMconst 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",
});busy-journalist-6936
07/22/2021, 5:40 AMindex.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], finallysteep-toddler-94095
07/22/2021, 6:52 AMcluster.kubeconfig is type Output<any> but StringAsset takes in a string or Promise<string>. Your problem is that of incompatible types.
One way to solve this is:
const keksAdminBucketObject = eksCluster.kubeconfig.apply(
(config) =>
new BucketObject("keksAdminBucketObject", {
key: "kubeconfig",
bucket: keksAdminBucket.id,
source: new StringAsset(config),
serverSideEncryption: "aws:kms",
})
)
by calling apply on kubeconfig, you are able to interact with its value as a string instead of Output<string> within the callback function (with the config variable). The caveat now is that keksAdminBucketObject becomes a Output<BucketObject> instead of a BucketObject so if you ever want to reference values from keksAdminBucketObject you'll need to do the same apply trick.
It's generally not advised to create cloud resources within an apply, but sometimes it's sort of the only way. In your case, I don't know of a better way to do it.steep-toddler-94095
07/22/2021, 6:55 AMbusy-journalist-6936
07/22/2021, 2:30 PMbusy-journalist-6936
07/22/2021, 2:31 PMconst keksAdminBucket = new aws.s3.Bucket("keksAdminBucket")
const keksAdminBucketObject = cluster.kubeconfig.apply(
(config) =>
new aws.s3.BucketObject("keksAdminBucketObject", {
key: "kubeconfig",
bucket: keksAdminBucket.id,
source: new pulumi.asset.StringAsset(config),
serverSideEncryption: "aws:kms",
})
)
And for the technical question, I took your example, adjusted for a few errors, and now I'm down to this one:
pulumi:pulumi:Stack KongOnEKS-KongOnEKS running error: Error: failed to register new resource keksAdminBucketObject [aws:s3/bucketObject:BucketObject]: 2 UNKNOWN: unexpected asset text of type map[string]interface {}busy-journalist-6936
07/22/2021, 4:43 PMconst keksAdminBucket = new aws.s3.Bucket("keksAdminBucket", {acl: "private"});
const keksAdminBucketObject = new aws.s3.BucketObject("keksAdminBucketObject", {
key: "kubeconfig",
bucket: keksAdminBucket.id,
source: cluster.kubeconfig.apply(s => new pulumi.asset.StringAsset(String(s))),
serverSideEncryption: "aws:kms",
});steep-toddler-94095
07/22/2021, 4:45 PMconfig was a string, but it's actually an Object. Use the same code I gave you, but change the source line to
source: new StringAsset(JSON.stringify(config)),busy-journalist-6936
07/22/2021, 4:46 PMbusy-journalist-6936
07/22/2021, 4:48 PMbusy-journalist-6936
07/22/2021, 4:48 PMconst keksAdminBucket = new aws.s3.Bucket("keksAdminBucket", {acl: "private"});
const keksAdminBucketObject = cluster.kubeconfig.apply(
(config) =>
new aws.s3.BucketObject("keksAdminBucketObject", {
key: "kubeconfig",
bucket: keksAdminBucket.id,
source: new pulumi.asset.StringAsset(JSON.stringify(config)),
serverSideEncryption: "aws:kms",
})
)busy-journalist-6936
07/22/2021, 4:49 PMbusy-journalist-6936
07/22/2021, 4:49 PM