Embedded functions are composition functions that you can build, package, and manage directly in your configuration. Instead of relying on a YAML-based patch-and-transform workflow, you can write composition logic in Python or configuration languages like KCL. Embedded functions allow for shared logic across multiple compositions within your configuration.
Some benefits of using embedded functions:
- Write configurations in familiar languages Choose from KCL, Python, or Go to control your resources
- Integration with your existing workflow. Write functions in your configuration project and avoid tool drift
- Full IDE support. Auto completion, syntax highlighting, and other coding tools help you write functions using best practices
- Deploy seamlessly. Package and push your functions with your configuration in a single step.
Embedded functions are composition functions that you can build, package, and manage directly in your configuration. Instead of relying on a YAML-based patch-and-transform workflow, you can write composition logic in Python or configuration languages like KCL. Embedded functions allow for shared logic across multiple compositions within your configuration.
Prerequisites
For this guide you need:
- The latest version of the
up
CLI - An AWS account
Initialize your project
First, scaffold a new project with the up
CLI.
up project init function-demo && cd function-demo
created directory path function-demo
initialized package "function-demo" in directory "function-demo" from https://github.com/upbound/project-template (main)
Generate a project function
Use up function generate
and choose between KCL or Python.
Use an embedded function
When you create functions with up function generate, the up CLI automatically adds them to the specified composition. For manually created functions or those shared across multiple compositions, reference them in the functionRef
parameter.
The functionRef
name follows this format: [organization-name]-[project-name][function-name]
. For example, if your organization is my-org
and your project is my-conf
, the functionRef
name would be:
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
name: xexample.myorg.com
spec:
mode: Pipeline
pipeline:
- step: compose
functionRef:
name: my-org-my-confcompose-xexample
- step: propagate-status
functionRef:
name: my-org-my-confpropagate-status
Build your configuration deployment
The up project build
command builds and packages your
configuration and embedded functions.
Here’s how it works:
Build embedded function packages:
Each function in the functions/
directory of your project can use a Dockerfile
or supported
languages to build your function. Supported languages must use a base
image and add the function code.
Generate Configuration Package Metadata: The up CLI creates Crossplane package metadata, including dependencies on embedded functions.
Build the Configuration Package: All relevant YAML files (XRDs and compositions) are bundled into a Crossplane configuration package using the generated metadata.
Write the Packages to Disk:
Embedded function and configuration packages are
saved to a single .uppkg
file, which up project push
can use to push
packages to the Upbound Marketplace.
Push your configuration
The up project push
command uploads your configuration and it’s embedded
functions to the Upbound Marketplace.
The .uppkg
file generated by up project build contains the packages that need
to be pushed. Then the packages are pushed to sub-repositories
within your configuration repository. Each sub-repository name follows this
naming convention [organization-name]-[project-name]_[function-name]
. The configuration package,
which includes dependencies on embedded functions, is also pushed. Once uploaded, your configuration is ready to be deployed to control planes like any
other configuration.