terraform/main.tf (250 lines of code) (raw):

# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # Configure the S3 remote state backend terraform { required_version = ">= 0.11.0" backend "s3" { acl = "private" bucket = "hgaws-metadata" encrypt = true key = "tfstate/terraform.tfstate" profile = "hgaws" region = "us-west-2" } } data "terraform_remote_state" "remotestate" { backend = "s3" config = { acl = "private" bucket = "hgaws-metadata" key = "tfstate/terraform.tfstate" profile = "hgaws" region = "us-west-2" } } # An annoying technicality where we need to declare the # default provider, otherwise we will be prompted when # running `terraform apply`. See link for more info # https://github.com/terraform-providers/terraform-provider-aws/issues/1043 provider "aws" { region = "us-west-2" profile = "hgaws" } # Configure the "AWS" providers. # Credentials for the AWS account should be set in the # ~/.aws/credentials file, in the `hgaws` profile provider "aws" { alias = "awsprovider-us-west-1" region = "us-west-1" profile = "hgaws" } provider "aws" { alias = "awsprovider-us-west-2" region = "us-west-2" profile = "hgaws" } provider "aws" { alias = "awsprovider-us-east-1" region = "us-east-1" profile = "hgaws" } provider "aws" { alias = "awsprovider-us-east-2" region = "us-east-2" profile = "hgaws" } provider "aws" { alias = "awsprovider-eu-central-1" region = "eu-central-1" profile = "hgaws" } provider "google" { project = "hgmo-236019" region = "us-central1" } # Configure a bucket to hold various metadata (remote state, etc) resource "aws_s3_bucket" "metadata-bucket" { bucket = "hgaws-metadata" acl = "private" versioning { enabled = true } tags = { Name = "Metadata bucket for VCS" } } # Set up valid users within this environment resource "aws_iam_user" "user-cosheehan" { name = "cosheehan" tags = { "AKIA2GHRPQZBOYHYVYMW" = "hgaws access key - Terraform" } tags_all = { "AKIA2GHRPQZBOYHYVYMW" = "hgaws access key - Terraform" } } # This user is used to upload to S3. resource "aws_iam_user" "hgbundler" { name = "hgbundler" } # Set an IAM policy for the remote state bucket and key data "aws_iam_policy_document" "metadata-bucket-policy-definition" { statement { principals { type = "AWS" identifiers = [ aws_iam_user.user-cosheehan.arn, ] } effect = "Allow" actions = [ "s3:ListBucket", ] resources = [ aws_s3_bucket.metadata-bucket.arn, ] } statement { principals { type = "AWS" identifiers = [ aws_iam_user.user-cosheehan.arn, ] } effect = "Allow" actions = [ "s3:GetObject", "s3:PutObject", ] resources = [ "${aws_s3_bucket.metadata-bucket.arn}/tfstate/terraform.tfstate", ] } } resource "aws_s3_bucket_policy" "metadata-bucket-policy" { provider = aws.awsprovider-us-west-2 bucket = aws_s3_bucket.metadata-bucket.bucket policy = data.aws_iam_policy_document.metadata-bucket-policy-definition.json } # Configure S3 buckets for bundles and caching module "s3-east1" { source = "./modules/s3" bundler_arn = aws_iam_user.hgbundler.arn providers = { aws = aws.awsprovider-us-east-1 } } module "s3-east2" { source = "./modules/s3" bundler_arn = aws_iam_user.hgbundler.arn providers = { aws = aws.awsprovider-us-east-2 } } module "s3-west1" { source = "./modules/s3" bundler_arn = aws_iam_user.hgbundler.arn providers = { aws = aws.awsprovider-us-west-1 } } module "s3-west2" { source = "./modules/s3" bundler_arn = aws_iam_user.hgbundler.arn providers = { aws = aws.awsprovider-us-west-2 } } module "s3-eu1" { source = "./modules/s3" bundler_arn = aws_iam_user.hgbundler.arn providers = { aws = aws.awsprovider-eu-central-1 } } # Configure AWS VPC in us-west-2 module "vpc-uw2" { source = "./modules/aws-vpc" az_b_count = 2 backup_node = 1 cidr_block = "10.191.5.0/24" metadata_bucket_name = aws_s3_bucket.metadata-bucket.bucket mirror_ami = var.centos7_amis["us-west-2"] taskcluster_vpc_cidr = "10.144.0.0/16" providers = { aws = aws.awsprovider-us-west-2 } } # Service account to upload the bundles resource "google_service_account" "gcp-hgbundler" { account_id = "hgbundler" display_name = "hgbundler" description = "Upload Mercurial clonebundles to Google Cloud Storage buckets" } # GCP buckets for bundles resource "google_storage_bucket" "gcp-bundles-uc1" { name = "moz-hg-bundles-gcp-us-central1" location = "us-central1" storage_class = "STANDARD" # Delete after 1 week inactive lifecycle_rule { action { type = "Delete" } condition { age = 7 with_state = "ANY" } } # Ensure bundles are around for 1 week minimum retention_policy { is_locked = false retention_period = 604800 } } resource "google_storage_bucket_iam_member" "hgbundler-access-uc1" { bucket = google_storage_bucket.gcp-bundles-uc1.name role = "roles/storage.objectAdmin" member = "serviceAccount:${google_service_account.gcp-hgbundler.email}" } # Allow public read access to the world for the bundles buckets resource "google_storage_bucket_iam_member" "public-bundle-rule-uc1" { bucket = google_storage_bucket.gcp-bundles-uc1.name role = "roles/storage.objectViewer" member = "allUsers" } resource "google_storage_bucket" "gcp-bundles-uw1" { name = "moz-hg-bundles-gcp-us-west1" location = "us-west1" storage_class = "STANDARD" # Delete after 1 week inactive lifecycle_rule { action { type = "Delete" } condition { age = 7 with_state = "ANY" } } # Ensure bundles are around for 1 week minimum retention_policy { is_locked = false retention_period = 604800 } } resource "google_storage_bucket_iam_member" "hgbundler-access-uw1" { bucket = google_storage_bucket.gcp-bundles-uw1.name role = "roles/storage.objectAdmin" member = "serviceAccount:${google_service_account.gcp-hgbundler.email}" } resource "google_storage_bucket_iam_member" "public-bundle-rule-uw1" { bucket = google_storage_bucket.gcp-bundles-uw1.name role = "roles/storage.objectViewer" member = "allUsers" } resource "google_storage_bucket" "gcp-bundles-na-ne1" { name = "moz-hg-bundles-gcp-na-ne1" location = "northamerica-northeast1" storage_class = "STANDARD" # Delete after 1 week inactive lifecycle_rule { action { type = "Delete" } condition { age = 7 with_state = "ANY" } } # Ensure bundles are around for 1 week minimum retention_policy { is_locked = false retention_period = 604800 } } resource "google_storage_bucket_iam_member" "hgbundler-access-na-ne1" { bucket = google_storage_bucket.gcp-bundles-na-ne1.name role = "roles/storage.objectAdmin" member = "serviceAccount:${google_service_account.gcp-hgbundler.email}" } resource "google_storage_bucket_iam_member" "public-bundle-rule-na-ne1" { bucket = google_storage_bucket.gcp-bundles-na-ne1.name role = "roles/storage.objectViewer" member = "allUsers" }