Terraform 프로젝트: 섹션 1 - 위대한 모듈 구축
저는 Terraform을 몇 주 동안 사용했습니다. 지금까지 Terraform의 업무 방식에 대해 인상이 깊었습니다.나는 이전의 인프라 시설을 CDK에서Terraform으로 바꾸어 왔지만, 내 프로젝트 폴더가 좀 어지럽다는 것을 발견하기 시작했다.나의 최초의 계획은 모든 AWS 계정에git repo가 있고 모든 서비스에는 단독 파일이 있다는 것이다. 예를 들어 다음과 같다.
terraform-prod/
|── main.tf
|── iam.tf
|── route53.tf
└── s3.tf
그러나 나는 이런 구조 아래에서 모든 문서가 붐비고 조리가 없다는 것을 발견했다.예를 들어 route53.tf
파일은 나의 모든 영역과 기록을 가득 채웠다.나는 나의 프로젝트를 위해 더 좋은 포석을 찾으러 간다.나는 내가 찾았다고 생각한다.
더욱 모듈화된 지형 방법
마이그레이션의 일부로 Terraform 모듈을 만들었지만, 같은 모듈화 방법이 내 계정 코드 라이브러리에 적용될 수 있다는 것을 깨닫지 못했다.내가 선택한 레이아웃을 살펴보자.
terraform-prod/
|── main.tf
|── outputs.tf
└── modules
└── blog_systemsmystery_tech
| |── main.tf
| └── outputs.tf
└── dns
| |── main.tf
| └── outputs.tf
└── ses
└── main.tf
이 예에서 나는 일반적인main.tf
과outputs.tf
가 있지만 이번에는 이 블로그를 위해modules
폴더를 만들었는데 그 중에서 세 개의 서브 모듈, 내가 필요로 하는 모든 DNS 기록과 나의 SES 설정을 포함한다.본 블로그의 나머지 부분에서, 나는 내가 어떻게 나의 블로그 모듈을 조직했는지 되돌아볼 것이다.그것을 분해하다
내 모듈에는 다음과 같은 구조가 있다.
blog_systemsmystery_tech/
|── iam.tf
|── lightsail.tf
|── main.tf
|── modules.tf
|── outputs.tf
|── README.md
└── route53.tf
나는 이 문서들의 용도를 상세하게 분석할 것이다.국제 기계사 협회.tf
나는
iam.tf
내가 필요로 하는 모든 IAM 관련 프로젝트를 사용한다.일반적으로 이러한 모듈은 부팅되는 내장 모듈aws_iam_
입니다.예를 들어 저는 SES를 사용하여 블로그를 통해 보내야 할 전자메일을 마운트 해제합니다. 따라서 IAM 사용자, 액세스 키와 정책을 사용하여 블로그가 SES 서비스에 접근할 수 있도록 해야 합니다.먼저 IAM 사용자를 만들었습니다.
resource "aws_iam_user" "wordpress_ses_user" {
name = "blog_ses_user"
}
그리고 키베이스를 사용하여 접근 카드를 만듭니다. 암호화된 비밀을 제공합니다.
resource "aws_iam_access_key" "wordpress_ses_user_access_key" {
user = aws_iam_user.wordpress_ses_user.name
pgp_key = "keybase:a_keybase_user"
}
마지막으로 AWS 관리AmazonSESFullAccess
정책을 사용자에게 첨부합니다.
resource "aws_iam_policy_attachment" "wordpress_ses_policy_attachment" {
name = "wordpress_ses_policy_attachment"
users = [aws_iam_user.wordpress_ses_user.name]
policy_arn = "arn:aws:iam::aws:policy/AmazonSESFullAccess"
}
이제 IAM 사용자 설정이 있으므로 액세스 키의 출력이 필요합니다.이를 위해 outputs.tf
파일을 사용하고 액세스 키와 암호화 키의 출력을 정의합니다.
output "wordpress_ses_user_iam_access_key" {
value = aws_iam_access_key.wordpress_ses_user_access_key.id
description = "Wordpress SES user access key ID."
}
output "wordpress_ses_user_iam_encrypted_secret" {
value = aws_iam_access_key.wordpress_ses_user_access_key.encrypted_secret
description = "Wordpress SES user encrypted secret."
}
보시다시피 모든 파일이 하나의 모듈에 포함되어 있기 때문에 iam.tf
파일(또는 다른 파일)에 정의된 모든 내용을 인용하여 출력을 만들 수 있습니다.이 예에서 나는 aws_iam_access_key.wordpress_ses_user_access_key
대상을 인용한 다음에 id
와 encrypted_secret
를 사용하여 필요한 값을 얻었다.돛.tf
나의 다음 파일은 나의 모든 Lightsail 인프라를 포함한다.Terraforms에서 Lightsail 실례를 만드는 능력은 내가 그것을 사용하기로 결정한 관건적인 구동 요소 중 하나이다.먼저 Lightsail 인스턴스를 만듭니다.
resource "aws_lightsail_instance" "wordpress_instance" {
name = "wordpress"
availability_zone = "eu-west-2b"
blueprint_id = "wordpress"
bundle_id = "nano_2_0"
}
이 실례를 만들 때 두 가지를 주의해야 한다. 첫 번째는 blueprint_id
이고, 두 번째는 bundle_id
이다.명령줄에서 검색
blueprint_id
하려면 aws lightsail get-blueprints
을 실행합니다.이것은 Lightsail이 지원하는 모든 현재 청사진을 되돌려줍니다.WordPress 청사진을 사용하고 싶어서 목록을 살펴보니 다음과 같습니다.
{
"blueprintId":"wordpress",
"name":"WordPress",
"group":"wordpress",
"type":"app",
"description":"...",
"isActive":true,
"minPower":0,
"version":"5.4.2",
"versionCode":"1",
"productUrl":"https://aws.amazon.com/marketplace/pp/B00NN8Y43U",
"licenseUrl":"https://d7umqicpi7263.cloudfront.net/eula/product/7d426cb7-9522-4dd7-a56b-55dd8cc1c8d0/588fd495-6492-4610-b3e8-d15ce864454c.txt",
"platform":"LINUX_UNIX"
}
여기서부터 나는 blueprintId
를 사용하고 나의 실례 대상에서 그것을 사용한다.bundle_id
사용할 인스턴스의 크기를 선택합니다.나에게 있어서 이것은 나노의 실례 유형이거나Terraform의 nano_2_0
이다.aws_lightsail_instance 리소스의 Terraform 문서를 보면 이 값에 필요한 형식에 대한 더 많은 정보를 얻을 수 있습니다.마지막 수수께끼는 실례에 할당하고 싶은 정적 IP 주소입니다.이렇게 하려면 먼저 정적 IP를 만들고 이름을 지정한 다음 위에서 만든 객체를 참조하여 인스턴스에 추가합니다.
resource "aws_lightsail_static_ip" "wordpress_static_ip" {
name = "blog_systemsmystery_tech"
}
resource "aws_lightsail_static_ip_attachment" "wordpress_static_ip_attachment" {
static_ip_name = aws_lightsail_static_ip.wordpress_static_ip.id
instance_name = aws_lightsail_instance.wordpress_instance.id
}
모듈tf
이 프로젝트에 가져온 모듈에 단독 파일을 만들기로 결정했습니다.예를 들어 WordPress에서 나는 백업 플러그인을 사용하여 나의 모든 백업을 S3에 저장할 것이다.Home Assistant backups에 대한 게시물을 발표한 후에 write my own module를 만들기로 결정했습니다. 이 점을 실현하기 위해 모든 구성 요소를 만들 것입니다.만약 이것도 당신에게 도움이 된다면, 당신은 Terraform registry에서 나의 모듈을 찾을 수 있습니다.프로젝트에 이 모듈을 추가하여 새 리소스
module
를 만들고 필요에 따라 구성했습니다.
module "wordpress_backup_bucket" {
source = "rj175/s3-backup-bucket/aws"
version = "1.0.1"
pgp_key = "keybase:a_keybase_user"
service_name = replace(var.blog_domain, ".", "-")
}
너는 var.blog_domain
에 대한 인용에 주의할 것이다.이것은 이 자원에 전달되는 변수다.이 변수들은 내 variables.tf
파일에서 찾을 수 있으니, 나는 뒤에서 토론할 것이다.노선tf
내가 만들어야 할 마지막 인프라 구성 요소는 Route53의 DNS 기록입니다.이것은
lightsail.tf
에 정의된 정적 IP 주소를 참조하고 다른 변수를 영역 ID로 사용합니다. 이 ID는 레코드를 만드는 데 사용됩니다.
resource "aws_route53_record" "wordpress_a_record" {
name = "blog"
zone_id = var.zone_id
records = [
aws_lightsail_static_ip.wordpress_static_ip.ip_address
]
type = "A"
ttl = 300
}
매인.tf
나의 주요 직책 범위 내에서.tf 파일, 지형과 관련된 모든 설정을 저장합니다.
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "3.18.0"
}
}
}
여기서, 나는 어떤 공급자가 필요한지 (이 프로젝트에 AWS가 필요한지), 그리고 내가 사용하고 싶은 버전을 정의했다.HashiCorp에서 공급자를 업데이트할 때 문제가 발생하지 않도록 제 버전을 잠갔습니다.main.tf
파일에서 나는 내가 필요로 하는 모든 변수를 정의했다.위에서 설명한 바와 같이, 내가 필요로 하는 유일한 변수는 백업 통의 서비스 이름과 지역 ID입니다.
variable "blog_domain" {
description = "Domain name to use for blog."
type = string
}
variable "zone_id" {
description = "Zone ID to create DNS records in."
type = string
}
너는 이 변수들이 값이 없다는 것을 알아차릴 것이다.이것은 이 모듈 이외의 항목의 맨 위에 정의됩니다.결론
요컨대, 나는 이 프로젝트를 위해 로컬에서 모듈을 만들었는데, 이 블로그에 필요한 모든 구성 요소를 만들었다.다음 부분에서, 나는 당신에게 나의 주요 프로젝트에서 이 모듈을 어떻게 사용해서 생산에 배치할 준비를 하는지 보여 드리겠습니다.
다음까지 즐거운 코딩!
Reference
이 문제에 관하여(Terraform 프로젝트: 섹션 1 - 위대한 모듈 구축), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/ohheyrj/project-terraform-part-1-building-great-modules-3j28텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)