인프라 구축기
이전에 인프라 구축기 (3)에서 Terraform 코드를 작성할 때, 인스턴스에 사용되는 IAM 역할과 사용자는 AWS 웹에서 생성한 뒤 apply 하는 방식으로 진행했었다. Terraform으로 관리되는 리소스에게 필요한 IAM도 Terraform으로 관리하기 위해 각 디렉터리 (instance, storage)에 iam.tf를 생성하고, 리소스에 필요한 IAM을 생성하는 코드를 작성하였다. lambda에서 필요한 IAM의 경우 인프라 구축기 (8) 작성하였으니 참고하면 좋을 것 같다.
인프라 구축기 (3) - Terraform을 활용한 Instance, Storage 구성
인프라 구축기인프라 구축기 (2)에서 Terraform을 활용하여 VPC를 구성하는 코드를 작성하였다. 이어서 Instance와 Storage를 구성하는 코드를 작성해 볼 것이다. 추가로 vpc, instance, storage 폴더로 구분하
sanseo.tistory.com
인프라 구축기 (8) - Lambda를 활용한 AWS 인스턴스 시작, 중지 자동화
인프라 구축기현재 인프라를 사용하면서 지속적으로 비용이 청구되고 있다. Redshift Serverless는 가변 비용으로 쿼리 비용만을 청구하며 Bastion Host EC2는 프리티어이므로 비용이 발생하지 않지만, Ai
sanseo.tistory.com
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 |