인프라 구축기
이전에 인프라 구축기 (3)에서 Terraform 코드를 작성할 때, 인스턴스에 사용되는 IAM 역할과 사용자는 AWS 웹에서 생성한 뒤 apply 하는 방식으로 진행했었다. Terraform으로 관리되는 리소스에게 필요한 IAM도 Terraform으로 관리하기 위해 각 디렉터리 (instance, storage)에 iam.tf를 생성하고, 리소스에 필요한 IAM을 생성하는 코드를 작성하였다. lambda에서 필요한 IAM의 경우 인프라 구축기 (8) 작성하였으니 참고하면 좋을 것 같다.
AWS 웹에서 생성했던 IAM
IAM 사용자
- Airflow Connection을 활용해 S3에 접근하기 위해 생성
IAM 정책 & 역할
- Airflow EC2에서 S3에 접근하기 위한 정책과 역할 생성
- Redshift Serverless에서 S3에 접근하기 위한 정책과 역할 생성
IAM 생성 코드 추가
Airflow EC2 -> S3 접근을 위한 사용자 및 정책과 역할은 instance/iam.tf에 작성하였고, Redshift Serverless -> S3 접근을 위한 정책과 역할은 storage/iam.tf에 작성하였다.
instance/iam.tf
- IAM 역할 생성 : ec2에서 사용될 역할 생성 (ec2.amazonaws.com)
resource "aws_iam_role" "airflow_ec2_role" {
name = "popboard-ec2-role"
description = "Allows EC2 instances to call AWS services on your behalf."
assume_role_policy = jsonencode({
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Service": "ec2.amazonaws.com" },
"Action": "sts:AssumeRole"
}
]
})
}
- IAM 사용자 생성
resource "aws_iam_user" "s3_access_user" {
name = "popboard-s3-access"
path = "/"
}
- IAM 정책 생성 : AmazonS3FullAccess 권한을 가진 정책 생성
resource "aws_iam_policy" "ec2_s3_policy" {
name = "popboard-ec2-s3-policy"
path = "/"
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Action = [
"s3:*",
"s3-object-lambda:*"
]
Effect = "Allow"
Resource = "*"
}
]
})
}
- 생성한 정책을 사용자, 역할에 연결
resource "aws_iam_policy_attachment" "ec2_s3_policy" {
name = "popboard-ec2-s3-policy"
roles = [aws_iam_role.airflow_ec2_role.name]
users = [aws_iam_user.s3_access_user.name]
policy_arn = aws_iam_policy.ec2_s3_policy.arn
}
storage/iam.tf
- IAM 역할 생성 : redshift serverless에서 사용될 역할 생성 (redshift.amazonaws.com)
resource "aws_iam_role" "redshift_role" {
name = "popboard-redshift-role"
assume_role_policy = jsonencode({
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Service": "redshift.amazonaws.com" },
"Action": "sts:AssumeRole"
}
]
})
}
- IAM 정책 생성 : AmazonS3FullAccess 권한을 가진 정책 생성
resource "aws_iam_policy" "redshift_s3_policy" {
name = "popboard-redshift-s3-policy"
path = "/"
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Action = [
"s3:*",
"s3-object-lambda:*"
]
Effect = "Allow"
Resource = "*"
}
]
})
}
- 생성한 정책을 역할에 연결
resource "aws_iam_policy_attachment" "redshift_s3_policy" {
name = "popboard-redshift-s3-policy"
roles = [aws_iam_role.redshift_role.name]
policy_arn = aws_iam_policy.redshift_s3_policy.arn
}
terraform import
이미 AWS 웹에서 생성한 리소스이기 때문에 apply로 적용하기 전에 import로 AWS와 일치하도록 맞춰주었다. 정책의 경우 apply를 적용한 뒤 이전에 적용된 정책을 제거하는 식으로 작업하였다.
terraform import aws_iam_role.redshift_role <iam role arn>
terraform import aws_iam_role.airflow_ec2_role <iam role arn>
terraform import aws_iam_user.s3_access_user <iam user id>
'Infra > [인프라 구축기] Terraform 활용 AWS 인프라 구축' 카테고리의 다른 글
인프라 구축기 (12) - S3에 있는 Terraform 상태 파일 활용하기 (0) | 2024.11.02 |
---|---|
인프라 구축기 (11) - lambda IAM role 수정 (1) | 2024.10.29 |
인프라 구축기 (9) - Terraform terraform.tfstate 삭제 이슈 (0) | 2024.10.24 |
인프라 구축기 (8) - Lambda를 활용한 AWS 인스턴스 시작, 중지 자동화 (1) | 2024.10.19 |
인프라 구축기 (7) - Airflow 및 Redshift 사용자 생성, 권한 설정 (1) | 2024.10.18 |