Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

Data Sources

인프라는 여러가지 데이터를 만들어낸다. 서울리전에 인프라를 구축해야 한다고 가정해보자. VPC는 3개의 가용영역을 이용해서 구성할 거다. 가용영역은 아래와 같이 변수로 설정 할 수도 있을 것이다.

별로 좋은 방법은 아니다. 데이터 소스를 이용하면 인프라 데이터를 가져와서 사용 할 수 있다. 예를 들어 위 코드는 아래와 같이 수정 할 수 있다.

데이터 소스의 사용

데이터 소스는 아래와 같이 사용 할 수 있다.
  • aws_ami : 데이터 소스 이름이다.
  • example : 로컬 이름이다. AWS Provider에서 읽은 aws ami 데이터를 example 로 보내도록 요청한다.
데이터 소스와 이름은 자원의 식별자로 모듈내에서 유일해야 한다. 개발자는 블럭("{}")안에 쿼리 제한 조건을 설정 할 수 있다. 쿼리 조건은 데이터소스에 따라 다르다. 이 예제에서 사용한 owners , most_recent는 aws_ami 리소스에서만 사용하는 인수다.

리소스는 테라폼이 인프라 스트럭처를 생성,삭제,업데이트 하는 반면 데이터 소스는 만들어진 리소스의 데이터를 단지 읽을 수만 있다는 차이가 있다.

예제

리전의 가용영역(availability zone)의 정보를 데이터 소스를 이용해서 가져오도록 수정해보자. aws_availability_zones는 가용영역 데이터를 수집 할 수 있다.

데이터 소스는 존재하는 인프라로 부터, 데이터를 가져오기 때문에 plan을 통해서 리소스를 전개해야 한다. output 명령으로 데이터 소스를 출력해보자.
# terraform output 
availability_zones_list = [
    ap-northeast-2a,
    ap-northeast-2b,
    ap-northeast-2c
]
서울 리전을 구성하는 3개의 가용영역 목록을 확인 할 수 있다.

terraform console로 테스트 해보자.
# terraform console
> "${data.aws_availability_zones.available.names}"
[
  "ap-northeast-2a",
  "ap-northeast-2b",
  "ap-northeast-2c",
]

> length(data.aws_availability_zones.available.names)
3

> "${data.aws_availability_zones.available.names[0]}"
ap-northeast-2a

이제 하드코딩 하지 않고, 리전만 설정하는 것으로 가용영역을 사용 할 수 있게 됐다. 이전에 하드 코딩했던 VPC Subnet을 데이터 소스 기반으로 아래와 같이 수정했다. 데이터 소스 사용방법을 학습하는게 목표라서 인터넷 게이트웨이, 라우팅 테이블 설정 등은 넣지 않았다. 테라폼을 적용한후, 인프라가 제대로 구성됐는지 확인했다.
# aws --profile joinc  ec2 describe-vpcs --max-items 10
{
    "Vpcs": [
        {
            "VpcId": "vpc-0c8b2f21e99b5fbc", 
            "InstanceTenancy": "default", 
            "Tags": [
                {
                    "Value": "test-vpc", 
                    "Key": "Name"
                }
            ], 
            "CidrBlockAssociationSet": [
                {
                    "AssociationId": "vpc-cidr-assoc-0c1030ab863efde63", 
                    "CidrBlock": "10.5.0.0/16", 
                    "CidrBlockState": {
                        "State": "associated"
                    }
                }
            ], 
            "State": "available", 
            "DhcpOptionsId": "dopt-a08528cb", 
            "OwnerId": "016355928008", 
            "CidrBlock": "10.5.0.0/16", 
            "IsDefault": false
        }
    ]
}

서브넷을 확인해 보자.
# aws --profile joinc  ec2 describe-subnets --filters "Name=vpc-id,Values=vpc-0c8b2f21e199b5fbc"
{
    "Subnets": [
        {
            "MapPublicIpOnLaunch": false, 
            "AvailabilityZoneId": "apne2-az2", 
            "Tags": [
                {
                    "Value": "Subnet ap-northeast-2b", 
                    "Key": "Name"
                }
            ], 
            "AvailableIpAddressCount": 251, 
            "DefaultForAz": false, 
            "SubnetArn": "arn:aws:ec2:ap-northeast-2:016355928008:subnet/subnet-06a5b666e918fc52d", 
            "Ipv6CidrBlockAssociationSet": [], 
            "VpcId": "vpc-c8b2f21e199b5fbc", 
            "State": "available", 
            "AvailabilityZone": "ap-northeast-2b", 
            "SubnetId": "subnet-06a5b666e918fc52d", 
            "OwnerId": "016355928008", 
            "CidrBlock": "10.5.1.0/24", 
            "AssignIpv6AddressOnCreation": false
        }, 
        {
            "MapPublicIpOnLaunch": false, 
            "AvailabilityZoneId": "apne2-az3", 
            "Tags": [
                {
                    "Value": "Subnet ap-northeast-2c", 
                    "Key": "Name"
                }
            ], 
            "AvailableIpAddressCount": 251, 
            "DefaultForAz": false, 
            "SubnetArn": "arn:aws:ec2:ap-northeast-2:016355928008:subnet/subnet-00497aca46d6d122b", 
            "Ipv6CidrBlockAssociationSet": [], 
            "VpcId": "vpc-c8b2f21e199b5fbc", 
            "State": "available", 
            "AvailabilityZone": "ap-northeast-2c", 
            "SubnetId": "subnet-00497aca46d6d122b", 
            "OwnerId": "016355928008", 
            "CidrBlock": "10.5.2.0/24", 
            "AssignIpv6AddressOnCreation": false
        }, 
        {
            "MapPublicIpOnLaunch": false, 
            "AvailabilityZoneId": "apne2-az1", 
            "Tags": [
                {
                    "Value": "Subnet ap-northeast-2a", 
                    "Key": "Name"
                }
            ], 
            "AvailableIpAddressCount": 251, 
            "DefaultForAz": false, 
            "SubnetArn": "arn:aws:ec2:ap-northeast-2:016355928008:subnet/subnet-037ff37281a6128dc", 
            "Ipv6CidrBlockAssociationSet": [], 
            "VpcId": "vpc-c8b2f21e199b5fbc", 
            "State": "available", 
            "AvailabilityZone": "ap-northeast-2a", 
            "SubnetId": "subnet-037ff37281a6128dc", 
            "OwnerId": "016355928008", 
            "CidrBlock": "10.5.0.0/24", 
            "AssignIpv6AddressOnCreation": false
        }
    ]
}

성공. 현재 구성은 아래와 같다.

 구성도

정리

  • terraform data source를 이용해서 인프라의 정보를 가져올 수 있다.
  • 외부(s3 같은)에서 데이터를 읽어서 처리해보자.