terraform기반의 인프라를 자동화하는 pipeline을 구축하고 있다.
CI만을 위한 (최소한의 policy를 부여받은) AWS 유저를 생성해야 한다.
최초 aws를 가입했을 때, 그 계정은 루트 유저다.
그리고 루트 유저는 사용하지 않는 것이 best practice다.
그러면 admin용 iam 유저는 무엇인가?
(== administrative user)
루트 유저(계정) 말고 새로운 유저를 생성후,
그 계정에 관리자 권한이 있는 policy를 부여했다.
그 이후에는 더 이상 루트 유저는 사용하지 않고 있다.
새로 적용할 정책(policy)는
아래와 같다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "TerraformRequiredPermissions",
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken",
"ec2:*"
],
"Resource": "*"
},
{
"Sid": "AllowListS3StateBucket",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::info-share-tfstate"
},
{
"Sid": "AllowS3StateBucketAccess",
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:PutObject"],
"Resource": "arn:aws:s3:::info-share-tfstate/*"
},
{
"Sid": "LimitEC2Size",
"Effect": "Deny",
"Action": "ec2:RunInstances",
"Resource": "arn:aws:ec2:*:*:instance/*",
"Condition": {
"ForAnyValue:StringNotLike": {
"ec2:InstanceType": [
"t2.micro"
]
}
}
},
{
"Sid": "AllowECRAccess",
"Effect": "Allow",
"Action": [
"ecr:*"
],
"Resource": "arn:aws:ecr:us-east-1:*:repository/recipe-app-api-devops"
},
{
"Sid": "AllowStateLockingAccess",
"Effect": "Allow",
"Action": [
"dynamodb:PutItem",
"dynamodb:DeleteItem",
"dynamodb:GetItem"
],
"Resource": [
"arn:aws:dynamodb:*:*:table/info-share-tf-state-lock"
]
}
]
}
AWS CI 유저는 생성 완료됐다.
gitlab에서 CI 작업이 진행될 때,
환경변수로 AWS CI 유저 정보가 필요하다.
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
ECR_REPO
gitlab 프로젝트로 이동한다.
좌측 settings를 누르고,
아래 그림에선 안보이지만 좌측바 General 아래로 스크롤을 내리면
CI/CD 하위 탭이 다시 나온다.
그 탭을 클릭한다.
그리고 환경변수 3개를 추가하는 작업을 진행할 것이다.