위에서 jsonencode 블록 내의 파라미터는 IAM 역할(roles)을 생성할 때 Lambda 함수가 이 역할을 "가정(Assume)"할 수 있도록 설정하는 Assume Role Policy 이다. 이 정책은 AWS 리소스가 역할을 가정(assume)할 수 있는 권한을 정의하는 역할을 한다.
resource "aws_iam_role" "lambda_exec_role" {
name = "lambda_exec_role"
assume_role_policy = jsonencode({
Version = "2012-10-17",
Statement = [{
Effect = "Allow",
Principal = {
Service = "lambda.amazonaws.com"
},
Action = "sts:AssumeRole"
}]
})
}
resource "aws_iam_role_policy_attachment" "lambda_policy_attachment" {
role = aws_iam_role.lambda_exec_role.name
policy_arn = "arn:aws:iam::aws:policy/AWSLambdaExecute"
}
jsonencode 블록 설명
1. Version
- 설명: 정책 문서의 버전입니다. 정책 언어가 사용된 형식을 지정하며, AWS에서 사용하는 최신 버전은 2012-10-17 이다.
- 다른 예시: AWS에서 사용하는 정책의 버전은 주로 2012-10-17로 고정됩니다. 과거에는 다른 형식도 있었지만, 최신 정책은 이 버전을 사용한다.
"Version": "2012-10-17"
2. Statement
- 설명: 정책 문서의 본문입니다. 여러 개의 권한을 정의할 수 있는 목록으로, 각 Statement 블록은 특정 액션에 대한 권한을 지정합니다. 이 예제에서는 하나의 Statement가 정의되어 있다.
3. Effect
- 설명: 정책의 결과를 정의합니다. 이 값은 Allow 또는 Deny로 설정될 수 있다. 이 경우, **"Allow"**는 해당 액션을 허용한다는 의미한다.
- 예시) Deny: 특정 작업을 금지할 때 사용한다.
"Effect": "Deny"
4. Principal
- 설명: 역할을 가정할 수 있는 주체(Principal)를 지정합니다. 주체는 AWS 서비스, 사용자, 그룹, 또는 AWS 계정이 될 수 있다.
- 이 예시에서는
- Service 항목에서 "lambda.amazonaws.com"을 명시하여, Lambda 서비스가 이 역할을 가정할 수 있도록 허용하고 있다.
- 예시) 특정 AWS 계정이 역할을 가정할 수 있게 하려면 Principal에 AWS 계정을 지정한다.
"Principal": {
"AWS": "arn:aws:iam::123456789012:root"
}
- 예시) EC2 인스턴스가 역할을 가정할 수 있도록 하려면 Principal에 EC2 서비스의 ARN을 명시한다.
"Principal": {
"Service": "ec2.amazonaws.com"
}
5. Action
- 설명: 주체가 수행할 수 있는 작업을 정의합니다. 이 예시에서는 sts:AssumeRole이 사용되어, Lambda 서비스가 이 역할을 가정할 수 있게 허용하고 있다.
- 예시) 다른 액션으로는 sts:GetCallerIdentity가 있을 수 있다. 이것은 주체가 역할을 가정한 후에, 자신이 누구인지 확인하는 작업이다.
"Action": "sts:GetCallerIdentity"
6. Service
- 설명: IAM 역할을 가정하는 주체의 AWS 서비스입니다. 이 예제에서는 Lambda 서비스(lambda.amazonaws.com)가 이 역할을 가정할 수 있다.
- 예시) EC2 서비스에서 역할을 가정할 수 있도록 하려면, ec2.amazonaws.com을 사용
"Service": "ec2.amazonaws.com"
- AWS Glue에서 역할을 가정할 수 있도록 하려면, glue.amazonaws.com을 사용
"Service": "glue.amazonaws.com"
다양한 assum_role_policy 설정 예시
1. Lambda 역할을 가정할 수 있는 정책 Lambda 함수가 이 역할을 가정할 수 있도록 설정
assume_role_policy = jsonencode({
Version = "2012-10-17",
Statement = [{
Effect = "Allow",
Principal = {
Service = "lambda.amazonaws.com"
},
Action = "sts:AssumeRole"
}]
})
2. EC2 인스턴스에 역할을 할당하는 정책 EC2 인스턴스가 역할을 가정할 수 있게 설정
assume_role_policy = jsonencode({
Version = "2012-10-17",
Statement = [{
Effect = "Allow",
Principal = {
Service = "ec2.amazonaws.com"
},
Action = "sts:AssumeRole"
}]
})
3. 특정 AWS 계정이 역할을 가정하는 정책 지정된 AWS 계정(123456789012)이 역할을 가정할 수 있게 허용
assume_role_policy = jsonencode({
Version = "2012-10-17",
Statement = [{
Effect = "Allow",
Principal = {
AWS = "arn:aws:iam::123456789012:root"
},
Action = "sts:AssumeRole"
}]
})
4. 다중 서비스가 역할을 가정할 수 있는 정책 Lambda와 EC2 서비스가 동시에 이 역할을 가정할 수 있도록 허용
assume_role_policy = jsonencode({
Version = "2012-10-17",
Statement = [{
Effect = "Allow",
Principal = {
Service = [
"lambda.amazonaws.com",
"ec2.amazonaws.com"
]
},
Action = "sts:AssumeRole"
}]
})
5. 특정 AWS 사용자만 역할을 가정할 수 있게 제한하는 정책 특정 사용자(arn:aws:iam::123456789012:user/ExampleUser)만 역할을 가정할 수 있도록 제한
assume_role_policy = jsonencode({
Version = "2012-10-17",
Statement = [{
Effect = "Allow",
Principal = {
AWS = "arn:aws:iam::123456789012:user/ExampleUser"
},
Action = "sts:AssumeRole"
}]
})
요약
- Version: 정책 언어 버전(주로 2012-10-17 사용)
- Effect: 작업 허용(Allow) 또는 거부(Deny)
- Principal: 역할을 가정할 수 있는 주체(서비스, AWS 계정 등)
- Action: 주체가 할 수 있는 작업(주로 sts:AssumeRole)
- Service: 주체가 속한 서비스(Lambda, EC2 등)
이 설정을 통해, 특정 AWS 서비스나 주체가 IAM 역할을 가정할 수 있도록 허용한다.
'AWS' 카테고리의 다른 글
AWS KMS(Key Management Service) IaC 사용법과 예시 (0) | 2024.10.23 |
---|---|
AWS 사용자 관리 정책 aws_iam_policy와 aws_iam_role_policy_attachment 사용법 (1) | 2024.10.23 |
AWS IAM 관리형 정책 (Managed Policies) (0) | 2024.10.23 |
AWS IAM(Identity and Access Management) 사용법 (1) | 2024.10.23 |
AWS Lambda IaC 적용 방법 (1) | 2024.10.23 |