Insights Cloud| Technology Complete Infrastructure as Code Implementation Guide: Terraform vs Ansible vs CloudFormation
Cloud
|
Technology
Sep 3, 2025

Complete Infrastructure as Code Implementation Guide: Terraform vs Ansible vs CloudFormation

AUTHOR

James A. Wondrasek James A. Wondrasek

Infrastructure as Code (IaC) transforms manual infrastructure management into automated, version-controlled processes that reduce deployment times by up to 90% while eliminating configuration drift. This comprehensive guide provides technical leaders with practical implementation strategies, tool comparisons, and proven best practices for successful IaC adoption.

This guide is part of our complete DevOps automation and CI/CD pipeline guide, providing the infrastructure foundation that enables reliable and scalable software delivery pipelines.

The shift to IaC represents a fundamental change in how organizations manage their technology infrastructure. Rather than relying on manual processes and documentation, teams can now define their entire infrastructure stack through code that’s version-controlled, tested, and deployed using the same rigorous practices applied to software development.

This guide examines the three leading IaC platforms—Terraform, Ansible, and CloudFormation—providing decision frameworks, implementation roadmaps, and security best practices. You’ll learn how to set up GitOps workflows, establish testing frameworks, and manage infrastructure state at scale. The practical examples and code snippets throughout this article will help your team move from manual infrastructure management to fully automated, reproducible deployments.

What is Infrastructure as Code and Why Should Technical Leaders Care?

Infrastructure as Code is the practice of managing computing infrastructure through machine-readable definition files rather than manual processes. Technical leaders should prioritize IaC because it reduces deployment failures by 60%, accelerates release cycles, and provides complete infrastructure version control and compliance tracking.

Definition and Core Principles

IaC represents a paradigm shift from traditional infrastructure management to treating infrastructure configurations like software code. The declarative approach allows teams to describe their desired infrastructure state, letting the IaC tools handle the implementation details. This methodology ensures consistency across environments and eliminates the configuration drift that plagues manual deployments.

Version control for infrastructure becomes as fundamental as version control for application code. Every infrastructure change goes through the same review processes, approval workflows, and rollback capabilities that development teams take for granted. This approach provides an audit trail for compliance requirements and enables teams to understand exactly what changed when issues arise.

The repeatability benefits extend beyond simple deployment consistency. Teams can recreate entire environments on demand, whether for testing, disaster recovery, or scaling operations. This capability transforms how organizations approach infrastructure management, moving from snowflake servers requiring special care to cattle that can be replaced at will.

Business Impact for Leadership

The financial implications of IaC adoption are substantial. Organizations typically see cost reductions of 20-30% through standardized resource configurations, automated rightsizing, and elimination of manual provisioning overhead. Cloud-native environments reduce capital expenditure by shifting the model from on-premises hardware to flexible, usage-based cloud services.

Risk mitigation through automation addresses one of the most significant challenges facing modern technology organizations. The strategic benefit is clear: predictability. In a world where outages can cost millions in lost revenue and customer trust, having a cloud-native architecture ensures that recovery is fast and resilient.

Compliance and audit trail benefits become increasingly important as organizations face stricter regulatory requirements. IaC enables automated compliance checking at every stage of the development process, ensuring that only approved configurations reach production environments. This automation dramatically reduces the overhead associated with compliance reporting and audit preparation. When integrated with our comprehensive DevOps automation framework, IaC becomes the foundation for reliable, compliant infrastructure management across your entire software delivery lifecycle.

Implementation Readiness

Successful IaC implementation requires careful assessment of existing team capabilities and organizational readiness. The hardest part of cloud-native transformation isn’t technology—it’s culture. Legacy mindsets resist change. Skill gaps persist. Processes built for stability must adapt to speed.

Organizations must evaluate their current automation maturity, existing toolchain integration points, and team skill levels across both development and operations. This assessment helps determine the appropriate implementation timeline and training requirements for successful adoption.

Success metrics should focus on measurable improvements in deployment frequency, lead time for changes, mean time to recovery, and change failure rate. These DevOps Research and Assessment (DORA) metrics provide objective measures of IaC implementation success and help identify areas requiring additional attention.

How to Choose Between Terraform, Ansible, and CloudFormation?

Choose Terraform for multi-cloud infrastructure provisioning, Ansible for configuration management and application deployment, and CloudFormation for AWS-native environments. Most enterprises use Terraform for infrastructure provisioning combined with Ansible for configuration management, providing comprehensive automation coverage.

