Как использовать модуль Terraform для кросс-аккаунта - PullRequest
0 голосов
/ 02 июня 2018

Я создаю codepipeline в dev_account, он запускает оба codedeploy в dev_account, test_account и prod_account, codedeploy трех учетных записей выглядит одинаково, за исключением того, что они находятся в разных учетных записях.

Ниже приведена организация моих файлов terraform.,Я использую модуль terraform для повторного использования кода, но я все еще думаю, что в моем коде много повторяющегося кода, как их оптимизировать?

common_infr/
    codepipeline.tf # dev_account has codepipeline, codedeploy 
    codedeploy.tf   
    test_account/
        codedeploy.tf # test_account has a codedeploy
    prod_account/
        codedeploy.tf # prod_account has a codedeploy
pipeline1/
    main.tf #run terraform apply here using dev account
    test_account/
        main.tf #run terraform apply here using test account
    prod_account/
        main.tf #run terraform apply here using prod account

Это pipe1 / main.tf:

module "pipeline1" {
  source       = "../common_infra"
  variable1    = "..."
  ...
}

Это pipe1 / test_account / main.tf:

module "pipeline1" {
  source       = "../../common_infra/test_account"
  variable1    = "..."
  ...
}

Это pipe1 / prod_account / main.tf:

module "pipeline1" {
  source       = "../../common_infra/prod_account"
  variable1    = "..."
  ...
}

codedeploy.tf из трех учетных записей выглядит одинаково.как это оптимизировать?

1 Ответ

0 голосов
/ 02 июня 2018

Вместо создания 3 модулей для каждой учетной записи codedeploy.tf, создайте отдельный модуль codedeploy.В файле main.tf каждого аккаунта источник codedeploy и передают провайдеру аккаунта .Вот как может выглядеть test_account.

provider "aws" {
  alias  = "test_account"
  profile = "your_profile_name_for_test_account"
}

module "pipeline1" {
  providers = {
    aws = "aws.test_account"
  }
  source       = "../../common_infra/codedeploy"
  variable1    = "..."
  ...
}

Редактирование для уточнения макета каталога.В конечном итоге вы удаляете codepipeline из common_infr и помещаете его в собственный модуль.

modules/
  codepipeline/
    codepipeline.tf
  common_infr/
    codedeploy.tf

accounts/
  test_account/
    main.tf
  prod_account/
    main.tf

test_account / main.tf:

provider "aws" {
  alias  = "test_account"
  profile = "your_profile_name_for_test_account"
}

module "pipeline1" {
  providers = {
    aws = "aws.test_account"
  }
  source       = "../modules/codepipeline"
  variable1    = "..."
  ...
}

module "common_infr" {
  providers = {
    aws = "aws.test_account"
  }
  source       = "../modules/common_infr"
  variable1    = "..."
  ...
}

prod_account / main.tf:

provider "aws" {
  alias  = "prod_account"
  profile = "your_profile_name_for_prod_account"
}

module "common_infr" {
  providers = {
    aws = "aws.prod_account"
  }
  source       = "../modules/common_infr"
  variable1    = "..."
  ...
}
...