Terraform resource (1/2)

서재민·2021년 3월 13일
0

Terraform

목록 보기
4/15

Resource

Resource 는 Terraform 의 가장 중요한 구성요소 중 하나이다.
Resource 를 선언함으로써 virtual networks, compute instance 등 다양한 infrastructure 를 생성할 수 있다.
바로 실습을 하며 어떻게 사용하는지 알아보자! 쉽게 배울 수 있다.

Resource 문법

간단한 예제를 통해 resource 문법에 대해 알아보자.

resource "aws_iam_user" "example" {
  name = "example"
}

위의 간단한 예제에서 보이듯이 resource 라는 block 을 만들어서 원하는 resource 를 생성할 수 있다.

Type, Name

"aws_iam_user" 라고 선언된 부분은 resource type 에 해당되는 부분으로 예제에서는 AWS 의 IAM User 를 생성하겠다는 뜻이다.
이 resource type 은 어떤 provider 를 사용하냐에 따라 사용할 수 있는 type 들이 달라진다. (각 provider 의 documentation 페이지에 모든 resource type 들이 나와 있다.)
"example" 이라고 선언된 부분은 resource name 에 해당되는 부분으로 특정 resource type 의 이름을 선언해준다.

resource typeresource name 을 합친건 module(혹시 모르는 분은 library 라고 생각하면 된다.) 내에서 unique 하게 사용되므로, 중복되는 값을 가질 수 없다.
예제를 통해 알아보자.

[사용가능]

resource "aws_iam_user" "example" {
  name = "example"
}

resource "aws_iam_user" "example2" {
  name = "hi"
}

resource "aws_vpc" "example" {
  cidr_block = "10.0.0.0/16"
}

"aws_iam_uer" resource type 이 2번 사용되었는데, 2개가 각각 다른 이름을("example", "example2") 가지고 있으므로 문제가 없다.
"aws_vpc" resource type 은 기존에 사용된 "example" 이라는 이름과 함께 사용되었지만 서로 다른 type 에서 사용되었기 때문에 문제가 없다.

[사용 불가능]

resource "aws_iam_user" "example" {
  name = "example"
}

resource "aws_iam_user" "example" {
  name = "hi"
}

동일한 "aws_iam_user" 에서 동일한 이름을("example") 사용하였으므로 error 가 발생한다.


이제 `resource` block 안의 내용에 대해 살펴보자.

Arguments

resource block 안에는 해당 resource 를 생성하기 위한 정보인 arguments 가 들어간다.
예제를 보면 name = "example" 이렇게 선언이 되어있는데 IAM user 의 이름을 "example" 로 하겠다는 뜻이다.
Arguments 에 대한 정보는 어디서 얻을 수 있을까?
물론 사용하는 provider 의 documentation 페이지에서 해당 resource 를 선택하면 볼 수 있다.
예제에서 사용한 "aws_iam_user" 의 documentation page 로 이동해서 살펴보자.
기본적으로 해당 resource 를 사용하는 example 이 나와있고, 조금 더 아래로 내려가보면 Argument Reference 으로 사용가능한 argument list 가 나와있다. (편의를 위해 이미지를 첨부한다.)

List 를 보면 사용할 수 있는 모든 arguments 가 나오고 각각의 argument 옆에는 (Required) 또는 (Optional) 로 표시가 되어있다.
써있는 그대로 Required 는 resource 를 생성하기 위해 반드시 명시되어야 하는 argument 를 뜻하고, Optional 은 추가적으로 resource 의 세부사항을 control 하고 싶을때 사용을 하면 된다.
이것도 예시 코드와 함께 확인해 보겠다.

[Required, Optional 함께 사용]

resource "aws_iam_user" "example" {
  name = "example"
  path = "/system/"
}

"example" 이란 IAM user 가 default path 인 "/" 가 아니라 "/system/" path 와 함께 생성된다.

[Required 없이 사용, Error!]

resource "aws_iam_user" "example" {
  path = "/system/"
}

Required argument 를 사용하지 않았으므로 error 가 발생한다.

Attributes

Arguments 가 resource 를 생성하기 위한 input 이라고 생각한다면, output 에 해당하는 Attributes 에 대해 알아보자.
resource documentation 에 list 가 나와있으며, Arguments 와 동일하게 예제에서 사용한 "aws_iam_user" 의 documentation page 로 이동해서 살펴보자.
Argument Reference 밑으로 내려가면 Attributes Reference 에 사용가능한 list 를 확인할 수 있다. (편의를 위해 이미지를 첨부한다.)

이미지에서 확인 할 수 있듯이 aws_iam_user 는 3개의 attributes 를 가진다.
Attributes 는 참조가 가능하기 때문에 필요한 곳 어디에서든지 사용이 가능하다.
간단하게 다른 resource 에서 참조하는 예제를 통해 확인해 보자.

resource "aws_iam_user" "example" {
  name = "example"
}

resource "aws_s3_bucket" "example" {
  bucket = aws_iam_user.example.name
}

aws_s3_bucket resource 의 bucket name 을 선언하는 곳을 보면 attributes 를 참조하는 방법에 대해 확인할 수 있다.
<RESOURCE TYPE>.<NAME>.<ATTRIBUTE>attributes 를 참조하는 문법이며, 위의 예제에서는 aws_iam_user resource type 의 example 이름을 가진 resource 를 선택해서 name attribute 를 참조하고 있다.
위의 예제의 코드로 terraform apply 를 해보면 생성되는 s3 의 bucket 이름은 iam user 의 이름인 "example" 로 생성됨을 확인할 수 있다.

마무리

지금까지 resource 를 code 로 작성하는 방법에 대해 알아보았다.
다음 포스트에서는 resource 2탄으로 Meta-Arguments 에 대해 알아보겠다.


[참고]

https://www.terraform.io/docs/configuration/blocks/resources/syntax.html

profile
Software engineer

0개의 댓글