Tool Comparison Matrix

Terraform enables you to provision, manage, and deploy your infrastructure as code (IaC) using a declarative configuration language called HashiCorp Configuration Language (HCL). Terraform excels at managing infrastructure resources across multiple cloud providers, with support for over 3,000 providers in its ecosystem. The declarative nature of HCL means developers describe the desired end state rather than the steps to achieve it.

Ansible is a software tool designed for cross-platform automation and orchestration at scale. Written in Python and backed by RedHat and a loyal open-source community, it is a command-line IT automation application widely used for configuration management, infrastructure provisioning, and application deployment use cases. Ansible uses YAML syntax and operates in an agentless manner, connecting to target systems via SSH or WinRM.

CloudFormation provides AWS-native infrastructure management through JSON or YAML templates. It offers tight integration with AWS services and immediate support for new AWS features, but lacks the multi-cloud capabilities of Terraform. CloudFormation templates can become complex for large deployments, but the service provides excellent rollback capabilities and stack management features.

Decision Framework

The choice between tools depends on your cloud strategy, team expertise, and integration requirements. Organizations with multi-cloud strategies typically favor Terraform for its provider-agnostic approach and consistent syntax across different cloud platforms. Single-cloud AWS environments may benefit from CloudFormation’s native integration and immediate feature support.

Team expertise plays a crucial role in tool selection. Terraform uses HCL (Hashicorp Configuration Language) which is declarative in nature. It doesn’t matter in which sequence the code is written. The code could also be dispersed in multiple files. Teams comfortable with declarative languages and infrastructure thinking often prefer Terraform’s approach.

Ansible uses YAML syntax to define the procedure to perform on the target infrastructure. Ansible YAML scripts are procedural in nature – meaning when you write the script, it will be executed from top to bottom. Teams with strong operational backgrounds and scripting experience may find Ansible’s imperative approach more intuitive.

Combining Tools for Maximum Impact

Terraform is typically used for “Day 0” activities, such as setting up the initial infrastructure, while Ansible is used for “Day 1 and beyond” tasks, focusing on configuring and maintaining systems. This separation of concerns allows organizations to leverage each tool’s strengths while maintaining clear boundaries between infrastructure provisioning and configuration management.

The hybrid approach enables teams to use Terraform for creating cloud resources like VPCs, subnets, and compute instances, while Ansible handles software installation, configuration file management, and ongoing system maintenance. This combination provides comprehensive coverage of the infrastructure lifecycle.

It is recommended to follow the immutable infrastructure approach, where Terraform takes care of the infrastructure management, and Ansible helps apply the changed configuration. This is also known as the Blue/Green deployment strategy, where the risk of configuration failure is reduced.

How to Implement Your First Terraform Configuration?

Start your first Terraform configuration by installing Terraform CLI, creating a main.tf file with provider and resource blocks, running ‘terraform init’ to initialize, ‘terraform plan’ to preview changes, and ‘terraform apply’ to deploy your infrastructure with version-controlled, repeatable results.

Prerequisites and Setup

Begin by installing the Terraform CLI from HashiCorp’s official download page or using your system’s package manager. Ensure you have appropriate cloud provider credentials configured, either through environment variables, credential files, or IAM roles for AWS, service principals for Azure, or service accounts for Google Cloud Platform.

Establish a proper development environment with a code editor that supports HCL syntax highlighting and validation. Visual Studio Code with the Terraform extension provides excellent support for syntax checking, auto-completion, and integrated documentation.

Configure your workspace with appropriate directory structures from the beginning. A typical project structure includes separate directories for modules, environments, and shared configurations, following Terraform best practices for organization and maintainability.

Integration with CI/CD pipelines becomes seamless when your workspace structure aligns with automated deployment workflows. Our CI/CD pipeline implementation guide provides detailed examples of how to structure repositories for optimal automation.

First Configuration Walkthrough

Create a basic main.tf file that demonstrates core Terraform concepts:

terraform {
  required_version = ">= 1.0"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = var.aws_region
}

resource "aws_vpc" "main" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_hostnames = true
  enable_dns_support   = true

  tags = {
    Name        = "main-vpc"
    Environment = var.environment
  }
}

resource "aws_subnet" "public" {
  vpc_id                  = aws_vpc.main.id
  cidr_block              = "10.0.1.0/24"
  availability_zone       = "${var.aws_region}a"
  map_public_ip_on_launch = true

  tags = {
    Name = "public-subnet"
    Type = "public"
  }
}

