busy-journalist-6936
07/21/2021, 11:43 PMbored-table-20691
07/22/2021, 12:05 AMbusy-journalist-6936
07/22/2021, 3:31 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",
});
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
steep-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.busy-journalist-6936
07/22/2021, 2:30 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 {}
const 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 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",
})
)