이번 포스트는 테라폼으로 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 정책을 테스트한다. 이 부분은 내가 참고한 공식 페이지의 가이드북 하단의 내용을 보고 따라 해 보도록 하자
Create IAM policies | Terraform | HashiCorp Developer
Use Terraform to apply policy permissions to IAM user and S3 bucket resources. Refactor your policy with the IAM policy document data source to automatically format your JSON policies for reuse.
developer.hashicorp.com
테라폼으로 오토 스케일링 그룹과 로드 밸런서를 설정해 보자👇🏻👇🏻
테라폼(Terraform) 사용 가이드 7: AutoScailingGroup과 LoadBalancer을 생성하고 연결하기
이번 포스트에서는 테라폼으로 AutoScailing을 적용시켜 보자 📌 서론 Auto Scailing Group을 테라폼으로 사용하려면 어떻게 해야 할까? 이번 포스트를 통해 테라폼으로 ASG를 생성하고 로드 밸런서까지
curiousjinan.tistory.com
이 포스트는 Team chillwave에서 사이드 프로젝트 중 적용했던 부분을 다시 공부하며 기록한 것입니다.
시간이 괜찮다면 팀원 '평양냉면7 '님의 블로그도 한번 봐주세요 :)
하다보니 재미있는 개발
하다 보니 재미있는 개발에 빠져있는 중입니다. 문의사항: ysoil8811@gmail.com
yijoon009.tistory.com
'테라폼(Terraform)' 카테고리의 다른 글
실전! 테라폼 정복기 1편 - 테라폼(Terraform) 모듈화 (2) | 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 |