【问题标题】:How to use Terraform Module for cross-account work如何使用 Terraform 模块进行跨账户工作
【发布时间】:2018-06-05 04:47:27
【问题描述】:

我在 dev_account 创建了一个 codepipeline,它在 dev_account、test_account 和 prod_account 都触发了 codedeploy,三个帐户的 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

这是 pipeline1/main.tf:

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

这是 pipeline1/test_account/main.tf:

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

这是 pipeline1/prod_account/main.tf:

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

三个帐户的 codedeploy.tf 看起来相同。如何优化?

【问题讨论】:

    标签: terraform aws-codepipeline


    【解决方案1】:

    不要为每个帐户的 codedeploy.tf 创建 3 个模块,而是创建一个 codedeploy 模块。在每个帐户的 main.tf 中,获取 codedeploy 模块和 pass in the account's provider。这是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    = "..."
      ...
    }
    

    编辑以详细说明目录布局。最终,您将从 common_infr 中删除 codepipeline 并将其放入自己的模块中。

    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    = "..."
      ...
    }
    

    【讨论】:

    • justMiles:感谢您回答我!你的 common_infra 结构是什么?您的代码管道在结构中的什么位置?你的意思是结构变成了 common_infra/codepipeline.tf 和 common_infra/codedeploy/codedeploy.tf?注意当我在 dev_account 中应用 terraform 时,我想同时创建 codepipeline 和 codedeploy。但是当我在 test_account 和 prod_account 中应用 terraform 时,应该只在那里创建 codedeploy,
    • justMiles:此外,使用您的解决方案,我需要在 dev_account 中运行两次吗?一次到源:common_infra/codepipeline 用于获取代码管道,一次到源:common_infra/codedeploy 以便在 dev_account 获得 codedeploy?谢谢。
    • @user389955,你只会运行一次。我用目录布局的样子更新了我的评论。
    • justMiles:哦,我现在明白你的意思了。很高兴知道我可以这样做。我会验证它是否有效。感谢您的帮助!
    猜你喜欢
    • 2020-05-03
    • 2022-09-25
    • 2020-02-27
    • 2020-05-17
    • 1970-01-01
    • 2020-01-20
    • 2018-08-02
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多