Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions bun.lock
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{
"lockfileVersion": 1,
"configVersion": 0,
"workspaces": {
"": {
"name": "registry",
Expand Down
Binary file added registry/ausbru87/.images/avatar.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
32 changes: 32 additions & 0 deletions registry/ausbru87/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
---
display_name: Austen Bruhn
bio: Solution Engineer at Coder, OSS enthusiast
github: ausbru87
avatar: ./.images/avatar.png
linkedin: https://www.linkedin.com/in/austen-bruhn-b0a646a1/
status: community
---

# ausbru87

Brief description of what this namespace provides. Include information about:

- What types of templates/modules you offer
- Your focus areas (e.g., specific cloud providers, technologies)
- Any special features or configurations

## Templates

List your available templates here:

- **template-name**: Brief description

## Modules

List your available modules here:

- **module-name**: Brief description

Comment on lines +12 to +29
Copy link

Copilot AI Nov 16, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The namespace README contains placeholder text that should be replaced with actual content describing the contributor's modules and focus areas. Update the description and module list to reflect the AWS CLI module being added.

Suggested change
Brief description of what this namespace provides. Include information about:
- What types of templates/modules you offer
- Your focus areas (e.g., specific cloud providers, technologies)
- Any special features or configurations
## Templates
List your available templates here:
- **template-name**: Brief description
## Modules
List your available modules here:
- **module-name**: Brief description
This namespace provides modules and templates focused on cloud automation, developer productivity, and infrastructure management. The main focus areas include AWS cloud services, CLI tooling, and solutions for streamlining development workflows. Special features include pre-configured modules for rapid deployment and integration with popular cloud providers.
## Templates
Currently, there are no templates available. Stay tuned for future additions!
## Modules
- **aws-cli**: Provides the AWS Command Line Interface (CLI) for managing AWS services directly from your workspace. Includes pre-installed AWS CLI v2, ready for use in automation scripts and cloud management tasks.

Copilot uses AI. Check for mistakes.
## Contributing

If you'd like to contribute to this namespace, please [open an issue](https://github.com/coder/registry/issues) or submit a pull request.
78 changes: 78 additions & 0 deletions registry/ausbru87/modules/aws-cli/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
---
display_name: AWS CLI
description: Install AWS CLI v2 in your workspace
icon: ../../../../.icons/aws.svg
verified: false
tags: [helper, aws, cli]
---

# AWS CLI

Automatically install the [AWS CLI v2](https://aws.amazon.com/cli/) in your Coder workspace with command autocomplete support for bash, zsh, and fish shells.

```tf
module "aws-cli" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/ausbru87/aws-cli/coder"
version = "1.0.0"
agent_id = coder_agent.example.id
}
```

## Features

- Installs AWS CLI v2 for Linux and macOS
- Supports x86_64 and ARM64 architectures
- Optional version pinning
- **Auto-configures command autocomplete** for bash, zsh, and fish shells

## Examples

### Basic Installation

```tf
module "aws-cli" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/ausbru87/aws-cli/coder"
version = "1.0.0"
agent_id = coder_agent.example.id
}
```

### Pin to Specific Version

```tf
module "aws-cli" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/ausbru87/aws-cli/coder"
version = "1.0.0"
agent_id = coder_agent.example.id
install_version = "2.15.0"
}
```

### Custom Log Path

```tf
module "aws-cli" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/ausbru87/aws-cli/coder"
version = "1.0.0"
agent_id = coder_agent.example.id
log_path = "/var/log/aws-cli.log"
}
```

### Airgapped Environment

Use a custom download URL for environments without internet access to AWS:

```tf
module "aws-cli" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/ausbru87/aws-cli/coder"
version = "1.0.0"
agent_id = coder_agent.example.id
download_url = "https://internal-mirror.company.com/awscli-exe-linux-x86_64.zip"
}
```
34 changes: 34 additions & 0 deletions registry/ausbru87/modules/aws-cli/aws-cli.tftest.hcl
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
run "required_vars" {
command = plan

variables {
agent_id = "test-agent-id"
}
}

run "with_custom_version" {
command = plan

variables {
agent_id = "test-agent-id"
install_version = "2.15.0"
}
}

run "with_custom_log_path" {
command = plan

variables {
agent_id = "test-agent-id"
log_path = "/var/log/aws-cli.log"
}
}

run "with_custom_download_url" {
command = plan

variables {
agent_id = "test-agent-id"
download_url = "https://internal-mirror.company.com/awscli-exe-linux-x86_64.zip"
}
}
46 changes: 46 additions & 0 deletions registry/ausbru87/modules/aws-cli/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
terraform {
required_version = ">= 1.0"

required_providers {
coder = {
source = "coder/coder"
version = ">= 2.5"
}
}
}

variable "agent_id" {
type = string
description = "The ID of a Coder agent."
}

variable "install_version" {
type = string
description = "The version of AWS CLI to install."
default = ""
}

variable "download_url" {
type = string
description = "Custom download URL for AWS CLI. Useful for airgapped environments. If not set, uses the official AWS download URL."
default = ""
}

variable "log_path" {
type = string
description = "The path to the AWS CLI installation log file."
default = "/tmp/aws-cli-install.log"
}

resource "coder_script" "aws-cli" {
agent_id = var.agent_id
display_name = "AWS CLI"
icon = "/icon/aws.svg"
script = templatefile("${path.module}/run.sh", {
LOG_PATH : var.log_path,
VERSION : var.install_version,
DOWNLOAD_URL : var.download_url,
})
run_on_start = true
run_on_stop = false
}
129 changes: 129 additions & 0 deletions registry/ausbru87/modules/aws-cli/run.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
#!/usr/bin/env sh

set -e

LOG_PATH=${LOG_PATH}
VERSION=${VERSION}
DOWNLOAD_URL=${DOWNLOAD_URL}
Comment on lines +5 to +7
Copy link

Copilot AI Nov 16, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] The template variables are assigned to shell variables with the same names. While this works, it's unclear whether these are template substitutions or shell variables. Consider using different casing or prefixes to make the distinction clearer (e.g., log_path=\"${LOG_PATH}\").

Copilot uses AI. Check for mistakes.

BOLD='\\033[0;1m'
RESET='\\033[0m'

printf "${BOLD}Installing AWS CLI...\\n${RESET}"

# Check if AWS CLI is already installed
if command -v aws > /dev/null 2>&1; then
INSTALLED_VERSION=$(aws --version 2>&1 | cut -d' ' -f1 | cut -d'/' -f2)
if [ -n "$VERSION" ] && [ "$INSTALLED_VERSION" != "$VERSION" ]; then
printf "❌ AWS CLI $INSTALLED_VERSION is installed, but version $VERSION was requested.\\n"
printf "Note: AWS CLI installer does not support version-specific installation.\\n"
exit 1
else
printf "AWS CLI is already installed ($INSTALLED_VERSION). Skipping installation.\\n"
exit 0
fi
fi

# Determine OS and architecture
OS=$(uname -s | tr '[:upper:]' '[:lower:]')
ARCH=$(uname -m)

case "$ARCH" in
x86_64) ARCH="x86_64" ;;
Copy link

Copilot AI Nov 16, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The case statement for x86_64 is redundant as it assigns the same value. Consider removing this case branch or adding a comment explaining why it's needed for clarity.

Suggested change
x86_64) ARCH="x86_64" ;;

Copilot uses AI. Check for mistakes.
aarch64 | arm64) ARCH="aarch64" ;;
*)
printf "Unsupported architecture: $ARCH\\n" >> "${LOG_PATH}" 2>&1
exit 1
;;
esac

