이 글은 inflearn의 "처음 시작하는 Infrastructure as Code: AWS & 테라폼" 강의를 바탕으로 작성되었습니다!
테라폼 명령어 프로세스는 다음과 같이 진행된다.
init --> plan --> apply
1. 작성한 코드에서 init 명령으로 내부적으로 설정 되어 있는 provider와 state, module 설정들을 진행한다.
2. 실제로 작성한 테라폼 코드가 어떻게 만들어질지에 대한 예측 결과를 본다. plan에 문제가 없어야 apply에 문제가 없을 확률이 높다.
항상 plan 명령어를 습관화 해야 한다.
3. 실제로 작성한 코드로 명령어를 생성하는 명령어이다. 주의깊게 실행해야 함
provider "aws" {
region = "ap-northeast-2"
}
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
tags = {
Name = "terraform-101"
}
}
resource "aws_subnet" "first_subnet" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.1.0/24"
availability_zone = "ap-northeast-2a"
tags = {
Name = "101subnet-1"
}
}
resource "aws_subnet" "second_subnet" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.2.0/24"
availability_zone = "ap-northeast-2b"
tags = {
Name = "101subnet-2"
}
}
특정 역할(EC2, Lambda, ECS 등 실행 주체)이 AWS 리소스에 어떤 행동을 할 수 있는지를 정의한 권한 규칙
iam role은 권한을 주는 역할을 하고 policy는 권한에 대한 구체적인 내용이 들어간다.
resource "aws_iam_role" "hello" {
name = "hello-iam-role"
path = "/"
assume_role_policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
EOF
}
핵심: 신뢰 정책(assume_role_policy)은 “주체(누가 맡나)”를 정의하고,
권한 정책(permissions policy)은 “권한(뭘 할 수 있나)”을 정의한다.
지금 리소스는 누가 맡나만 정의했기 때문에, 권한 정책을 추가로 붙여야 실제로 무언가를 할 수 있다.
resource "aws_iam_role_policy" "hello_s3" {
name = "hello-s3-download"
role = aws_iam_role.hello.id
policy = <<EOF
{
"Statement": [
{
"Sid": "AllowAppArtifactsReadAccess",
"Action": [
"s3:*"
],
"Resource": [
"*"
],
"Effect": "Allow"
}
]
}
EOF
}
resource "aws_iam_instance_profile" "hello" {
name = "hello-profile"
role = aws_iam_role.hello.name
}
테라폼이 사용하는 값들을 변수로 만들어서 유지 보수가 쉽게 만들어준다. 구조가 같은 두 개의 아키텍쳐라면 구조는 그대로 두고 안의 변수만 tfvars 파일의 값을 바꾸면서 사용이 가능하다.
variables.tf
variable "iam_user_list" {
type = list(string)
}
terraform.tfvars
iam_user_list = ["test"]
resource "aws_iam_group" "devops_group" {
name = "devops"
}
resource "aws_iam_group_membership" "devops" {
name = aws_iam_group.devops_group.name
users = var.iam_user_list
group = aws_iam_group.devops_group.name
}
| Terraform으로 EC2에 백엔드 서버 배포 (with ECR) 5장 main.tf (0) | 2025.09.01 |
|---|---|
| Terraform으로 EC2에 백엔드 서버 배포 (with ECR) 4장 Security Group 모듈 (0) | 2025.08.23 |
| Terraform으로 EC2에 백엔드 서버 배포 (with ECR) 3장 IAM 모듈 (0) | 2025.08.23 |
| Terraform으로 EC2에 백엔드 서버 배포 (with ECR) 2장 ECR 모듈 (0) | 2025.08.20 |
| Terraform으로 EC2에 백엔드 서버 배포 (with ECR) 1장 EC2 모듈 (0) | 2025.08.20 |