-
-
Save lukehoban/b5ec07deb0cbfb1b6b020500dc6d5e05 to your computer and use it in GitHub Desktop.
import pulumi | |
import pulumi_aws as aws | |
from typing import Optional, Dict, Tuple | |
import asyncio | |
all_resources: Dict[Tuple[str, str], pulumi.Resource] = {} | |
def transform(args: pulumi.ResourceTransformationArgs) -> Optional[pulumi.ResourceTransformationResult]: | |
all_resources[(args.name, args.type_)] = args.resource | |
return None # do not actually modify the resource | |
pulumi.runtime.register_stack_transformation(transform) | |
async def get_resource(type: str, name: str, prop: str): | |
while True: | |
res = all_resources.get((name, type)) | |
if res is not None: | |
return res.__dict__[prop] | |
await asyncio.sleep(1000) | |
# User code | |
# ------------------------------------------------------------------------------- | |
aws.s3.BucketObject("o", bucket=get_resource("aws:s3/bucket:Bucket", "b", "id")) | |
aws.s3.Bucket("b") |
thank you for this! If I want to understand a bit more about what's going on under the hood there (specifically pulumi.runtime
and what a transformation does and why we need def transform
), where would I go?
I am struggling to find documentation on pulumi.runtime
. I was able to find https://www.pulumi.com/docs/reference/pkg/nodejs/pulumi/pulumi/runtime/#registerStackTransformation ... but (a) this is a NodeJS-specific doc and (b) even the NodeJs doc is short on concepts and explanation.
There are docs on transformations and specifically stack transformations used here at https://www.pulumi.com/docs/concepts/options/transformations/#stack-transformations.
This is a slight abuse of that feature, since we aren’t actually using it to transform the resource. But it’s a tool that is available today that can enable intercepting all resource construction calls.
Quite a few things that can be improved and cleaned up here. But this works as a PoC for using Pulumi without variables, and as a result, allowing out-of-order resource declarations.