This configuration demonstrates provider setup, resource definition, and variable usage. Dependency mapping between resources is done in the background automatically by Terraform and is largely hidden from the user, but can be controlled if required. Terraform automatically understands that the subnet depends on the VPC and will create them in the correct order.

Variables should be defined in a separate variables.tf file:

variable "aws_region" {
  description = "AWS region for resources"
  type        = string
  default     = "us-west-2"
}

variable "environment" {
  description = "Environment name"
  type        = string
  default     = "development"
}

Terraform Workflow Commands

The Terraform workflow follows a consistent pattern: initialize, plan, apply, and manage. Run terraform init to download provider plugins and initialize the working directory. This command sets up the backend and downloads necessary provider binaries based on your configuration.

Execute terraform plan to preview changes before applying them. This command shows exactly what resources will be created, modified, or destroyed, providing a safety check before making actual infrastructure changes. Terraform has a raft of great features, including allowing you to deploy to different environments using workspaces, and the ability to run plans to show what will change without making any alterations.

Use terraform apply to execute the planned changes. Terraform will prompt for confirmation before proceeding, unless you use the -auto-approve flag in automated environments. The apply process creates, modifies, or destroys resources as needed to match your configuration.

Terraform maintains a state file. The state file describes the existing state of the infrastructure and allows Terraform to query, build, maintain, and change the infrastructure as defined in your configuration files. Understanding state file management becomes crucial as your infrastructure grows in complexity.

How to Set Up GitOps for Infrastructure Management?

Set up GitOps for infrastructure by storing IaC code in Git repositories, configuring CI/CD pipelines to trigger on commits, implementing automated testing and validation, and establishing approval workflows that treat infrastructure changes with the same rigor as application code changes.

GitOps Principles for IaC

Adopt a version control platform such as GitHub, GitLab, or Bitbucket. Create clear branching strategies—like Git Flow or trunk-based development—to streamline collaboration. The goal is to make merging and peer reviews straightforward and efficient.

Git becomes the single source of truth for infrastructure configurations, with all changes tracked, reviewed, and approved through pull requests. This approach ensures that infrastructure modifications follow the same governance processes as application code, preventing unauthorized changes and maintaining audit trails.

Declarative configuration management through Git enables teams to understand infrastructure state by examining the repository contents. The desired state is always visible in the main branch, making troubleshooting and change tracking significantly more straightforward than traditional infrastructure management approaches.

CI/CD Pipeline Configuration

Your IaC approach benefits immensely from continuous integration/continuous delivery (CI/CD) pipelines. Whenever you merge changes into the main branch, your pipeline should automatically: Validate configurations (linting, syntax checks). Run integration tests. (Optionally) Deploy to a test or staging environment.

Design pipeline stages that mirror software development practices:

stages:
  - validate
  - plan
  - security-scan
  - approve
  - apply

validate:
  script:
    - terraform fmt -check
    - terraform validate
    - tflint

plan:
  script:
    - terraform plan -out=tfplan
  artifacts:
    paths:
      - tfplan

security-scan:
  script:
    - checkov -f tfplan
    - terrascan scan -t terraform

apply:
  script:
    - terraform apply tfplan
  when: manual
  only:
    - main

This pipeline structure ensures that all changes undergo validation, security scanning, and manual approval before deployment to production environments. The manual approval gate provides an additional safety check for infrastructure modifications.

Repository Structure Best Practices

Organize your repository structure to support multiple environments and promote code reuse:

infrastructure/
├── modules/
│   ├── vpc/
│   ├── compute/
│   └── database/
├── environments/
│   ├── development/
│   ├── staging/
│   └── production/
├── shared/
│   ├── variables.tf
│   └── outputs.tf
└── .github/
    └── workflows/

This structure separates reusable modules from environment-specific configurations, enabling teams to maintain consistency while allowing for environment-specific customizations. Shared components reduce duplication and ensure standardized configurations across all environments.

Environment-specific configurations should reference common modules while providing environment-appropriate variable values. This approach maintains consistency while accommodating different sizing, security, and compliance requirements across development, staging, and production environments.

What Are IaC Security Best Practices?

IaC security best practices include secrets management through dedicated tools like HashiCorp Vault, policy-as-code enforcement, least-privilege access controls, encrypted state files, automated security scanning in CI/CD pipelines, and regular compliance audits to prevent infrastructure vulnerabilities and ensure regulatory compliance.

