AWS

AWS 사용자 관리 정책 aws_iam_policy와 aws_iam_role_policy_attachment 사용법

devfinger 2024. 10. 23. 18:03

 

 resource "aws_iam_policy" "s3_custom_policy" {
  name        = "s3-custom-policy"
  description = "Custom policy to allow S3 bucket access"
  policy = jsonencode({
    Version = "2012-10-17",
    Statement = [{
      Action = [
        "s3:GetObject",
        "s3:PutObject"
      ],
      Effect   = "Allow",
      Resource = "arn:aws:s3:::my-bucket/*"
    }]
  })
}

resource "aws_iam_role_policy_attachment" "s3_policy_attachment" {
  role       = aws_iam_role.lambda_exec_role.name
  policy_arn = aws_iam_policy.s3_custom_policy.arn
}

 

위의 aws_iam_policy와 aws_iam_role_policy_attachment 리소스는 특정 IAM 역할(lambda_exec_role)에 사용자 정의 S3 접근 권한을 부여하는 구성이다.

aws_iam_policy 리소스 설명

aws_iam_policy는 사용자 정의 IAM 정책을 생성하는 리소스이다.

 

  1. name
    • 설명: 정책의 이름을 지정한다. 이 이름은 AWS 콘솔이나 CLI에서 정책을 식별하는 데 사용
    • 예시: s3-custom-policy는 사용자가 지정한 정책 이름
    • 다른 예시:
      • lambda-execution-policy: Lambda 실행을 위한 정책
      • read-only-s3-policy: S3 읽기 전용 정책
  2. description
    • 설명: 정책에 대한 설명을 작성한다. 이 필드는 정책의 목적을 명확하게 기술할 때 유용
    • 예시: "Custom policy to allow S3 bucket access"는 정책의 목적을 설명
    • 다른 예시:
      • "Policy for Lambda execution with S3 access": Lambda가 S3에 접근할 수 있도록 허용하는 정책 설명
  3. policy
    • 설명: JSON 형식으로 IAM 정책의 본문을 정의한다. jsonencode 함수를 사용하여 정책을 JSON 형식으로 변환
    • 예시 설명:
      • Version: 정책 언어의 버전. AWS에서는 주로 2012-10-17을 사용
      • Statement: 정책의 본문을 정의하는 필드로, 각 Statement는 허용하거나 금지할 작업을 정의
      • Action: IAM 엔터티(역할, 사용자 등)가 수행할 수 있는 작업을 정의
        • s3:GetObject: S3 버킷에서 객체를 읽는 권한
        • s3:PutObject: S3 버킷에 객체를 쓰는 권한
      • Effect: 작업을 허용(Allow)하거나 거부(Deny)할지 결정
      • Resource: 작업이 수행될 리소스를 지정한다. 이 경우, arn:aws:s3:::my-bucket/*은 특정 S3 버킷(my-bucket)의 모든 객체를 의미

다양한 policy 예시

1. S3 버킷 전체 접근 허용

  • S3 버킷의 모든 객체에 대해 모든 작업을 허용하는 정책
policy = jsonencode({
  Version = "2012-10-17",
  Statement = [{
    Action   = "s3:*",   # S3의 모든 작업 허용
    Effect   = "Allow",
    Resource = "arn:aws:s3:::my-bucket/*"
  }]
})

 

2. S3 읽기 전용 정책

  • S3 버킷에 대해 읽기 전용 권한만 부여하는 정책
policy = jsonencode({
  Version = "2012-10-17",
  Statement = [{
    Action   = "s3:GetObject",   # 읽기 작업만 허용
    Effect   = "Allow",
    Resource = "arn:aws:s3:::my-bucket/*"
  }]
})

 

3. 특정 파일에 대한 접근 제한

  • S3 버킷 내 특정 파일에만 접근 권한을 부여
policy = jsonencode({
  Version = "2012-10-17",
  Statement = [{
    Action   = ["s3:GetObject", "s3:PutObject"],
    Effect   = "Allow",
    Resource = "arn:aws:s3:::my-bucket/specific-file.txt"  # 특정 파일에 대한 접근만 허용
  }]
})

 

4. S3의 객체 삭제 허용

  • S3에서 객체를 삭제할 수 있는 권한을 부여
policy = jsonencode({
  Version = "2012-10-17",
  Statement = [{
    Action   = "s3:DeleteObject",  # 삭제 작업 허용
    Effect   = "Allow",
    Resource = "arn:aws:s3:::my-bucket/*"
  }]
})

 

aws_iam_role_policy_attachment 리소스 설명

aws_iam_role_policy_attachment는 IAM 역할에 정책을 연결하는 리소스

resource "aws_iam_role_policy_attachment" "s3_policy_attachment" {
  role       = aws_iam_role.lambda_exec_role.name
  policy_arn = aws_iam_policy.s3_custom_policy.arn
}

 

  1. role
    • 설명: 정책을 연결할 IAM 역할을 지정한다. 이 예제에서는 aws_iam_role.lambda_exec_role.name을 사용하여, 이미 정의된 lambda_exec_role 역할에 정책을 연결한다.
    • 다른 예시:
      • Lambda 역할에 정책을 연결하려면: aws_iam_role.lambda_exec_role.name
      • EC2 역할에 정책을 연결하려면: aws_iam_role.ec2_instance_role.name
  2. policy_arn
    • 설명: 연결할 정책의 ARN(Amazon Resource Name)을 지정한다. 이 예제에서는 위에서 정의한 aws_iam_policy.s3_custom_policy.arn을 사용한다.
    • 다른 예시:
      • Amazon S3 전체 접근 권한을 연결하려면: arn:aws:iam::aws:policy/AmazonS3FullAccess.
      • Lambda 실행 권한을 연결하려면: arn:aws:iam::aws:policy/AWSLambdaExecute.

다양한 aws_iam_role_policy_attachment 예시

1. Amazon S3 전체 접근 정책 연결

  • Lambda 역할에 S3 전체 접근 정책을 연결한다.
resource "aws_iam_role_policy_attachment" "lambda_s3_full_access" {
  role       = aws_iam_role.lambda_exec_role.name
  policy_arn = "arn:aws:iam::aws:policy/AmazonS3FullAccess"
}

 

2. Amazon DynamoDB 읽기 전용 정책 연결

  • Lambda 역할에 DynamoDB에 대한 읽기 전용 권한을 부여한다.
resource "aws_iam_role_policy_attachment" "lambda_dynamodb_readonly" {
  role       = aws_iam_role.lambda_exec_role.name
  policy_arn = "arn:aws:iam::aws:policy/AmazonDynamoDBReadOnlyAccess"
}

 

3. Amazon S3 읽기 전용 정책 연결

  • EC2 인스턴스 역할에 S3 읽기 전용 정책을 연결한다.
resource "aws_iam_role_policy_attachment" "ec2_s3_readonly" {
  role       = aws_iam_role.ec2_instance_role.name
  policy_arn = "arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess"
}

 

4. CloudWatch 로그 작성 권한 연결

  • Lambda 역할에 CloudWatch 로그 작성 권한을 연결한다.
resource "aws_iam_role_policy_attachment" "lambda_cloudwatch_logs" {
  role       = aws_iam_role.lambda_exec_role.name
  policy_arn = "arn:aws:iam::aws:policy/CloudWatchLogsFullAccess"
}

 

요약

  • aws_iam_policy는 사용자 정의 IAM 정책을 생성하는 리소스
    • name: 정책의 이름을 설정한다.
    • description: 정책에 대한 설명을 제공한다.
    • policy: JSON 형식의 정책 본문을 정의한다.
  • aws_iam_role_policy_attachment는 특정 IAM 역할에 정책을 연결하는 리소스
    • role: 정책을 연결할 IAM 역할을 지정한다.
    • policy_arn: 연결할 정책의 ARN을 지정한다.

위와 같이 aws_iam_policy를 통해 S3 접근 권한을 정의하고, aws_iam_role_policy_attachment를 통해 해당 권한을 Lambda 역할에 연결할 수 있다.