이번 포스트는 테라폼으로 IAM정책 및 리소스를 관리하는 방법이다.
📌 서론
AWS EC2 인스턴스 생성과 함께 관련된 IAM 사용자 및 S3 버킷을 만들어보는 내용이며 S3 버킷에 대한 액세스를 허용하는 IAM 정책을 생성하고, 해당 정책을 새 IAM 사용자에게 연결하는 과정을 설명하도록 하겠다.
1. IAM 정책 리소스 검토
IAM 정책 리소스 코드 분석
- 아래의 코드는 Terraform을 사용하여 IAM 정책을 정의한다. 이 코드는 S3 버킷에 대한 권한을 정의하고 있다.
resource "aws_iam_policy" "policy" {
name = "${random_pet.pet_name.id}-policy"
description = "My test policy"
policy = <<EOT
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:ListAllMyBuckets"
],
"Effect": "Allow",
"Resource": "*"
},
{
"Action": [
"s3:*"
],
"Effect": "Allow",
"Resource": "${aws_s3_bucket.bucket.arn}"
}
]
}
EOT
}
EOT가 뭘까?
코드에 EOT라는 게 적혀있는데 종종 이 문법을 잘못 사용하여 오류가 발생하는 경우가 있어 간단히 설명한다. EOT는 "End Of Text"의 약자로, Terraform을 포함한 많은 프로그래밍 언어에서 사용되는 'Here Document' 또는 'Heredoc' 구문의 일부다. 이 구문은 멀티 라인 문자열이나 코드 블록을 정의하는 데 사용된다.
구문의 시작과 끝
- EOT를 사용하는 구문은 <<EOT로 시작하고 EOT로 끝난다. <<EOT는 문자열이나 코드 블록의 시작을 알리고, EOT는 그 끝을 나타낸다.
멀티 라인 문자열
- EOT 구문을 사용하면 여러 줄에 걸쳐 긴 문자열을 쉽게 정의할 수 있다. 이는 특히 JSON 구조나 복잡한 스크립트를 작성할 때 유용하다.
유연성
- EOT 내에서는 일반 텍스트와 함께 변수나 표현식을 사용할 수 있어 코드의 동적인 부분을 포함할 수 있다. 이를 통해 코드의 가독성과 유지보수성을 높일 수 있다.
사용예시
- aws_instance 리소스의 user_data 속성을 정의하기 위해 EOT 구문을 사용했다. 이 구문을 통해 여러 줄에 걸친 Bash 스크립트를 명확하게 정의할 수 있다.
resource "aws_instance" "example" {
user_data = <<EOT
#!/bin/bash
echo "Hello, Terraform!"
EOT
}
2. IAM 정책 리팩토링하기
"aws_iam_policy_document" 데이터 소스 코드 작성하기
- aws_iam_policy_document 데이터 소스 코드를 생성하여 HCL로 IAM 정책 문서의 JSON 표현을 생성한다. 아래의 코드처럼 aws_iam_policy_document 데이터 소스를 사용하여 IAM 정책을 정의한다.
data "aws_iam_policy_document" "example" {
statement {
actions = ["s3:ListAllMyBuckets"]
resources = ["arn:aws:s3:::*"]
effect = "Allow"
}
statement {
actions = ["s3:*"]
resources = [aws_s3_bucket.bucket.arn]
effect = "Allow"
}
}
기존의 "aws_iam_policy" 리소스를 "aws_iam_policy_document" 데이터 소스로 리팩토링
- 이 코드 예시는 기존의 IAM 정책을 HCL(Human-readable Configuration Language) 기반의 aws_iam_policy_document 데이터 소스로 리팩토링하는 방법을 보여준다. - 기호는 제거된 코드를, + 기호는 추가된 새 코드를 나타낸다. 이 리팩토링을 통해, 기존의 policy 항목들이 제거되고, aws_iam_policy_document 데이터 소스를 사용하는 새롭게 작성된 policy가 추가되었다.
resource "aws_iam_policy" "policy" {
name = "${random_pet.pet_name.id}-policy"
description = "My test policy"
- policy = <<EOT
- {
- "Version": "2012-10-17",
- "Statement": [
- {
- "Action": [
- "s3:ListAllMyBuckets"
- ],
- "Effect": "Allow",
- "Resource": "*"
- },
- {
- "Action": [
- "s3:*"
- ],
- "Effect": "Allow",
- "Resource": "${aws_s3_bucket.bucket.arn}"
- }
- ]
- }
- EOT
+ policy = data.aws_iam_policy_document.example.json
}
3. IAM 정책 연결하기
정책 연결 resource 작성하기
- main.tf 파일에 새 IAM 정책을 사용자에게 연결하는 리소스를 추가하는 과정은 Terraform의 핵심적인 단계 중 하나다. Terraform에서 사용자와 IAM 정책을 연결하는 가장 표준적인 방법은 aws_iam_user_policy_attachment 리소스를 사용하는 것이다. 이 리소스를 사용하면 특정 IAM 사용자에게 IAM 정책을 직접 연결할 수 있다. 이때, user 속성은 연결할 사용자의 이름을, policy_arn 속성은 연결할 정책의 Amazon Resource Name (ARN)을 지정한다.
resource "aws_iam_user_policy_attachment" "attachment" {
user = aws_iam_user.new_user.name # 연결할 IAM 사용자의 이름
policy_arn = aws_iam_policy.policy.arn # 연결할 정책의 ARN
}
다양한 방식의 IAM 정책 연결
그룹에 정책 연결 (group)
- "aws_iam_group_policy_attachment" 리소스는 IAM 그룹에 정책을 연결할 때 사용된다. 이는 그룹에 속한 모든 사용자에게 동일한 정책을 적용할 때 유용하다.
역할에 정책 연결 (role)
- "aws_iam_role_policy_attachment" 리소스는 IAM 역할에 정책을 연결할 때 사용된다. 이는 특정 역할을 수행하는 사용자나 서비스에 정책을 적용할 때 적합하다.
개별 사용자에 정책 연결 (user)
- "aws_iam_user_policy_attachment" 리소스는 개별 사용자에게 직접 정책을 연결할 때 사용된다. 이 방법은 특정 사용자에게만 특정 권한을 부여할 때 적절하다.
4. 사용자, 버킷 및 정책 생성 (init, apply) 후 테스트
Terraform 구성을 초기화하고 변경 사항을 적용하기
terraform init
terraform apply
적용을 한 후에는 AWS 정책 시뮬레이터를 사용하여 IAM 정책을 테스트한다. 이 부분은 내가 참고한 공식 페이지의 가이드북 하단의 내용을 보고 따라 해 보도록 하자
테라폼으로 오토 스케일링 그룹과 로드 밸런서를 설정해 보자👇🏻👇🏻
이 포스트는 Team chillwave에서 사이드 프로젝트 중 적용했던 부분을 다시 공부하며 기록한 것입니다.
시간이 괜찮다면 팀원 '평양냉면7 '님의 블로그도 한번 봐주세요 :)
'AWS > 테라폼(Terraform)' 카테고리의 다른 글
실전! 테라폼 정복기 1편 - 테라폼(Terraform) 모듈화 (1) | 2023.12.09 |
---|---|
테라폼(Terraform) 사용 가이드 7: AutoScailingGroup과 LoadBalancer을 생성하고 연결하기 (0) | 2023.12.07 |
테라폼(Terraform) 사용 가이드 5: variable/output(입출력 변수) 사용하기 (1) | 2023.12.05 |
테라폼(Terraform) 사용 가이드 4: 생성된 AWS EC2 인스턴스 파괴하기 (0) | 2023.12.05 |
테라폼(Terraform) 사용 가이드 3: EC2 생성하기 (0) | 2023.12.04 |