본문 바로가기
[개발] Infrastructure/AWS

OAI를 사용하여 Cloudfront를 배포한 경우, aws cli s3는 어떻게 사용할까?

by Devsong26 2021. 9. 25.

Origin Access Identity(OAI)만 S3에 오브젝트를 조회할 수 있도록 Cloudfront를 배포했다.

 

젠킨스를 통해 S3에 Javascript SPA를 CI/CD 해야 하는데 aws s3 명령어가 "Access Denied" 되어 난감했다.

 

어떻게 해결해야 할까?

 


 

AWS cli에는 --profile 옵션을 사용할 수 있으며, Credentials 파일에서 특정 profile을 사용하는 것이다.

 

aws s3 ls s3://[버킷명] --profile [profile]

 

.aws/credentials 파일에 profile을 추가할 수 있으며, default가 기본으로 잡혀있는 것 같다. 

 

"user1" 를 추가하는데, 아래와 같은 조건이 있다.

- s3를 다룰 수 있는 권한을 가진 프로그래밍 액세스 계정

- 해당 액세스 키와 시크릿 키를 입력해야 함

 

[default]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

[user1]
aws_access_key_id=AKIAI44QH8DHBEXAMPLE
aws_secret_access_key=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY

 

"user1"을 추가했으니 명령어를 실행해보자.

 

aws s3 ls s3://[버킷명] --profile user1

 

"Access Denied" 에러가 날 것이다.

왜냐하면 버킷의 보안 정책을 수정하지 않았기 때문이다.

 

Cloudfront 설정할 때, OAI만 접근 가능하도록 버킷 정책 자동 업데이트를 진행하면 아래와 같이 하나의 정책만 생성된다.

 

{
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity [OAI]"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::[버킷명]/*"
        }
    ]
}

 

여기에 Credentials에 추가한 계정에 대한 정책을 추가하면 된다.

 

{
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity [OAI]"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::[버킷명]/*"
        },
        {
            "Sid": "2",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::[root]:user/user1"
            },
            "Action": [
                "s3:PutObject",
                "s3:DeleteObject",
                "s3:List*",
                "s3:Get*"
            ],
            "Resource": "arn:aws:s3:::[버킷명]/*"
        }
    ]
}

 

다시 명령어를 입력해보면 원하는 결과를 얻을 것이다.