ACA with Terraform
Azure Container Apps (ACA) is a serverless container hosting service that allows you to run your containerized applications without managing the underlying infrastructure. Terraform is an Infrastructure as Code (IaC) tool that enables you to define and provision infrastructure using a declarative configuration language.
hcl
data "azurerm_client_config" "current" {}
resource "azurerm_resource_group" "my_rg" {
name = "my_rg"
location = "Australia East"
tags = {
environment = "production",
project = "my-project",
managed_by = "terraform"
}
}
resource "azurerm_container_registry" "acr" {
name = "myacr${random_id.acr_suffix.hex}"
resource_group_name = azurerm_resource_group.my_rg.name
location = azurerm_resource_group.my_rg.location
sku = "Basic"
tags = {
environment = "production",
project = "my-project",
managed_by = "terraform"
}
}
resource "azurerm_container_app_environment" "aca_env" {
name = "aca-env"
resource_group_name = azurerm_resource_group.my_rg.name
location = azurerm_resource_group.my_rg.location
tags = {
environment = "production",
project = "my-project",
managed_by = "terraform"
}
}
resource "azuread_application" "acr_push_app" {
display_name = "my-project-acr-push"
}
resource "azuread_service_principal" "acr_push_sp" {
client_id = azuread_application.acr_push_app.client_id
}
resource "azuread_service_principal_password" "acr_push_secret" {
service_principal_id = azuread_service_principal.acr_push_sp.id
}
resource "azurerm_role_assignment" "acr_push_role" {
scope = azurerm_container_registry.acr.id
role_definition_name = "AcrPush"
principal_id = azuread_service_principal.acr_push_sp.object_id
}
resource "azurerm_user_assigned_identity" "aca_identity" {
name = "aca-identity"
resource_group_name = azurerm_resource_group.my_rg.name
location = azurerm_resource_group.my_rg.location
}
resource "azurerm_role_assignment" "acr_pull_role" {
scope = azurerm_container_registry.acr.id
role_definition_name = "AcrPull"
principal_id = azurerm_user_assigned_identity.aca_identity.principal_id
}
resource "azurerm_container_app" "app" {
name = "app"
container_app_environment_id = azurerm_container_app_environment.aca_env.id
resource_group_name = azurerm_resource_group.my_rg.name
revision_mode = "Single"
identity {
type = "UserAssigned"
identity_ids = [azurerm_user_assigned_identity.aca_identity.id]
}
registry {
server = azurerm_container_registry.acr.login_server
identity = azurerm_user_assigned_identity.aca_identity.id
}
ingress {
allow_insecure_connections = false
external_enabled = true
target_port = 3000
transport = "auto"
traffic_weight {
latest_revision = true
percentage = 100
}
}
template {
container {
name = "app"
image = "${azurerm_container_registry.acr.login_server}/my-project:latest"
cpu = "0.25"
memory = "0.5Gi"
env {
name = "NEXT_PUBLIC_APP_ENV"
value = "production"
}
readiness_probe {
transport = "HTTP"
port = 3000
}
liveness_probe {
transport = "HTTP"
port = 3000
path = "/api/health"
}
}
}
}