[英]Deploying to multiple AWS accounts with Terraform?
我一直在尋找一種能夠在 Terraform 中同時部署到多個 AWS 賬戶的方法,但最終還是會枯竭。 AWS 有使用 Stacks 執行此操作的概念,但我不確定是否可以在 Terraform 中執行此操作? 如果是這樣,會有什么解決方案?
您可以在此處閱讀有關 Cloudformation 解決方案的更多信息。
您可以定義多個提供商別名,這些別名可用於在不同區域甚至不同 AWS 賬戶中運行操作。
因此,要在您的默認區域中執行某些操作(或者如果未在環境變量或~/.aws/config
定義,則會提示您執行此操作)以及在美國東部 1 中執行以下操作:
provider "aws" {
# ...
}
# Cloudfront ACM certs must exist in US-East-1
provider "aws" {
alias = "cloudfront-acm-certs"
region = "us-east-1"
}
然后你會像這樣引用它們:
data "aws_acm_certificate" "ssl_certificate" {
provider = aws.cloudfront-acm-certs
...
}
resource "aws_cloudfront_distribution" "cloudfront" {
...
viewer_certificate {
acm_certificate_arn = data.aws_acm_certificate.ssl_certificate.arn
...
}
}
因此,如果您想同時跨多個帳戶執行操作,那么您可以在另一個帳戶中扮演如下角色:
provider "aws" {
# ...
}
# Assume a role in the DNS account so we can add records in the zone that lives there
provider "aws" {
alias = "dns"
assume_role {
role_arn = "arn:aws:iam::ACCOUNT_ID:role/ROLE_NAME"
session_name = "SESSION_NAME"
external_id = "EXTERNAL_ID"
}
}
並像這樣引用它:
data "aws_route53_zone" "selected" {
provider = aws.dns
name = "test.com."
}
resource "aws_route53_record" "www" {
provider = aws.dns
zone_id = data.aws_route53_zone.selected.zone_id
name = "www.${data.aws_route53_zone.selected.name"
...
}
或者,您可以通過多種其他方式為不同的 AWS 賬戶提供憑證,例如在提供商中對其進行硬編碼或使用不同的 Terraform 變量、 AWS 開發工具包特定的環境變量或使用配置的配置文件。
我還建議將您的解決方案與Terraform 工作區相結合:
命名工作區允許在單個后端內的單個配置的多個實例之間方便地切換。 它們在許多情況下都很方便,但不能解決所有問題。
多個工作區的常見用途是創建一組基礎設施的並行、不同的副本,以便在修改主要生產基礎設施之前測試一組更改。 例如,處理一組復雜的基礎架構更改的開發人員可能會創建一個新的臨時工作區,以便在不影響默認工作區的情況下自由試驗更改。
非默認工作區通常與版本控制中的功能分支相關。 默認工作區可能對應於“master”或“trunk”分支,它描述了生產基礎設施的預期狀態。 當創建功能分支以開發更改時,該功能的開發人員可能會創建相應的工作空間並將主要基礎架構的臨時“副本”部署到其中,以便可以在不影響生產基礎架構的情況下測試更改。 一旦更改被合並並部署到默認工作區,測試基礎設施就可以被破壞並刪除臨時工作區。
AWS S3在支持的后端列表中。
它非常易於使用(類似於使用 git 分支)並將其與選定的 AWS 帳戶結合使用。
terraform workspace list
dev
* prod
staging
有關配置 AWS 提供商以使用多個帳戶的一些參考資料:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.