테라폼 데이터 소스 이해 - AWS 규범적 지침

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

테라폼 데이터 소스 이해

배포 스택이 기존 리소스의 데이터에 의존하는 것은 매우 일반적입니다. 대부분의 IaC 도구에는 다른 프로세스에서 만든 리소스를 가져오는 방법이 있습니다. 이렇게 가져온 리소스는 대개 읽기 전용이며 (IAM 역할은 예외임) 스택 내 리소스에 필요한 데이터에 액세스하는 데 사용됩니다. AWS CloudFormation 리소스를 가져올 수 있지만, 를 보면 이 아이디어를 더 잘 설명할 수 있습니다. AWS Cloud Development Kit (AWS CDK)

개발자가 기존 프로그래밍 언어를 사용하여 CloudFormation 템플릿을 생성하는 AWS CDK 데 도움이 됩니다. AWS CDK 작업의 최종 결과는 가져온 리소스입니다 CloudFormation. 그러나 와 함께 사용되는 구문을 AWS CDK 사용하면 Terraform과 더 쉽게 비교할 수 있습니다. 다음은 를 사용하여 리소스를 가져오는 예제입니다. AWS CDK

const importedBucket: IBucket = Bucket.fromBucketAttributes( scope, "imported-bucket", { bucketName: "My_S3_Bucket" } );

가져온 리소스는 일반적으로 같은 종류의 새 리소스를 만들 때 사용하는 것과 동일한 클래스에서 정적 메서드를 호출하여 만들어집니다. 를 new Bucket(... 호출하면 새 리소스가 생성되고, 호출하면 기존 리소스를 Bucket.fromBucketAttributes(... 가져옵니다. 올바른 버킷을 찾을 AWS CDK 수 있도록 버킷 속성의 하위 집합을 함수에 전달합니다. 하지만 또 다른 차이점은 새 버킷을 만들면 모든 속성과 메서드를 사용할 수 있는 Bucket 클래스의 전체 인스턴스가 반환된다는 것입니다. 리소스를 가져오면 Bucket 반드시 있어야 하는 속성만 포함하는 IBucket 유형인 an이 반환됩니다. 외부 스택에서 리소스를 가져올 수는 있지만 리소스로 수행할 수 있는 작업은 제한적입니다.

Terraform에서는 데이터 소스를 사용하여 유사한 목표를 달성합니다. 대부분의 정의된 Terraform 리소스에는 함께 사용할 수 있는 데이터 소스가 함께 제공됩니다. 다음은 Terraform S3 버킷 리소스와 해당 데이터 소스의 예입니다.

# S3 Bucket resource: resource "aws_s3_bucket" "My_S3_Bucket" { bucket = "My_S3_Bucket" } # S3 Bucket data source: data "aws_s3_bucket" "My_S3_Bucket" { bucket = "My_S3_Bucket" }

이 두 항목의 유일한 차이점은 이름 접두사입니다. 데이터 원본 설명서에서 볼 수 있듯이 데이터 원본에 전달할 수 있는 매개 변수는 리소스보다 적습니다. 이는 리소스가 이러한 파라미터를 사용하여 새 S3 버킷의 모든 속성을 선언하는 반면, 데이터 원본에는 기존 리소스의 데이터를 고유하게 식별하고 가져오기에 충분한 정보만 필요하기 때문입니다.

Terraform 리소스와 데이터 소스 구문 간의 유사성은 편리할 수 있지만 문제가 될 수도 있습니다. 초보 Terraform 개발자는 구성에서 실수로 리소스 대신 데이터 소스를 사용하는 경우가 많습니다. Terraform 데이터 소스는 항상 읽기 전용입니다. 읽기 작업 (예: 다른 리소스에 ID 이름 제공) 에 해당 리소스 대신 사용할 수 있습니다. 하지만 기본 리소스의 일부 측면을 근본적으로 변경하는 쓰기 작업에는 사용할 수 없습니다. 이러한 이유로 Terraform 데이터 소스는 기본 리소스의 복제된 버전이라고 생각할 수 있습니다.

이전 AWS CDK iBucket 예제와 마찬가지로 데이터 소스는 읽기 전용 시나리오에 유용합니다. 기존 리소스에서 데이터를 가져와야 하지만 해당 리소스를 스택 내에 유지할 필요가 없는 경우 데이터 소스를 사용하십시오. 계정의 기본 VPC를 사용하는 Amazon EC2 인스턴스를 생성하는 경우를 좋은 예로 들 수 있습니다. VPC는 이미 존재하므로 데이터를 가져오기만 하면 됩니다. 다음 코드 샘플은 데이터를 사용하여 대상 VPC를 식별하는 방법을 보여줍니다.

data "aws_vpc" "default" { default = true } resource "aws_instance" "instance1" { ami = "ami-123456" instance_type = "t2.micro" subnet_id = data.aws_vpc.default.main_route_table_id }