Terraform Fundamentals: Device Farm
DevOps Fundamental

DevOps Fundamental @devops_fundamental

About: DevOps | SRE | Cloud Engineer 🚀 ☕ Support me on Ko-fi: https://ko-fi.com/devopsfundamental

Joined:
Jun 18, 2025

Terraform Fundamentals: Device Farm

Publish Date: Jul 28
0 0

Terraform Device Farm: A Production-Grade Deep Dive

The relentless demand for application quality across a fragmented device landscape presents a significant challenge. Traditional manual testing is slow, expensive, and prone to inconsistencies. Automating mobile app testing at scale requires a robust, repeatable infrastructure. Terraform, while excellent at provisioning core infrastructure, often lacks direct support for specialized services like mobile device farms. This post details how to integrate and manage device farms – specifically AWS Device Farm – using Terraform, focusing on production-grade implementation and operational considerations. This fits into a broader IaC pipeline as a specialized component provisioned alongside application infrastructure, or as a platform service consumed by development teams.

What is "Device Farm" in Terraform Context?

AWS Device Farm allows developers to quickly improve the quality of their Android, iOS, Fire OS, and web apps on real devices. While there isn’t a dedicated “Terraform provider” for Device Farm in the traditional sense, interaction is achieved through the AWS provider and specifically, the aws_devicefarm_project, aws_devicefarm_device_pool, and aws_devicefarm_testgrid_project resources. These resources manage the foundational elements needed to run tests.

The key caveat is that Terraform doesn’t execute the tests themselves. It provisions the environment for testing. Test execution is triggered via the AWS CLI, SDKs, or Device Farm’s UI, often integrated into CI/CD pipelines. Terraform manages the configuration, not the runtime. Lifecycle management is standard Terraform: create, read, update, delete. State management is critical, especially when dealing with complex device pool configurations.

Use Cases and When to Use

Device Farm integration with Terraform is crucial in these scenarios:

  1. Automated Regression Testing: SRE teams can define infrastructure for running automated UI and functional tests across a range of devices as part of every code commit. This ensures rapid feedback on regressions.
  2. Pre-Production Device Validation: Before releasing to app stores, QA teams need to validate app behavior on a representative set of real devices. Terraform can provision these environments on-demand.
  3. Performance Testing at Scale: DevOps engineers can use Device Farm to simulate user load on different devices, identifying performance bottlenecks before launch.
  4. Platform Engineering Self-Service: A platform team can expose pre-configured Device Farm projects and device pools as a self-service resource for application teams, reducing friction and accelerating testing cycles.
  5. Compliance & Certification: Certain industries require testing on specific device configurations. Terraform ensures consistent provisioning of these environments for auditability.

Key Terraform Resources

Here are essential resources for managing Device Farm with Terraform:

  1. aws_devicefarm_project: Defines a Device Farm project.
resource "aws_devicefarm_project" "example" {
  name        = "My-App-Project"
  display_name = "My Application Project"
}
Enter fullscreen mode Exit fullscreen mode
  1. aws_devicefarm_device_pool: Specifies a set of devices for testing.
resource "aws_devicefarm_device_pool" "example" {
  name        = "High-End-Android"
  rules {
    matchers {
      platform = "ANDROID"
    }
    inclusion_rules {
      manufacturer = "Samsung"
      model        = "Galaxy S23"
    }
  }
}
Enter fullscreen mode Exit fullscreen mode
  1. aws_devicefarm_testgrid_project: Creates a TestGrid project for automated testing.
resource "aws_devicefarm_testgrid_project" "example" {
  name        = "My-TestGrid-Project"
  display_name = "My TestGrid Project"
}
Enter fullscreen mode Exit fullscreen mode
  1. aws_iam_role: Required for Device Farm to access other AWS resources.
resource "aws_iam_role" "devicefarm_role" {
  name               = "DeviceFarmRole"
  assume_role_policy = jsonencode({
    Version = "2012-10-17",
    Statement = [
      {
        Action = "sts:AssumeRole",
        Principal = {
          Service = "devicefarm.amazonaws.com"
        }
      }
    ]
  })
}
Enter fullscreen mode Exit fullscreen mode
  1. aws_iam_policy: Grants Device Farm necessary permissions.
resource "aws_iam_policy" "devicefarm_policy" {
  name        = "DeviceFarmPolicy"
  description = "Policy for Device Farm access"
  policy      = jsonencode({
    Version = "2012-10-17",
    Statement = [
      {
        Action = [
          "s3:GetObject",
          "s3:PutObject"
        ],
        Effect   = "Allow",
        Resource = "arn:aws:s3:::your-test-artifacts-bucket/*"
      }
    ]
  })
}
Enter fullscreen mode Exit fullscreen mode
  1. aws_iam_role_policy_attachment: Attaches the policy to the role.
resource "aws_iam_role_policy_attachment" "devicefarm_attachment" {
  role       = aws_iam_role.devicefarm_role.name
  policy_arn = aws_iam_policy.devicefarm_policy.arn
}
Enter fullscreen mode Exit fullscreen mode
  1. data.aws_region: Dynamically retrieves the AWS region.
data "aws_region" "current" {}
Enter fullscreen mode Exit fullscreen mode
  1. aws_s3_bucket: Storage for test artifacts (app binaries, screenshots, logs).
resource "aws_s3_bucket" "devicefarm_artifacts" {
  bucket = "your-test-artifacts-bucket"
  acl    = "private"
}
Enter fullscreen mode Exit fullscreen mode

