인프라 구축기
인프라 구축기 (8)에서 lambda의 IAM role을 설정할 때, 아래와 같이 AmazonEC2FullAcess와 AmazonRDSFullAccess를 적용하였다. 인프라 구축기 (10)에서 instance와 storage의 IAM role을 Terraform으로 적용할 때는 AmazonS3FullAccess를 사용하였다. 그런데 instance와 storage에서 같은 정책인 AmazonS3FullAccess를 사용하고, 하나를 apply 하면 다른 하나의 역할에서 정책이 사라져 버리는 이슈가 생겼다. "aws_iam_policy_attachment"를 적용할 때, roles나 users가 추가되는 것이 아니라 갱신되는 형태인 것 같았다. 종류 (lambda, storage, instance, vpc) 별로 iam을 분리해 놓은 상태였기 때문에 이슈를 해결하기 위해 각 역할에 대한 정책을 생성하고 연결해 주는 방식을 사용하였다.
- 인프라 구축기 (10)에서는 이슈를 해결한 코드를 작성 (storage, instance)
- 인프라 구축기 (8)에서 동작에는 이상이 없지만, 확장성을 위해 수정할 예정 (lambda)
- 여기서는 lambda의 iam.tf를 수정한 것을 적어보려고 함
- 참고 : lambda/iam_role.tf -> lambda/iam.tf로 변경
# lambda/iam.tf
resource "aws_iam_policy_attachment" "lambda_ec2_policy" {
name = "popboard-lambda-ec2-policy"
roles = [aws_iam_role.lambda_exec_role.name]
policy_arn = "arn:aws:iam::aws:policy/AmazonEC2FullAccess"
}
resource "aws_iam_policy_attachment" "lambda_rds_policy" {
name = "popboard-lambda-rds-policy"
roles = [aws_iam_role.lambda_exec_role.name]
policy_arn = "arn:aws:iam::aws:policy/AmazonRDSFullAccess"
}
IAM role 변경 사항
lambda/iam.tf
- IAM 역할 생성 : redshift serverless에서 사용될 역할 생성 (lambda.amazonaws.com)
resource "aws_iam_role" "lambda_exec_role" {
name = "popboard-lambda-exec-role"
assume_role_policy = jsonencode({
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Service": "lambda.amazonaws.com" },
"Action": "sts:AssumeRole"
}
]
})
}
- IAM 정책 생성 : AmazonS3FullAccess, AmazonRDSFullAccess, logs 권한을 가진 정책 생성
- CloudWatch의 log를 작성하기 위해 "logs"와 관련된 권한도 정책에 추가
resource "aws_iam_policy" "lambda_policy" {
name = "popboard-lambda-policy"
path = "/"
policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Action = "ec2:*",
Effect = "Allow",
Resource = "*"
},
{
Effect = "Allow",
Action = "elasticloadbalancing:*",
Resource = "*"
},
{
Effect = "Allow",
Action = [
"cloudwatch:*",
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
]
Resource = "*"
},
{
Effect = "Allow",
Action = "autoscaling:*",
Resource = "*"
},
{
Effect = "Allow",
Action = "iam:CreateServiceLinkedRole",
Resource = "*",
Condition = {
StringEquals = {
"iam:AWSServiceName" = [
"autoscaling.amazonaws.com",
"ec2scheduled.amazonaws.com",
"elasticloadbalancing.amazonaws.com",
"spot.amazonaws.com",
"spotfleet.amazonaws.com",
"transitgateway.amazonaws.com"
]
}
}
},
{
Effect = "Allow",
Action = [
"rds:*",
"application-autoscaling:DeleteScalingPolicy",
"application-autoscaling:DeregisterScalableTarget",
"application-autoscaling:DescribeScalableTargets",
"application-autoscaling:DescribeScalingActivities",
"application-autoscaling:DescribeScalingPolicies",
"application-autoscaling:PutScalingPolicy",
"application-autoscaling:RegisterScalableTarget",
"cloudwatch:DescribeAlarms",
"cloudwatch:GetMetricStatistics",
"cloudwatch:PutMetricAlarm",
"cloudwatch:DeleteAlarms",
"cloudwatch:ListMetrics",
"cloudwatch:GetMetricData",
"ec2:DescribeAccountAttributes",
"ec2:DescribeAvailabilityZones",
"ec2:DescribeCoipPools",
"ec2:DescribeInternetGateways",
"ec2:DescribeLocalGatewayRouteTablePermissions",
"ec2:DescribeLocalGatewayRouteTables",
"ec2:DescribeLocalGatewayRouteTableVpcAssociations",
"ec2:DescribeLocalGateways",
"ec2:DescribeSecurityGroups",
"ec2:DescribeSubnets",
"ec2:DescribeVpcAttribute",
"ec2:DescribeVpcs",
"ec2:GetCoipPoolUsage",
"sns:ListSubscriptions",
"sns:ListTopics",
"sns:Publish",
"logs:DescribeLogStreams",
"logs:GetLogEvents",
"outposts:GetOutpostInstanceTypes",
"devops-guru:GetResourceCollection"
],
Resource = "*"
},
{
Effect = "Allow",
Action = "pi:*",
Resource = [
"arn:aws:pi:*:*:metrics/rds/*",
"arn:aws:pi:*:*:perf-reports/rds/*"
]
},
{
Effect = "Allow",
Action = "iam:CreateServiceLinkedRole",
Resource = "*",
Condition = {
StringLike = {
"iam:AWSServiceName" = [
"rds.amazonaws.com",
"rds.application-autoscaling.amazonaws.com"
]
}
}
},
{
Action = [
"devops-guru:SearchInsights",
"devops-guru:ListAnomaliesForInsight"
],
Effect = "Allow",
Resource = "*",
Condition = {
"ForAllValues:StringEquals" = {
"devops-guru:ServiceNames" = ["RDS"]
},
Null = {
"devops-guru:ServiceNames" = "false"
}
}
}
]
})
}
- 생성한 정책을 역할에 연결
resource "aws_iam_policy_attachment" "lambda_policy" {
name = "popboard-lambda-policy"
roles = [aws_iam_role.lambda_exec_role.name]
policy_arn = aws_iam_policy.lambda_policy.arn
}
Reference
'Infra > [인프라 구축기] Terraform 활용 AWS 인프라 구축' 카테고리의 다른 글
인프라 구축기 (13) : 진행 내용 & 진행 예정 내용 정리 (5) | 2024.11.03 |
---|---|
인프라 구축기 (12) - S3에 있는 Terraform 상태 파일 활용하기 (0) | 2024.11.02 |
인프라 구축기 (10) - IAM 생성 코드 추가 (2) | 2024.10.26 |
인프라 구축기 (9) - Terraform terraform.tfstate 삭제 이슈 (0) | 2024.10.24 |
인프라 구축기 (8) - Lambda를 활용한 AWS 인스턴스 시작, 중지 자동화 (1) | 2024.10.19 |