// infra/lib/app_infra.dart
// A Stack is one Terraform root module of GCP resources, written in Dart.
import 'package:terradart_core/terradart_core.dart';
import 'package:terradart_google/cloud_run.dart';
import 'package:terradart_google/cloud_sql.dart';
import 'package:terradart_google/iam.dart';
import 'package:terradart_google/provider.dart';
final class AppInfraStack extends Stack {
AppInfraStack({required String projectId})
: super(providers: [
GoogleProvider(project: projectId, region: 'asia-northeast1'),
]) {
add(GoogleSqlDatabaseInstance(
localName: 'app_sql',
name: TfArg.literal('app-sql'),
databaseVersion: TfArg.literal(DatabaseVersion.postgres15),
region: TfArg.literal('asia-northeast1'),
settings: SqlDatabaseInstanceSettings(
tier: TfArg.literal('db-f1-micro'),
),
));
final runSa = add(GoogleServiceAccount(
localName: 'run_sa',
accountId: TfArg.literal('app-run-sa'),
));
add(GoogleProjectIamMember(
localName: 'run_sa_sql_client',
project: TfArg.literal(projectId),
role: TfArg.literal('roles/cloudsql.client'),
member: TfArg.ref(runSa.iamMember),
));
add(GoogleCloudRunV2Service(
localName: 'app',
name: TfArg.literal('app'),
location: TfArg.literal('asia-northeast1'),
template: CloudRunV2ServiceTemplate(
serviceAccount: TfArg.ref(runSa.email),
containers: [
CloudRunV2ServiceServiceContainer(
name: TfArg.literal('app'),
image: TfArg.literal('gcr.io/cloudrun/hello'),
ports: CloudRunV2ServiceContainerPort(
containerPort: TfArg.literal(8080),
),
env: [
CloudRunV2ServiceEnvVar(
name: TfArg.literal('DATABASE_URL'),
source: CloudRunV2ServiceEnvVarFromLiteral(
TfArg.literal(
'postgresql://app-client@${projectId}.iam@localhost:5432/app',
),
),
),
],
),
CloudRunV2ServiceServiceContainer(
name: TfArg.literal('cloud-sql-proxy'),
image: TfArg.literal(
'gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.18.1',
),
args: TfArg.literal([
'--port=5432',
'--auto-iam-authn',
'${projectId}:asia-northeast1:app-sql',
]),
),
],
),
));
}
}