Copy # Using Terraform's HTTP provider to manage Cakewalk access
# This works TODAY without needing a custom provider
terraform {
required_providers {
http = {
source = "hashicorp/http"
version = "~> 3.0"
}
}
}
variable "cakewalk_api_key" {
type = string
sensitive = true
}
variable "cakewalk_api_secret" {
type = string
sensitive = true
}
locals {
cakewalk_base_url = "https://open-api.getcakewalk.io"
# Define your WorkApp IDs (find these via: GET /api/v1/WorkApps)
workapp_ids = {
github = "GITHUB_WORKAPP_UUID"
aws = "AWS_WORKAPP_UUID"
slack = "SLACK_WORKAPP_UUID"
datadog = "DATADOG_WORKAPP_UUID"
}
# Define your user IDs (find these via: GET /api/v1/Users)
user_ids = {
alice = "ALICE_USER_UUID"
bob = "BOB_USER_UUID"
charlie = "CHARLIE_USER_UUID"
}
# Define permission level IDs per app (find via: GET /api/v1/WorkApps/{id}/PermissionLevels)
github_permission_levels = {
developer = "GITHUB_DEVELOPER_PERMISSION_UUID"
admin = "GITHUB_ADMIN_PERMISSION_UUID"
}
aws_permission_levels = {
developer = "AWS_DEVELOPER_PERMISSION_UUID"
admin = "AWS_ADMIN_PERMISSION_UUID"
}
}
# Grant GitHub access to engineering team
resource "null_resource" "grant_github_access_engineering" {
# Trigger re-creation if team membership changes
triggers = {
users = jsonencode([local.user_ids.alice, local.user_ids.bob, local.user_ids.charlie])
}
provisioner "local-exec" {
command = <<-EOT
# Build access grants JSON
cat > /tmp/github_grants.json <<EOF
{
"data": [
{
"workAppId": "${local.workapp_ids.github}",
"userId": "${local.user_ids.alice}",
"permissionLevelId": "${local.github_permission_levels.developer}"
},
{
"workAppId": "${local.workapp_ids.github}",
"userId": "${local.user_ids.bob}",
"permissionLevelId": "${local.github_permission_levels.developer}"
},
{
"workAppId": "${local.workapp_ids.github}",
"userId": "${local.user_ids.charlie}",
"permissionLevelId": "${local.github_permission_levels.admin}"
}
]
}
EOF
# Submit grants
curl -X POST ${local.cakewalk_base_url}/api/v1/WorkApps/Accesses \
-H "X-API-KEY: ${var.cakewalk_api_key}" \
-H "X-API-SECRET: ${var.cakewalk_api_secret}" \
-H "Content-Type: application/json" \
-d @/tmp/github_grants.json
rm /tmp/github_grants.json
EOT
interpreter = ["bash", "-c"]
}
}
# Grant AWS access to senior engineers only
resource "null_resource" "grant_aws_access_senior" {
triggers = {
users = jsonencode([local.user_ids.alice, local.user_ids.charlie])
}
provisioner "local-exec" {
command = <<-EOT
cat > /tmp/aws_grants.json <<EOF
{
"data": [
{
"workAppId": "${local.workapp_ids.aws}",
"userId": "${local.user_ids.alice}",
"permissionLevelId": "${local.aws_permission_levels.admin}"
},
{
"workAppId": "${local.workapp_ids.aws}",
"userId": "${local.user_ids.charlie}",
"permissionLevelId": "${local.aws_permission_levels.developer}"
}
]
}
EOF
curl -X POST ${local.cakewalk_base_url}/api/v1/WorkApps/Accesses \
-H "X-API-KEY: ${var.cakewalk_api_key}" \
-H "X-API-SECRET: ${var.cakewalk_api_secret}" \
-H "Content-Type: application/json" \
-d @/tmp/aws_grants.json
rm /tmp/aws_grants.json
EOT
interpreter = ["bash", "-c"]
}
}
output "github_workapp_id" {
value = local.workapp_ids.github
}
output "aws_workapp_id" {
value = local.workapp_ids.aws
}