# Install AWS CLI
if [ "$OS" = "linux" ]; then
# Use custom download URL if provided, otherwise use default AWS URL
if [ -z "$DOWNLOAD_URL" ]; then
DOWNLOAD_URL="https://awscli.amazonaws.com/awscli-exe-linux-${ARCH}.zip"
fi

printf "Downloading AWS CLI from $DOWNLOAD_URL...\\n"
curl -fsSL "$DOWNLOAD_URL" -o /tmp/awscliv2.zip >> "${LOG_PATH}" 2>&1 || exit 1

unzip -q /tmp/awscliv2.zip -d /tmp >> "${LOG_PATH}" 2>&1 || exit 1
sudo /tmp/aws/install >> "${LOG_PATH}" 2>&1 || exit 1

rm -rf /tmp/awscliv2.zip /tmp/aws

elif [ "$OS" = "darwin" ]; then
# Use custom download URL if provided, otherwise use architecture-specific AWS URL
if [ -z "$DOWNLOAD_URL" ]; then
case "$ARCH" in
x86_64)
DOWNLOAD_URL="https://awscli.amazonaws.com/AWSCLIV2-x86_64.pkg"
;;
aarch64)
DOWNLOAD_URL="https://awscli.amazonaws.com/AWSCLIV2-arm64.pkg"
;;
*)
DOWNLOAD_URL="https://awscli.amazonaws.com/AWSCLIV2.pkg"
;;
esac
fi