Secrets Management Strategy

IaC code can inadvertently expose secrets if not carefully managed. Use secret management solutions (e.g., HashiCorp Vault, AWS Secrets Manager) to store sensitive data. Never hardcode credentials, API keys, or passwords directly in your infrastructure code or variable files.

Implement external secret injection patterns where sensitive values are retrieved at runtime from dedicated secret management systems. This approach ensures that secrets never appear in version control, log files, or state files where they could be inadvertently exposed.

Configure your CI/CD pipelines to use temporary credentials with minimal required permissions. Short-lived tokens reduce the blast radius of potential security breaches and align with zero-trust security principles.

Access Control and Governance

DevSecOps should be a “shared responsibility model, with ownership but no silos”. Security teams define strategy and controls. Development teams implement controls in their workflow. Establish “Security Champions” within engineering teams.

Implement role-based access control (RBAC) that limits infrastructure modification capabilities to authorized personnel. Use branch protection rules, required reviews, and approval workflows to ensure that infrastructure changes undergo appropriate scrutiny before deployment.

Policy-as-code frameworks enable automated enforcement of security and compliance requirements. Tools like Open Policy Agent (OPA) or cloud-specific policy engines can validate infrastructure configurations against organizational standards before deployment.

Automated Security Validation

Automate early pipeline stages like: Static code analysis, Dependency scanning, Secret detection. Maintain human oversight for complex deployment decisions. Reduce false positives through continuous rule refinement.

Integrate security scanning tools directly into your CI/CD pipelines to catch vulnerabilities before they reach production. Tools like Checkov, Terrascan, and cloud-specific security scanners can identify misconfigurations, insecure defaults, and compliance violations automatically.

When your infrastructure is defined in code, it becomes easier to check for security vulnerabilities and compliance issues at every stage of development. Integrating automated security scanning into the pipeline ensures that only compliant and safe configurations move to production.

Implement continuous compliance monitoring that validates deployed infrastructure against security baselines. This ongoing validation catches configuration drift that might introduce security vulnerabilities over time.

How to Test and Validate Infrastructure Code?

Test infrastructure code using unit tests for modules, integration tests for deployed resources, compliance tests for security policies, and end-to-end tests for complete workflows. Implement automated testing in CI/CD pipelines to catch issues before production deployment and ensure infrastructure reliability.

Infrastructure Testing Strategy

Infrastructure testing follows patterns similar to software testing, with unit tests for individual modules, integration tests for component interactions, and end-to-end tests for complete system validation. The right AI testing tool must align with your infrastructure, team skills, and long-term vision.

Unit tests validate individual infrastructure modules in isolation, checking that resources are created with correct configurations and that outputs match expected values. These tests run quickly and provide immediate feedback during development, catching syntax errors and basic configuration issues.

Integration tests deploy infrastructure components to actual cloud environments and validate that resources work together correctly. These tests verify network connectivity, security group rules, and cross-service integrations that cannot be validated through unit testing alone.

Testing Tools and Implementation

Terratest provides a robust framework for infrastructure testing using Go, enabling teams to write comprehensive test suites that deploy actual infrastructure, validate functionality, and clean up resources automatically. The framework supports multiple cloud providers and IaC tools.

For Ansible-based infrastructure, Molecule and TestInfra provide testing capabilities that validate configuration management tasks and system state. These tools ensure that configuration changes produce the expected system configurations and that services start correctly.

Example Terratest validation:

func TestVPCModule(t *testing.T) {
  terraformOptions := &terraform.Options{
    TerraformDir: "../modules/vpc",
    Vars: map[string]interface{}{
      "vpc_cidr": "10.0.0.0/16",
      "environment": "test",
    },
  }

  defer terraform.Destroy(t, terraformOptions)
  terraform.InitAndApply(t, terraformOptions)

  vpcId := terraform.Output(t, terraformOptions, "vpc_id")
  assert.NotEmpty(t, vpcId)
  
  // Validate VPC exists and has correct CIDR
  aws.GetVpcById(t, vpcId, "us-west-2")
}

CI/CD Integration Best Practices

Tools like Terraform, OpenTofu, and Ansible can detect if your infrastructure is already in the desired state and skip unnecessary changes. Make sure your code is written to take full advantage of this idempotent behavior.

