우선 기존에 IAM에 대해 깊게 다루지 못한거 같아 서론에서 이에 대해 조금 다루고 넘어가도록 하겠습니다.
IAM
IAM은 AWS클라우드 인프라 안에서 신분과 접속/접근을 관리하기 위한 서비스이며, 크게 사용자, 그룹, 역할, 정책으로 구성되어 있습니다.
IAM 정책(Policy)
정책은 권한을 부여하는 방법입니다. 하나 이상의 AWS리소스에 어떤 작업을 수행할 수 있는지 허용 규칙을 JSON형식으로 작성하면 됩니다. 이렇게 만들어진 정책이 IAM 사용자와 그룹, 역할에 연결되게 됩니다.
IAM 사용자(User)
이는 실제 사용자 단 한명을 의미합니다. 하지만 AWS계정을 처음 만들었을 때 만든 루트 계정(email)이랑 완전 다르다는 점을 알아야 합니다. 왜냐하면 루트 계정은 모든 권한을 갖고 있고, IAM사용자는 단지 루트 계정에 의해 만들어졌을 뿐입니다.
AWS에는 루트 계정을 직접 사용하지 말고, 어드민 권한(AdministratorAcfess)을 부여한 IAM사용자를 따로 만들어서 사용하는 것을 권장하고 있습니다.
IAM 그룹(Group)
이는 IAM사용자마다 매번 정책을 직접 연결해줘야 하는 번거로움과 관리 포인트를 줄일 수 있기 때문입니다.
예를 들어 backend_developers라는 그룹에 S3와 Cloudwatch에 Read Only정책을 연결한다면, 이 그룹에 속한 IAM사용자들에게 자동으로 이 정책이 적용되는 것입니다.
EC2와 같은 AWS 서비스는 이미 내 AWS 계정 안에서 실행되고 있어서 신뢰할 수 있다고 볼 수 있습니다. 즉, 신뢰할 수 있는 존재만이 역할(Role)을 맡을 수 있다(Assume)는 것입니다.
예를 들어 아무런 권한이 없는 IAM사용자가 S3버킷에 접근하기 위해 S3 Read권한이 연결된 역할을 맡겠다는 요청을 보내게 되면, 그 권한이 부여된 자격 증명을 얻게 되는 방식입니다.
그리고 이렇게 역할을 맡게 되는 과정을 "임시 보안 자격 증명"이라고 합니다.
정리하자면 역할(Role)은 권한(Policy)을 갖는다는 점에서 IAM 사용자와 비슷합니다. 하지만 IAM사용자는 딱 그 사용자에게만 권한이 적용되지만, IAM역할을 그 권한이 필요한 사용자라면 얼마든지 획득할 수 있습니다.
물론 아무나 역할을 통해 권한을 가질 수 있는 건 아니고 IAM역할을 만들 때 누가 이 역할을 맡을 수 있는지 담당자(Principal)을 지정해야 하는 신뢰 정책(Trust Policy)이 추가되어야 해당하는 IAM사용자나 AWS리소스가 역할을 얻을 수 있습니다.
(1) AWS CLI 프로필 설정하기
$ aws configure --profile hyunseo
AWS Access Key ID [None]: *****
AWS Secret Access Key [None]: *****
Default region name [None]: ap-northeast-2
Default output format [None]: json
(2) S3 버킷 목록 가져오기 (권한 없어서 실패)
$ aws s3 ls --profile hyunseo
An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied
(3) S3BucketListReadOnlyRole 역할 획득하기
$ aws sts assume-role --profile hyunseo \
--role-arn arn:aws:iam::298070123292:role/S3BucketListReadOnlyRole \
--role-session-name "hyunseo-s3-role"
An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::298070123292:user/jonnung is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::298070123292:role/S3BucketListReadOnlyRole
'S3BucketListReadOnlyRole'의 역할의 신뢰 정책(Trust Policy)에 담당자(Principal)로 'hyunseo'라는 IAM사용자가 등록되어 있지 않기 때문에 실패했습니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::298xxxxx3292:user/hyunseo",
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
사용자를 추가해주었습니다. 이려면 아마 가능할겁니다.
실습
CodeDeploy의 공식문서에 나와있는 그대로를 따라해서 역할 생성하고 이에 대한 신뢰정책과 CodeDeploy에 접근할 수 있는 정책들을 붙여주겠습니다.
https://docs.aws.amazon.com/codedeploy/latest/userguide/getting-started-create-service-role.html
우선 모든 역할을 가지는 정책을 하나 생상하기 위해 policy.json을 만들어 주겠습니다.
/policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"autoscaling:*",
"codedeploy:*",
"ec2:*",
"lambda:*",
"ecs:*",
"elasticloadbalancing:*",
"iam:AddRoleToInstanceProfile",
"iam:AttachRolePolicy",
"iam:CreateInstanceProfile",
"iam:CreateRole",
"iam:DeleteInstanceProfile",
"iam:DeleteRole",
"iam:DeleteRolePolicy",
"iam:GetInstanceProfile",
"iam:GetRole",
"iam:ListInstanceProfilesForRole",
"iam:ListRolePolicies",
"iam:ListRoles",
"iam:PassRole",
"iam:PutRolePolicy",
"iam:RemoveRoleFromInstanceProfile",
"s3:*",
"ssm:*"
],
"Resource": "*"
}
]
}
이와 같이 정책생성을 위한 json파일을 만들어주고 아래의 명렁어를 통해 정책을 codedeploy-policy라는 이름으로 만들어 줍니다.
$aws iam create-policy --policy-name codedeploy-policy --policy-document file://./policy.json
그리고 codecommit_master라는 사용자에게 이 정책을 붙여주도록 하겠습니다.
여기서 --policy-arn은 위에서 만든 정책의 ARN을 넣어주시면 됩니다.
$aws iam attach-user-policy --user-name codecommit_master --policy-arn "arn:aws:iam::154309361967:policy/codedeploy-policy"
또한 아래 명령어로 사용자에 붙여져있는 정책들을 확인할 수 있습니다.
$ aws iam list-attached-user-policies --user-name codecommit_master
{
"AttachedPolicies": [
{
"PolicyName": "AWSCodeCommitFullAccess",
"PolicyArn": "arn:aws:iam::aws:policy/AWSCodeCommitFullAccess"
},
{
"PolicyName": "AdministratorAccess",
"PolicyArn": "arn:aws:iam::aws:policy/AdministratorAccess"
},
{
"PolicyName": "codedeploy-policy",
"PolicyArn": "arn:aws:iam::154309361967:policy/codedeploy-policy"
}
]
}
이제 역할을 생성해 주도록 하겠습니다. 우선 이를 위해 공식문서에서 CodeDeployDemo-Trust.json을 만들라고 되어있습니다.
/CodeDeployDemo-Trust.json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": [
"codedeploy.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
이 신뢰정책을 기반으로 CodeDeployServiceRole을 생성해보도록 하겠습니다.
$aws iam create-role --role-name CodeDeployServiceRole --assume-role-policy-document file://./CodeDeployDemo-Trust.json
그리고 이 역할에 AWSCodeDeployRole이라는 정책을 붙여주도록 하겠습니다.
$aws iam attach-role-policy --role-name CodeDeployServiceRole --policy-arn arn:aws:iam::aws:policy/service-role/AWSCodeDeployRole
이제 이 역할을 CodeDeploy를 만들떄 붙여주면 됩니다.
이와같이 CodeDeploy배포버튼을 누르고 애플리케이션 생성을 누릅니다. 그리고 서비스 역할에 위에서 만든 역할을 선택해 줍니다. 그리고 현재 위치에 배포를 하고, EC2인스턴스에 배포를 할 것입니다. 그리고 여기 Name에 우리의 배포할 EC2인스턴스를 적어줍니다. 그리고 여기서 배포 그룹을 first_depliyment_group으로 지어주었습니다 (잘려서 보이지 않습니다). 이러면 이제 배포를 하게되면 EC2에 즉각적으로 올라가게 되는 것입니다.
그리고 배포를 생성해야 합니다. 이를 위해 배포그룹을 선택하고 GitHub와 연결하기 위해 토큰을 아무거나 적어주고 oauth과정을 진행해 주도록 하겠습니다. 그리고 레포 이름을 적어주고, 커밋 ID를 현재 커밋기록을 확인하고 가장 최근의 커밋 ID아무거나 적어주도록 합니다.
그러면 CodeDeploy에 배포가 완료된겁니다.
'DevOps > AWS Architecture' 카테고리의 다른 글
[ DevOps ] - AWS 기반 대규모 아키텍트 설계 - (설계) 마이크로서비스 간의 통신 방식(Kafka, RabbitMQ) (0) | 2022.07.07 |
---|---|
[ DevOps ] - AWS 기반 대규모 아키텍트 설계 - (개요) 마이크로서비스의 장단점 (0) | 2022.07.07 |
[ DevOps ] - AWS 기반 소규모 & 중규모 아키텍트 설계 - (인프라) AWS CodeDeploy 1 (0) | 2022.07.07 |
[ DevOps ] - AWS 기반 소규모 & 중규모 아키텍트 설계 - AWS CodeCommit이란? (0) | 2022.07.07 |
[ DevOps ] - AWS 기반 소규모 & 중규모 아키텍트 설계 - (인프라) AWS KMS 활용 실습 (SDK 활용) (0) | 2022.07.07 |