printf "Downloading AWS CLI from $DOWNLOAD_URL...\\n"
curl -fsSL "$DOWNLOAD_URL" -o /tmp/AWSCLIV2.pkg >> "${LOG_PATH}" 2>&1 || exit 1

sudo installer -pkg /tmp/AWSCLIV2.pkg -target / >> "${LOG_PATH}" 2>&1 || exit 1

rm -f /tmp/AWSCLIV2.pkg

else
printf "Unsupported OS: $OS\\n" >> "${LOG_PATH}" 2>&1
exit 1
fi

# Verify installation was successful
if command -v aws > /dev/null 2>&1; then
printf "🥳 AWS CLI installed successfully!\\n"
aws --version

# Configure autocomplete for common shells
if command -v aws_completer > /dev/null 2>&1; then
AWS_COMPLETER_PATH=$(which aws_completer)

# Bash autocomplete
if [ -f ~/.bashrc ]; then
if ! grep -q "aws_completer.*aws" ~/.bashrc; then
echo "complete -C '$AWS_COMPLETER_PATH' aws" >> ~/.bashrc
printf "✓ Configured AWS CLI autocomplete for bash\\n"
fi
fi

# Zsh autocomplete
if [ -f ~/.zshrc ] || [ -d ~/.oh-my-zsh ]; then
if ! grep -q "aws_completer.*aws" ~/.zshrc 2> /dev/null; then
cat >> ~/.zshrc << ZSHEOF

# AWS CLI autocomplete
autoload bashcompinit && bashcompinit
autoload -Uz compinit && compinit
complete -C '$AWS_COMPLETER_PATH' aws
Copy link

Copilot AI Nov 16, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the zsh autocomplete heredoc, the variable $AWS_COMPLETER_PATH is not properly escaped. Since this is inside a heredoc with the delimiter ZSHEOF (not quoted), the variable will be expanded by the shell when writing to .zshrc. Use double backslash or a different heredoc approach to ensure the literal variable reference is written to the file.

Copilot uses AI. Check for mistakes.
ZSHEOF
printf "✓ Configured AWS CLI autocomplete for zsh\\n"
fi
fi

# Fish autocomplete
if [ -d ~/.config/fish ] || command -v fish > /dev/null 2>&1; then
mkdir -p ~/.config/fish/completions
FISH_COMPLETION=~/.config/fish/completions/aws.fish
if [ ! -f "$FISH_COMPLETION" ]; then
cat > "$FISH_COMPLETION" << 'FISHEOF'
complete --command aws --no-files --arguments '(begin; set --local --export COMP_SHELL fish; set --local --export COMP_LINE (commandline); aws_completer | sed '"'"'s/ $//'"'"'; end)'
FISHEOF
printf "✓ Configured AWS CLI autocomplete for fish\\n"
fi
fi
fi
else
printf "❌ AWS CLI installation failed. Check logs at ${LOG_PATH}\\n"
exit 1
fi
Loading