Implement test stages in your CI/CD pipeline that run automatically on every code change:

  1. Syntax Validation: Check HCL syntax and validate configurations
  2. Unit Testing: Run isolated tests for individual modules
  3. Security Scanning: Check for misconfigurations and vulnerabilities
  4. Integration Testing: Deploy to ephemeral environments for validation
  5. Compliance Testing: Validate against organizational policies

If all checks pass, you can proceed to production automatically or with a manual approval step for added safety. Some teams treat IaC as a “set it and forget it” approach, skipping thorough testing. This oversight can lead to significant downtime if a misconfiguration goes unnoticed.

Quality gates ensure that infrastructure changes meet established criteria before progressing through the deployment pipeline. Failed tests should block progression and provide clear feedback about required fixes.

How to Handle State Management and Drift?

Handle Terraform state management by using remote backends like S3 with DynamoDB locking, implementing state file encryption, establishing regular drift detection schedules, and creating documented procedures for state recovery. Use tools like Terragrunt for advanced state management across multiple environments and teams.

Remote State Configuration

Terraform manages the entire resource lifecycle under its management. It maintains the mapping of infrastructure resources with the current configuration in state files. State management plays a very important role in Terraform. Remote state storage ensures that team members share a consistent view of infrastructure state while providing backup and versioning capabilities.

Configure remote backends with proper locking mechanisms to prevent concurrent modifications:

terraform {
  backend "s3" {
    bucket         = "my-terraform-state"
    key            = "infrastructure/terraform.tfstate"
    region         = "us-west-2"
    encrypt        = true
    dynamodb_table = "terraform-locks"
  }
}

This configuration stores state in S3 with encryption and uses DynamoDB for state locking, preventing race conditions when multiple team members work on the same infrastructure. State encryption protects sensitive information that might be stored in the state file.

Drift Detection and Remediation

Configuration drift refers to the difference between the desired and actual state of your configuration. One of the most common reasons for this is that engineers/machines make changes outside the configuration. Regular drift detection helps identify when actual infrastructure diverges from the coded configuration.

Implement automated drift detection using tools like Spacelift, Terraform Cloud, or custom scripts that run terraform plan on a schedule. These tools can alert teams when infrastructure changes are detected and optionally remediate drift automatically.

Use your IaC tool’s plan or drift detection feature frequently to confirm that the infrastructure matches the code. Regularly auditing and reapplying code can nip configuration drift in the bud.

Advanced State Management Patterns

Large organizations require sophisticated state management strategies that accommodate multiple teams, environments, and deployment patterns. State splitting reduces blast radius by separating logically independent infrastructure components into separate state files.

It is also possible to import existing resources under Terraform management by importing the real-world infrastructure in state files. The import process allows teams to gradually adopt IaC for existing infrastructure without requiring complete rebuilds.

Disaster recovery procedures should include state backup strategies, restoration processes, and team training on state recovery. Document procedures for state corruption scenarios and maintain regular backups of critical state files.

Frequently Asked Questions

How long does it take to learn Terraform for infrastructure automation?

Most engineers with cloud experience can become productive with Terraform basics in 2-3 weeks, achieving intermediate proficiency in 2-3 months with consistent practice and real-world projects. The learning curve depends on existing infrastructure knowledge and programming experience.

What are the biggest mistakes teams make when implementing Infrastructure as Code?

Common mistakes include inadequate state management, poor secret handling, lack of testing frameworks, insufficient team training, and attempting to migrate everything at once instead of gradual adoption. Teams often underestimate the cultural changes required for successful IaC adoption.

Can Infrastructure as Code help me reduce cloud costs and improve efficiency?

Yes, IaC enables cost optimization through standardized resource configurations, automated rightsizing, scheduled resource lifecycle management, and elimination of manual provisioning overhead, typically reducing infrastructure costs by 20-30%. Automation also significantly reduces time spent on manual tasks.

Should I use Pulumi or Terraform for my infrastructure automation?

Choose Terraform for proven stability, large community support, and extensive provider ecosystem. Choose Pulumi for teams preferring familiar programming languages over HCL and requiring complex logic in infrastructure code. Consider your team’s existing skills and long-term maintenance capabilities.

What’s the difference between configuration management and infrastructure provisioning?

Infrastructure provisioning creates and manages cloud resources (servers, networks, databases), while configuration management installs and configures software on those resources. Terraform excels at provisioning; Ansible excels at configuration management. Most organizations use both tools together.

How do I create a business case for Infrastructure as Code adoption?