Common Patterns & Modules

Using for_each with aws_devicefarm_device_pool allows dynamic creation of device pools based on a map of device configurations. Remote backends (S3, DynamoDB) are essential for state locking and collaboration. A layered module structure – core Device Farm resources in a base module, and environment-specific configurations in child modules – promotes reusability. Consider a monorepo approach for managing all infrastructure code, including Device Farm configurations. Public modules are limited, so custom modules are often necessary.

Hands-On Tutorial

This example provisions a Device Farm project and a basic device pool.

Provider Setup:

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

provider "aws" {
  region = data.aws_region.current.name
}
Enter fullscreen mode Exit fullscreen mode

Resource Configuration:

resource "aws_devicefarm_project" "my_project" {
  name        = "My-Test-Project"
  display_name = "My Test Project"
}

resource "aws_devicefarm_device_pool" "android_pool" {
  name        = "Android-Pool"
  rules {
    matchers {
      platform = "ANDROID"
    }
    inclusion_rules {
      manufacturer = "Samsung"
      model        = "Galaxy S22"
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Apply & Destroy:

terraform init
terraform plan
terraform apply
terraform destroy
Enter fullscreen mode Exit fullscreen mode

terraform plan output will show the resources to be created. terraform apply will provision the resources. terraform destroy will remove them. This example assumes you have appropriate AWS credentials configured.

Enterprise Considerations

Large organizations leverage Terraform Cloud/Enterprise for state management, remote operations, and collaboration. Sentinel or Open Policy Agent (OPA) enforce policy-as-code, ensuring compliance with security and governance standards. IAM roles are meticulously designed with least privilege in mind. State locking prevents concurrent modifications. Costs are monitored using AWS Cost Explorer, and scaling is achieved by dynamically provisioning device pools based on demand. Multi-region deployments require careful consideration of data transfer costs and latency.

Security and Compliance

Enforce least privilege using granular IAM policies. Utilize aws_iam_policy to restrict Device Farm’s access to only necessary resources (S3 buckets, logging). Implement RBAC using IAM roles and groups. Policy constraints (e.g., allowed device models) are enforced via Sentinel or OPA. Drift detection (using Terraform Cloud or custom scripts) identifies unauthorized changes. Tagging policies ensure consistent metadata for cost allocation and auditing.

Integration with Other Services

graph LR
    A[Terraform] --> B(AWS Device Farm);
    B --> C{S3 - Test Artifacts};
    B --> D[CloudWatch - Logs];
    A --> E[CodePipeline/GitHub Actions - CI/CD];
    E --> B;
    A --> F[IAM - Permissions];
    F --> B;
Enter fullscreen mode Exit fullscreen mode
  1. S3: Stores test artifacts (app binaries, screenshots, logs) using aws_s3_bucket.
  2. CloudWatch: Collects logs from Device Farm tests using aws_cloudwatch_log_group.
  3. CodePipeline/GitHub Actions: Triggers Device Farm tests as part of the CI/CD pipeline.
  4. IAM: Manages permissions for Device Farm using aws_iam_role and aws_iam_policy.
  5. SNS: Sends notifications on test completion/failure using aws_sns_topic.

Module Design Best Practices

Abstract Device Farm resources into reusable modules with well-defined input variables (project name, device pool rules, IAM role ARN) and output variables (project ARN, device pool ARN). Use locals for default values and complex configurations. Document modules thoroughly with examples and usage instructions. Utilize a remote backend for state management.

CI/CD Automation

# GitHub Actions example

name: Deploy Device Farm Infrastructure

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: hashicorp/setup-terraform@v2
      - run: terraform fmt
      - run: terraform validate
      - run: terraform plan -out=tfplan
      - run: terraform apply tfplan
Enter fullscreen mode Exit fullscreen mode

Pitfalls & Troubleshooting

  1. IAM Permissions: Device Farm failing to access S3 buckets due to incorrect IAM policies. Solution: Verify policy statements and resource ARNs.
  2. Device Pool Rules: Incorrectly configured device pool rules resulting in no devices being available. Solution: Double-check manufacturer, model, and platform filters.
  3. State Locking: Concurrent Terraform runs causing state corruption. Solution: Utilize a remote backend with state locking enabled.
  4. Test Artifact Storage: S3 bucket not configured correctly, leading to test artifacts being lost. Solution: Ensure bucket policies allow Device Farm write access.
  5. Region Mismatch: Terraform provider configured for a different region than Device Farm. Solution: Verify the AWS region in the provider configuration.

Pros and Cons

Pros:

  • Automated infrastructure provisioning for device farms.
  • Repeatable and consistent test environments.
  • Integration with existing IaC pipelines.
  • Improved test coverage and quality.

Cons:

  • No direct test execution management within Terraform.
  • Requires custom modules and configuration.
  • Complexity in managing device pool rules.
  • Cost associated with Device Farm usage.

Conclusion

Terraform integration with AWS Device Farm empowers infrastructure engineers to automate the provisioning of robust, scalable, and secure mobile testing environments. While not a complete solution for test automation, it addresses a critical gap in the IaC landscape. Prioritize module development, robust IAM policies, and CI/CD integration to unlock the full potential of this powerful combination. Begin with a proof-of-concept, evaluate existing modules, and establish a CI pipeline to streamline your mobile testing workflows.

Comments 0 total

    Add comment