Embarrassingly spent ages looking for slide decks from re:Invent. Just click on the title under the video thumbnail. I’ve reached the point in my life where my parents couldn’t work the timer on the VHS.
![](https://dougiewougie.com/wp-content/uploads/2025/01/image.png)
Embarrassingly spent ages looking for slide decks from re:Invent. Just click on the title under the video thumbnail. I’ve reached the point in my life where my parents couldn’t work the timer on the VHS.
Multipass is pretty useful but what a pain this was to figure out, due to Ubuntu’s Node.js package not working with AWS-CDK.
Multipass lets you manage VM in Ubuntu and can take cloud-init scripts as a parameter. I wanted an Ubuntu LTS instance with AWS CDK, which needs Node.js
and python3-venv
.
#cloud-config
packages:
- python3-venv
- unzip
package_update: true
package_upgrade: true
write_files:
- path: "/etc/environment"
append: true
content: |
export PATH=\
/opt/node-v20.11.1-linux-x64/bin:\
/usr/local/sbin:/usr/local/bin:\
/usr/sbin:/usr/bin:/sbin:/bin:\
/usr/games:/usr/local/games:\
/snap/bin
runcmd:
- wget https://nodejs.org/dist/v20.11.1/node-v20.11.1-linux-x64.tar.xz
- tar xvf node-v20.11.1-linux-x64.tar.xz -C /opt
- export PATH=/opt/node-v20.11.1-linux-x64/bin:$PATH
- npm install -g npm@latest
- npm install -g aws-cdk
- git config --system user.name "Dougie Richardson"
- git config --system user.email "xx@xxxxxxxxx.com"
- git config --system init.defaultBranch main
- wget https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip
- unzip awscli-exe-linux-x86_64.zip
- ./aws/install
Save that as cdk.yaml and spin up an new instance:
multipass launch --name cdk --cloud-init cdk.yaml
There’s a couple useful things to note if you’re checking this out:
/var/log/cloud-init-output.log
.Shell into the new VM with multipass shell cdk
, then we can configure programmatic access and bootstrap CDK.
aws sso configure
aws sso login --profile profile_name
aws sts get-caller-identity --profile profile_name
aws configure get region --profile profile_name
The last two commands give the account and region to bootstrap:
cdk bootstrap aws://account_number/region --profile profile_name
I want to be able to connect to the environment using Visual Studio Code, so first we need to create a SSH key:
ssh-keygen -t rsa
We need a configuration YAML, replace <generated ssh-rsa key>
with the above key, saved as cloud-init.yaml
:
groups:
- vscode
runcmd:
- adduser ubuntu vscode
ssh_authorized_keys:
- ssh-rsa <generated ssh-rsa key>
Assuming you’ve got Multipass installed (if not sudo snap install multipass
) then:
multipass launch mantic --name ubuntu-cdk --cloud-init
We’ll come back to Visual Studio Code later but first lets set everything up in the VM. We need to install aws-cli which I want to use with SSO (hence why we installed Mantic).
multipass shell ubuntu-cdk
sudo apt install awscli
aws configure sso
Follow the prompts and sign in to AWS as usual. Then install CDK:
sudo apt install nodejs npm
sudo npm install -g aws-cdk
Almost there, lets bootstrap1 (provisioning resources needed to make deployments) substituting the relevant values:
cdk bootstrap aws://<account>/<region> --profile <profile>
You should see a screen like this:
Create a new CDK application by creating a new folder, changing into it and initialising CDK:
cdk init app --language python
source .venv/bin/activate
python -m pip install -r requirements.txt
And that’s about it, except for Visual Studio Code. You’ll need to install Microsoft’s Remote-SSH extension:
You can get the IP address from multipass list
, then in Code add a new SSH connection using ubuntu@<ip>
:
Accept the various options presented and you’re there!