Focus on quantifiable benefits: 60% reduction in deployment failures, 50% faster deployment times, 90% reduction in manual configuration errors, improved compliance reporting, and enhanced disaster recovery capabilities. Include cost savings from automation and reduced manual effort.

What skills does my team need to implement Infrastructure as Code successfully?

Essential skills include cloud platform knowledge, version control systems (Git), basic scripting abilities, understanding of networking and security concepts, and familiarity with CI/CD pipelines. Domain-specific IaC tool training can be acquired through hands-on practice and formal training programs.

How do I troubleshoot common problems with Terraform and infrastructure deployments?

Common troubleshooting steps include checking Terraform state consistency, validating provider credentials, reviewing resource dependencies, examining Terraform logs, and using terraform refresh to sync state with actual resources. Maintain detailed documentation of common issues and their solutions.

What tools and platforms do I need to buy for IaC implementation?

Open-source tools (Terraform, Ansible) cover basic needs for most organizations. Consider commercial solutions for enterprise features: Terraform Cloud for state management, HashiCorp Vault for secrets, or platforms like Spacelift for advanced collaboration and governance capabilities.

How does Infrastructure as Code support disaster recovery and business continuity?

IaC enables rapid infrastructure recreation from code, automated backup configurations, cross-region deployment capabilities, and documented recovery procedures, significantly reducing recovery time objectives (RTO) from days to hours. Complete infrastructure can be rebuilt from version-controlled configurations.

What’s the typical timeline for implementing IaC across an organization?

Small teams (5-10 engineers): 3-6 months for basic implementation. Medium organizations (50-100 engineers): 6-12 months for comprehensive adoption. Large enterprises (500+ engineers): 12-18 months, depending on complexity, existing technical debt, and change management requirements.

How do I establish Infrastructure as Code governance and best practices?

Implement code review processes, establish naming conventions, create reusable modules, enforce security policies through automation, maintain documentation standards, and provide regular team training on evolving best practices. Create clear guidelines for state management and change approval processes.

Conclusion

Infrastructure as Code implementation transforms how organizations manage technology infrastructure, delivering measurable improvements in deployment speed, consistency, and operational efficiency. The choice between Terraform, Ansible, and CloudFormation depends on your specific requirements, with most successful implementations leveraging multiple tools for comprehensive coverage.

Security and governance must be built into your IaC processes from the beginning, not added as afterthoughts. Automated testing, secrets management, and policy enforcement ensure that infrastructure changes meet organizational standards while maintaining development velocity.

Start with a pilot project that demonstrates clear value and builds team confidence. Choose a non-critical application or environment where you can experiment with IaC practices, establish workflows, and train team members without risking production stability.

For comprehensive DevOps transformation that includes both infrastructure automation and deployment pipelines, explore our complete DevOps automation guide, which provides a strategic roadmap for implementing IaC alongside CI/CD, container orchestration, and security automation practices.

Success requires investment in team training, tooling, and cultural transformation. The technical aspects of IaC are well-understood, but the organizational changes needed for sustainable adoption often determine long-term success. Focus on building capabilities gradually while maintaining existing operational stability throughout the transition.

AUTHOR

James A. Wondrasek James A. Wondrasek

SHARE ARTICLE

Share
Copy Link

Related Articles

Need a reliable team to help achieve your software goals?

Drop us a line! We'd love to discuss your project.

Offices
Sydney

SYDNEY

55 Pyrmont Bridge Road
Pyrmont, NSW, 2009
Australia

55 Pyrmont Bridge Road, Pyrmont, NSW, 2009, Australia

+61 2-8123-0997

Jakarta

JAKARTA

Plaza Indonesia, 5th Level Unit
E021AB
Jl. M.H. Thamrin Kav. 28-30
Jakarta 10350
Indonesia

Plaza Indonesia, 5th Level Unit E021AB, Jl. M.H. Thamrin Kav. 28-30, Jakarta 10350, Indonesia

+62 858-6514-9577

Bandung

BANDUNG

Jl. Banda No. 30
Bandung 40115
Indonesia

Jl. Banda No. 30, Bandung 40115, Indonesia

+62 858-6514-9577

Yogyakarta

YOGYAKARTA

Unit A & B
Jl. Prof. Herman Yohanes No.1125, Terban, Gondokusuman, Yogyakarta,
Daerah Istimewa Yogyakarta 55223
Indonesia

Unit A & B Jl. Prof. Herman Yohanes No.1125, Yogyakarta, Daerah Istimewa Yogyakarta 55223, Indonesia

+62 274-4539660