Terraform을 사용해서 AWS IAM 만들기

mDev_97·2023년 10월 18일

Terraform

목록 보기
1/4
post-thumbnail

사전 지식

AWS 콘솔에서 처음으로 계정을 생성할 때 시작되는 유저는 루트 유저입니다.

루트 유저가 가지는 특징은 다음과 같습니다.

  • Complete Access: 루트 유저는 AWS가 제공하는 모든 서비스와 리소스에 대해서 접근이 가능합니다.
  • Account Management: AWS에서는 계정 설정 변경, IAM 유저 관리, 서비스 관리 등과 같은 작업은 루트 유저만이 수행할 수 있습니다.
  • Secirity: 루트 유저의 액세스 레벨이 높기 때문에 AWS는 기본 작업뿐만 아니라 관리 작업도 루트 계정을 사용하지 않고 개별 IAM을 생성하는 것을 권장합니다.
  • IAM Users: AWS에서는 AWS와 상호작용 시에 루트 유저의 자격 증명 대신에 IAM 유저를 생성하는 것을 권장합니다.
  • Multi-Factor Authentication (MFA): 보안을 강화하기 위해서는 루트 유저에 대해서 MFA를 활성화하는 것이 좋습니다. MFA는 이중 인증을 통해서 추가적인 보호 계층을 추가할 수 있습니다.

AWS CLI 설치

AWS 서비스와 리소스를 사용하기 위해서는 두 가지 방법이 있습니다.

  • AWS 콘솔
  • AWS CLI

대부분의 개발자들은 AWS CLI 방식을 사용합니다.

AWS의 리소스를 커맨드 라인 툴로 사용하기 위해서 AWS CLI를 설치해주겠습니다.

우선 AWS CLI를 설치하는 과정에서 Access KeySecret Key를 물어보기 때문에
AWS Console에 접속해서 IAM 유저를 생성해주겠습니다.

IAM 유저 생성

[사용자 생성] 버튼 클릭

사용자 이름 입력 후 [다음] 버튼 클릭

[다음] 버튼 클릭

[사용자 생성] 버튼 클릭

그럼 아래와 같이 사용자가 생성된 것을 보실 수 있습니다.


위에서 말씀드린 것과 같이 AWS CLI를 설치하기 위해서는 Access KeySecret Key
필요하기 때문에 이를 위한 작업을 진행하기 위해서 방금 생성한 유저를 클릭해서 들어가줍니다.

생성한 유저로 들어와서 [보안 자격 증명] 태그 클릭

하단에 있는 [액세스 키 만들기] 버튼 클릭
Command Line Interface(CLI) 옵션 선택 후 동의 후에 [다음] 버튼 클릭

[액세스 키 만들기] 버튼 클릭

그럼 아래와 같이 액세스 키와 비밀 액세스 키가 만들어진 것을 보실 수 있습니다.
액세스 키와 비밀 액세스 키는 이후에 다시 볼 수 없으므로 따로 메모장에 저장해둡니다.

그리고 terraform_user 라는 유저를 통해서 IAM 유저를 만들기 위해서는
IAM 유저에 대한 권한이 필요합니다.
이를 위해서 IAMFullAccess 권한을 부여해줍니다.


AWS CLI 설치 과정

그럼 이제 생성한 액세스 키와 시크릿 키를 사용하여 터미널에서 AWS CLI를 설치해보겠습니다.

brew install awscli

source '/opt/homebrew/share/zsh/site-functions/_aws' >> ~/.zshrc
aws configure

Access Key와 Secret Access Key를 위에서 만든 키를 사용해줍니다.
그리고 region name의 경우, 현재 본인이 계신 위치를 넣어주시면 됩니다.
서울의 경우 ap-northeast-2

그럼 이제 정상적으로 설정이 되었는지 확인해줍니다.

cat ~/.aws/credentials

cat ~/.aws/config

위와 같이 진행이 되었다면 AWS CLI 설치는 끝났습니다.


Terraform을 사용하여 IAM 만들기

이제 저희는 IAM 유저를 만들엇기 때문에 IAM 유저의 액세스 키와 시크릿 키를 가지고서
또 다른 IAM 유저를 Terraform를 사용하여 만들어보겠습니다.

Provider 지정

제일 먼저 프로바이더를 지정해주겠습니다.
리전의 경우 제가 위치한 ap-northeast-2로 넣어주겠습니다.

provider "aws" {
  region = "ap-northeast-2"
}

IAM 유저 생성

그 다음으로 우리는 유저를 만들 것이기 때문에 이름을 "developer1"이라고 지정해주겠습니다.
패스는 관리하는 유저의 수가 많아지게 된다면 디렉토리와 같은 구조로 관리하기 위해서 사용하기 때문에
패스 설정은 아무 상관이 없습니다.
패스의 디폴트 값은 /입니다.

resource "aws_iam_user" "developer1" {
  name = "developer1"
  path = "/system/"
}

유저 그룹 생성

유저를 만든 다음으로는 유저 그룹을 만들 수 있습니다.

유저를 그룹에 추가하면 그룹에 정책을 추가함으로써
그룹에 포함된 유저에게 일괄적으로 정책을 적용할 수 있습니다.

resource "aws_iam_group" "developer_group" {
  name = "developer"
  path = "/system/"
}

유저와 그룹 연결

그리고 이제 우리가 만든 유저와 그룹을 연결해야합니다.

연결은 AWS IAM 그룹 멤버십을 통해서 연결을 합니다.

resource "aws_iam_group_membership" "developer_membership" {
  name = "developer_membership"

  users = [
    aws_iam_user.developer1.name
  ]

  group = aws_iam_group.developer_group.name
}

정책 추가

유저와 그룹을 만들고 유저와 그룹을 연결해주었다면 이제 정책을 추가해줍니다.

developer_policy 라는 이름의 정책을 만들었습니다.
버전의 경우 AWS에서 지정해주는 것이며,
statement 안에는 우리가 Action과 Effect, Resource를 지정할 수 있습니다.

Action의 경우 S3 서비스에 대해서 ListAllMyBuckets 권한을 준 것입니다.

resource "aws_iam_policy" "developer_policy" {
  name        = "developer_policy"
  path        = "/system/"
  description = "developer policy"

  policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
    {
    "Action": [
        "s3:ListAllMyBuckets"
    ],
    "Effect": "Allow",
    "Resource": "*"
    }
]
}
EOF
}

정책과 그룹 연결

정책을 만들었으니 이제 우리가 만들어준 그룹과 정책을 연결해주어야 합니다.
여기서 arn이란 아마존 리소스의 네임입니다.

resource "aws_iam_group_policy_attachment" "developer_group_policy_attachment" {
  group      = aws_iam_group.developer_group.name
  policy_arn = aws_iam_policy.developer_policy.arn
}

전체 코드

전체적인 코드는 다음과 같습니다.

provider "aws" {
  region = "ap-northeast-2"
}

resource "aws_iam_user" "developer1" {
  name = "developer1"
  path = "/system/"
}

resource "aws_iam_group" "developer_group" {
  name = "developer"
  path = "/system/"
}

resource "aws_iam_group_membership" "developer_membership" {
  name = "developer_membership"

  users = [
    aws_iam_user.developer1.name
  ]

  group = aws_iam_group.developer_group.name
}

resource "aws_iam_policy" "developer_policy" {
  name        = "developer_policy"
  path        = "/system/"
  description = "developer policy"

  policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
    {
    "Action": [
        "s3:ListAllMyBuckets"
    ],
    "Effect": "Allow",
    "Resource": "*"
    }
]
}
EOF
}

resource "aws_iam_group_policy_attachment" "developer_group_policy_attachment" {
  group      = aws_iam_group.developer_group.name
  policy_arn = aws_iam_policy.developer_policy.arn
}

결과 확인

우선 먼저 아래의 명령어를 통해서 프로바이즈를 다운 받아줍니다.

terraform init

그리고 나서 작성한 코드를 적용해주기 전에 플랜을 수행해줍니다.

terraform plan

그럼 다음과 같이 작성한 코드에는 문제가 없다는 것을 확인할 수 있습니다.

이제 정말 우리가 작성한 코드를 적용해보도록 하겠습니다.

terraform apply

그럼 아래와 같이 잘 생성되었다는 문구를 볼 수 있습니다.

이제 AWS Console로 이동하여서 정말 잘 생성되었는지 확인해보겠습니다.

우선 우리가 지정한 것과 같이 developer1이라는 유저가 생성되었습니다.
그리고 developer1 유저로 들어가서 추가로 확인해보겠습니다.

아래와 같이 developer 라는 그룹에 유저가 연결되어 있고
그룹에는 developer_policy라는 정책이 잘 연결되어 있는 것을 확인할 수 있습니다.

마지막으로 developer_policy에 들어가보면
우리가 terraform 코드를 통해서 지정해주었던 S3 리스트에 대한 권한이 허용된 것을 보실 수 있습니다.

참고: Terraform Resource: aws_iam_user

profile
안녕하세요. 백엔드, 클라우드, 인프라에 관심과 열정이 있는 김문성입니다. 😊

0개의 댓글