안녕하세요 이번 글에서는 평소 AWS 내의 리소스를 관리하며 , 대충 이해만 하고 넘어갔던 접근제어에 대해서 알아보겠습니다.

우선, 저 같은 경우는 그저 특정 리소스를 요청할 때마다, 필요한 권한을 포함한 해당 리소스의 모든 권한을 전부 허용해 주고  사용하곤 했었습니다. 

 

또한, 해당 역할에 대한 이해와 동작 과정에 대한 이해 없이 무작정 권한을 할당해 주고, 사용하다 보니 자주 Permission denied라는 문구를 보곤 했었습니다.

 

따라서 AWS의 접근 제어 정책에 대한 정확한 이해가 필요해 해당 과정을 글로 녹여내게 되었습니다.

 

들어가며..

AWS 클라우드를 사용하는 몇 가지 방법이 있습니다.

 

웹 콘솔에서 조작하는 방법, AWS CLI로 사용하는 방법, AWS에서 제공하는 SDK를 이용해 여러 프로그래밍 언어로 API 호출하는 방법이 있죠. 

 

첫 번째 방법을 제외한 CLI와 SDK를 사용할 경우, 매 API 호출마다 처리되는 인증 절차가 있습니다.

 

여기서 , IAM 사용자를 통해 발급받은 ACCESS KEYSECRET KEY( Secret Access Key)를 사용하게 되죠.

 

ACCESS KEY
- AWS 계정 또는 IAM 사용자를 식별하는 데 사용되는 고유한 식별자 입니다.
- 요청 주제 (Principal)을 인증합니다.

SECRET KEY
- HMAC ( Hash-based Message Authentication Code ) 서명값을 검증합니다.
- 요청의 특정 부분을 해싱하여 디지털 서명을 생성하고, 이 서명을 요청에 포함시켜 요청을 보내는 과정을 포함합니다.
- 이렇게 함으로써, 보내는 측이 요청을 생성한 적절한 사용자임을 인증합니다

 

AWS IAM ?

IAM은 AWS 전체의 권한 통제 시스템을 칭하는 말이며, 

I ( Identity) : AWS로 요청을 할 수 있는 보안주체 (Principal)를 의미합니다.

AM ( Access Management) : 누가 어떤 리소스들에 대해 어떤 일을 할 수 있는 권한을 가지는지를 의미합니다.

 

IAM 보안주체 ( Principal) 는 여러 사용자 유형이 있는데, Cloud Trail 서비스에서 다음과 같이 구분이 됩니다.

  • Root - API 요청이 AWS Account 자격 증명을 사용 ( 처음 계정 생성시 만들어지는 슈퍼 유저 )
    - 모든 리소스에 대한 접근 권한이 있기 때문에 사용 안하는 것을 적극 권장
  • IAM User - API 요청이 IAM User의 자격 증명을 사용 ( 장기 credential을 사용 )
  • Assumed Role - API 요청이 AWS STS(Simple Token Service) AssumeRole을 통해 획득한 임시 보안 자격 증명을 사용
  • AWS Account - 다른 AWS Account에서 요청
  • AWS Service - AWS 서비스에 속한 AWS 계정을 통해 요청

위와 같은 형식으로 Cloud Trail 서비스 내에서 유저의 유형과, 유저의 이름, 해당 유저가 어떤 행동을 했는지 기록되게 됩니다.

해당 JSON을 이용하여, 보안 감사 및 추적의 목적으로 사용할 수 있겠죠 ?

 

IAM의 인증과 인가

AWS IAM은 권한 제어를 위한 인증과 인가를 둘 다 담당합니다.

 

우선 인증으로는 , 보안 주체 ( principal )가 갖게되는 credential은 장기 ( Long-term) 와, 임시 자격 증명이 있습니다.

 

대표적인 장기 credentials 로는 IAM User(사용자)의 자격 증명을 그대로 이용한 credential입니다. 

( IAM User 생성시, 위에서 언급한 Access key와 Secret Key를 발급 받을 수 있습니다. )

 

반면에 임시 자격 증명으로는 IAM Role의 인증이 있습니다. 

예를 들어, 특정 EC2 instance가 다른 AWS 리소스에 접근할 때 사용하는 역할등이 있겠죠.

( 이 과정에서도 특정 리소스를 호출 하는 과정이기에 인증과정이 이루어집니다. )

 

대신, IAM User의 자격증명을 그대로 이용하는 credential과는 달리, 해당 임시 자격 증명의 시간을 제한할 수 있습니다.

 

일련의 인증 과정을 거친후, 해당 인증된 사용자(또는 서비스)가 요청에 대한 정책이 허용이 된다면, 그제서야 API 호출은 성공하게 됩니다.

 

예시 )

- A라는 IAM User는 특정 리소스를 호출합니다. ( S3 Object Put, Get 등 )

- 해당 요청은 IAM 서비스를 통해 보안 주체(요청자)가 적절한 사용자인지 판단합니다(인증). 

- 그 후, 인증된 사용자라면 해당 요청자의 권한을 확인합니다. 

- 만약 정책에 맞는 요청을 했다면(인가) 요청을 받은 해당 리소스는 요청에 대한 응답을 합니다.

 

 

IAM Policy

 

위의 예시에서 "정책"을 언급했는데, 이 정책은 말 그대로 보안 주체가 가지고 있는 권한을 뜻합니다.

 

해당 정책의 구조는 대략 다음과 같습니다.

 

{
	# 예시
	"Version": "2012-10-17",
	"Statement": [
		{
        	# 허용 할건지, 거부 할 것 인지
			"Effect": "Allow or Deny",
            
            # 어떤 행동을 ?
			"Action": [
            	"s3:Get",
                "s3:Put"
            ],
            
            # 어떤 리소스들에 대해 ?
			"Resource": [
            	"arn:aws:s3:<BUCKET-NAME>:<OBJECT-PATH>"
            ]
		}
	]
}

 

이에 추가로, Condition 블록을 통해 조건을 걸어줄 수 도 있습니다. 위 코드 블럭에 추가하자면, 

srcIP가 특정 대역에 속하는 경우에만 허용 같은것 말이죠.

 

어떤가요? 어느정도 이해가 되셨나요 ? 한 가지 더 재밌는 사실이 남았습니다. 

 

바로 위에서 본 Policy JSON는 Identity Based(보안 주체 기반) Policy 이고, AWS 에서는 위와 유사하지만 

 

Resource Based Policy( 리소스 기반 정책) 으로 종류가 나누어집니다.

 

위의 JSON 의 Statement 블록안에, Principal 블록이 추가 됩니다. 

 

쉽게 설명하자면, 특정 리소스 ( 예 : S3) 에 특정 보안 주체 (principal)만 허용된 Actions를 수행 할 수 있다 입니다.

 

예를 들어보시죠 . IAM 사용자에게 역할을 연결하는 것과는 조금 다릅니다.

  • S3 리소스를 생성합니다.
  • 생성 후, 해당 S3에 접근할 수 있는 주체를 특정합니다. ( 예 : a라는 iam user의 ARN -> arn:aws:iam:<ACCOUNT_ID>:a_user)
  • 해당 주체는 Put과 Get 호출을 할 수 있습니다.
  • 그렇지만 특정 Path 에만 접근이 가능합니다. 또는 모든 Path에 접근이 가능합니다.
  • 또한 , 특정 ip로만 접근할 경우에만 가능합니다. ( 예 : 회사 사무실의 공인 라우터 또는 게이트웨이 IP ) 

이를 JSON 형식으로 표현하면 다음과 같아집니다.

 

{
	# 예시
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
            
            "Principal" : {
            	"AWS" : [
                	"arn:aws:iam:<ACCOUNT_ID>:a_user"
                ]
            }
        
            # 어떤 행동을 ?
			"Action": [
            	"s3:Get",
                "s3:Put"
            ],
            
            # 어떤 리소스들에 대해 ?
			"Resource": [
            	"arn:aws:s3:<BUCKET-NAME>/<OBJECT-PATH>*"
            ],
            
            "Condition" : {
            	"IpAddress": {
                	"aws:SourceIp" : "1.1.1.1"
                }
            }
		}
	]
}

 

 

 그렇다면 여기서 궁금증이 생기실 수도 있을텐데요,

 

" 어라 ? 그럼 IAM 사용자가 리소스를 호출하려 할 때, 리소스 정책과, 유저 정책을 둘 다 만들어줘야 하나 ? , 둘 중에 하나만 열어줘도 되던데 ? "

저도 같은 생각을 했습니다만, 이는 반은 맞고 반은 틀렸습니다.

 

바로 같은 계정인지, 아니면 다른 계정인지에 따라 이는 구분이 되어 적용됩니다.

 

쉽게 설명하자면, 같은 Acount_id를 가지고 있는 IAM 사용자와 리소스일 경우에는 둘 중에 하나만 허용해줘도 API 호출이 가능합니다.

 

다만, 다른 Account_id를 가지고 있는 IAM 사용자와 리소스일 경우에는 , 둘 다 허용해줘야 API 호출이 가능해집니다.

 

즉, IAM 사용자는 해당 리소스에 대한 적절한 권한을 가지고 있어야 하고, 해당 리소스는 특정 IAM 사용자 ( 다른 계정의)의 ARN을 보안 주체 (Principal 블록) 에 작성해줘야 정상적인 호출이 가능해집니다.

 

또한, 사용자의 Effect는 특정 Actions가 Allow가 돼있고, 리소스에선 보안주체로 사용자가 명시 돼있어도 리소스 정책에서 Effect가 Deny가 돼있다면, AWS 정책상 Deny의 우선순위가 높기 때문에 사용자의 호출은 거부 됩니다.

 

 

마치며 ..

여기까지 IAM에 대한 기본적인 내용을 예시와 함께 간단하게 살펴보았습니다. 

 

다음번엔 AWS 임시 자격증명의 유형과 사용방법에 대해 좀 더 알아보겠습니다. 

 

긴 글 읽어주셔서 감사합니다.

 

 

 

 

 

'AWS' 카테고리의 다른 글

AWS Cloud Support Associate 1차 면접 후기  (9) 2023.12.12
AWS ECS 오토 스케일링 및 배포 자동화  (0) 2023.08.01

안녕하세요 ! 오늘은 제목 그대로 AWS Cloud Support Associate 1차 면접 후기에 대해 말씀드리려고 합니다 !

 

 

평범한 일상을 보내고 있던 중 링크드인을 통해 AWS Cloud Support 리쿠르터 분께 면접 제의가 오게 됐습니다. (ㄷㄷㄷ)

처음엔 거짓말인줄 알았어요
직무 설명

정말 감사하게도 제 링크드인 이력서를 보시고 연락을 주셨고, 사진에서 보시다싶이 서류전형은 자동으로 통과 된다고 말씀해주셨습니다.

 

이후, 평소에 잘 업데이트 하고 있던 이력서를 냉큼 제출하였고, 제출한지 거의 10분만에 서류전형 이후의 프로세스를 말씀해주셨습니다.

 

서류전형을 통과 이후에는 Online Assesment 를 보게되었습니다.

 

해당 테스트는 조금 특별했던게 실제 CSE ( Cloud Support Engineer)분들이 업무를 하시면서 실제 겪으시는 사례를 기반으로 질문이 나왔으며, 평가내용은 기본적인 기술지식, Troubleshooting, 제 업무방식에 대한 질문들이 있었습니다 .

 

또한 Networking 부분의 꽤나 Deep dive한 질문도 많았습니다.

 

온라인 테스트는 2일 이내 제출해달라고 하셨지만, 2시간? 만에 해치워버렸습니다.

 

온라인 테스트를 통과 후, 1차 인터뷰 일정을 잡게 되었습니다

 

특이하게도 1차 인터뷰 진행 전, 담당 리쿠르터 분께서 지원직무 변경(Networking -> Deployment) 을 제안하셨고, 평소에 DevOps에 관심이 많았던 터라 흔쾌히 수락하고 면접 준비를 하였습니다. 면접 준비 기간은 약 3일 정도 되었던 것 같습니다(감기 몸살때문에 ..)

 

리쿠르터분께서 친절하시게도 1차 인터뷰 진행 시, 기술 인터뷰이기에 지원 직무 기반 지식에 대해 참고할만한 문서를 보내주셨습니다.

 

해당 문서를 보며 평소에 두루뭉실하게 알고 있던 Network, OS, Docker 등을 정리하고

(이 과정에서 참고한 유튜브 채널로는 널널한 개발자님과 쉬운코드님, 우테크 영상을 주로 봤습니다) 

 

그 유명한 아마존 리더십 원칙과 STAR 형식(Situation, Task, Action, Result)의 답변을 염두하며 면접을 준비했습니다

 

이후, 면접당일이 되었고 면접 보는 회사 규모가 규모라 그런지 엄청 긴장하며 화상면접을 보게 되었습니다 하하;;

 

인터뷰를 진행하며 deep한 질문에 대답을 잘 못해서 버벅거렸는데, 면접관분께서 생각나면 천천히 말씀해달라고 친절하게 말씀해주셨습니다.. ㅠㅠㅠ 

 

그렇게 1시간이 후다닥 지나가게 되고, 마지막엔 면접관분께 궁금한 것을 질문하는 시간에 개인적으로 몇가지 궁금한걸 질문드렸습니다.

 

결과가 어떻게 나올진 모르겠지만 
세계적인 기업인 AWS Cloud Support Engineer 현직자 분과 대화를 주고 받을 수 있었던 것만으로도 정말 값진 경험이었습니다.

 

제 경험과 공부했던 내용을 다시 정리하기에도 너무 좋았구요.

 

마지막으로 제가 받았던 기술 면접 질문을 기억나는대로 정리했습니다(정리한 것 보다 훨씬 많았어요 ..ㅠ )

아무쪼록 다른 개발자분들이나 엔지니어 분들에게 도움이 되었으면 좋겠습니다 !! 긴글 읽어주셔서 감사합니다 !!

 

  • 간단한 자기소개
  • TCP/IP에 대해 설명 해주세요
  • HTTP Method의 종류와 역할?
  • HTTP 응답코드에 대해 아는대로 설명해주세요
  • TCP와 UDP의 차이를 설명해주세요.
  • 3-way handshake에 대해 설명해주세요
    • 4-way handshake에 대해 설명해주세요
    • 4-way handshake는 왜 4-way인가요 ?
  • TLS/SSL에 대해 설명해주세요
    • TLS handshake에 대해 설명해주세요
  • 서버A에서 서버B로 ping 요청을 보낸다고 가정 시, 서버B에서 해당 요청을 차단하는 방법 ?
    • 동일 네트워크 대역일 경우
    • 다른 네트워크 대역일 경우
    • 운영체제 수준에선 어떻게 할까요 ?
  • 서버에서 만약 503 Error가 떨어졌을때, 어떤 조치를 취하실건지 설명해주세요
  • www.google.com에 접속을 했습니다. 요청을 보내고 받기까지의 과정을 자세히 설명해주세요.
  • OOM이 발생하는 근본 원인은 무엇일까요 ?
    • 만약 발생했을때 조치는 어떻게 하실건가요 ?
  • 리눅스에서 chmod 600 testFile을 했을때 어떤일이 생기나요 ?
  • 리눅스 iptables에 대해 설명해주세요
    • ACCEPT, DROP, REJECT 은 어떻게 사용되는지 말씀해주세요
  • ssh의 원리가 어떻게 되나요 ?
    • 명령어 구성은 어떻게 되나요 ?
  • 도커 컨테이너는 어떻게 독립된 환경을 가지게 되나요 ?
    • 커널의 어떤 모듈을 사용하는지 말씀해주세요
  • 도커 컨테이너 네트워크 종류와 각각의 차이에 대해 말씀해주세요

 

 

 

 

 

 

 

 

'AWS' 카테고리의 다른 글

IAM  (0) 2024.03.30
AWS ECS 오토 스케일링 및 배포 자동화  (0) 2023.08.01

프로젝트 전체 아키텍처.

신규 프로젝트를 진행하며, 더 이상 온프레미스 서버에서 관리하지 않고, 클라우드 컴퓨팅, 컨테이너 환경을 선택했다.

 

고가용성과 오토 스케일링, 또한 여러 컨테이너 환경을 첫 운영함에 있어서 쿠버네티스 , 도커 스웜, AWS ECS를 고려했다.

 

쿠버네티스와 도커 스웜 역시 강력한 컨테이너 오케스트레이션 도구였지만, AWS ECS 클러스터 인프라에서 배포 컴퓨팅 환경으로

 

서버리스 컴퓨팅 형태인 Fargate를 사용할 수 있다는 장점으로 인해 AWS ECS를 선택, 그에 맞는 인프라를 구축하기로 하였다.   

 

 

Route53

Amazon Route 53은 가용성과 확장성이 뛰어난 DNS 웹 서비스이며, 사용자 요청을

 

AWS 또는 온프레미스에서 실행되는 인터넷 애플리케이션에 연결한다.

 

위 그림과 같이 DNS로 도메인을 별도 구입하여 해당 도메인의 라우팅 경로를 VPC내에 있는 로드 밸런서의 ARN으로 연결 시켜주었다.


Application Load Balancer(ALB)

해당 로드 밸런서의 리스너는 두 가지 경우를 만들어 주었다.

 

HTTP:80

  • HTTP 프로토콜의 기본 포트인 80으로 접근 시, HTTPS:443(프로토콜:포트)를 리다이렉션 대상으로 삼아 주었다.

  • 이로써 http 프로토콜로 접속해도 보안 접속이 가능해졌다.

 

HTTPS:443

  • 리스너 규칙으로 접근하려는 호스트의 헤더에 api.도메인.com가 붙여져있다면 백엔드 대상 그룹으로 라우팅 경로를 지정 .

  •  그 외의 요청은 프론트엔드 대상 그룹으로 라우팅 경로를 지정
로드밸런서의 대상 그룹은 ECS에서 테스크 서비스가 배포되는 시점에서 선택을 할 수 있다.

예를 들어, 백엔드 서비스가 포함된 컨테이너 배포시, 기존에 생성한 로드 밸런서의 대상 그룹 A를 지정해준다면,

배포된 컨테이너 서비스가 자동으로 로드밸런서의 백엔드 대상 그룹으로 지정돼, 라우팅을 수신 할 수 있게 된다.
  • 추가로 트래픽 분산 알고리즘과, 각 대상 그룹에 등록된 서비스의 가중치 지정이 가능하다.

ECS Cluster

서버 자원에 대한 인력 리소스를 줄이기 위해, (ECS를 선택한 이유인) Fargate 컴퓨팅 유형으로 클러스터를 생성해주었고,

 

해당 클러스터에서 각각 프론트엔드 서비스 , 백엔드 서비스를 배포 하였다.

테스크 정의

테스크 정의의 규격을 vCPU 2, 메모리를 16GB로 리소스를 한정하고,

 

오토 스케일링 규칙을 해당 테스크가 로드밸런서의 트래픽 량에 따라

 

최소 3개, 최대 6개까지 유지 될 수 있도록 하여 트래픽 급증에 대비하여 유연하게 서비스를 운영할 수 있게 하였다.

 

cpu 아키텍처는  X86_64로 설정하였으며, 이는 곧 후에 기술하게 될 GitActions의 도커 이미지 빌드 아키텍처와 맞춰주기 위함이다.


또한 서비스 배포 옵션을 상단의 사진과 같이 최소 실행 작업 비율을 100% , 최대 실행 작업 비율을 200%로 하여

 

롤링 업데이트 방식으로 무중단 배포를 할 수 있었다.

 

(본래는 블루/그린 배포 방식으로 하려 했으나, 또 다른 서버 자원의 비용을 감내해야 했기 때문에 배포 속도가 좀 느리더라도 

 

롤링 업데이트 방식을 채택했다..흑)

 


  • 해당 테스크 스케줄러가 각 서비스 배포 서브넷은 로드 밸런서가 위치한 서브넷과 동일하게 맞춰 주었으며,

  • 로드밸런서도 미리 만들어둔 것으로 지정해주었다.
    -> 이 로드밸런서의 트래픽 량에 따라 테스크 실행 갯수가 조절이 된다.

GitActions를 통한 배포 자동화

배포 자동화를 구축하기 위해, 방법을 모색하던 중 이미 GitActions 배포 템플릿에서 ECS 배포용 yaml 템플릿이 있어 

 

해당 yml 파일을 입맛에 맞게 커스텀 해주었다.

 

각 블록을 살펴보자

 

name: Deploy to Amazon ECS

on:
  pull_request_target:
    types:
      - closed
      
  # 이 옵션을 통해 사용자가 직접 Actions를 통해 워크플로우 실행이 가능 !
  workflow_dispatch:
  
env:
  AWS_REGION: ap-northeast-2                  # set this to your preferred AWS region, e.g. us-west-1
  ECR_REPOSITORY: # set this to your Amazon ECR repository name
  ECS_SERVICE:  # set this to your Amazon ECS service name
  ECS_CLUSTER:  # set this to your Amazon ECS cluster name
  ECS_TASK_DEFINITION:  # set this to the path to your Amazon ECS task definition
                       # file, e.g. .aws/task-definition.json
  CONTAINER_NAME: backend # set this to the name of the container in the

name 블록은 워크 플로우 이름

 

on

 

PR이 머지 됐을 경우에만 배포가 될 수 있도록 설정.

 

workflow_dispatch

 

위에서 워크 플로우 배포를 실행 하기 위하여 반드시 PR을 머지시켰어야만 했는데, 

이를 생략하고 바로 실행할 수 있게 하기 위해 해당 옵션을 지정해주었다.

 

env

배포할 서비스 리전,
도커 이미지 프라이빗 레포지토리 ARN,
ECS 서비스 이름,
ECS 클러스터 이름,
ECS  테스크 정의 경로,
배포할 컨테이너 이름을 지정해주었다.

 

# 워크 플로우 종료 후, 배포 결과를 슬렉으로 알리기 위해 필요한 권한 설정
permissions:
  contents: read
  actions: read

jobs:
  deploy:
    if: |
      # 풀리퀘스트 머지시에만 job 실행
      github.event.pull_request.merged == true &&
      # 레포지토리가 fork된 레포지토리가 아닌, 원본 레포지토리일 경우에만
      github.repository == ${{ secretes.REPOSITORY_NAME }} &&
      github.event.pull_request.base.ref == 'main'
    
    # job 이름 설정
    name: Deploy
    # job 실행 환경 설정
    runs-on: ubuntu-latest
    # 배포 환경
    environment: production

    steps:
    - name: Checkout
      uses: actions/checkout@v3
      
    # GitActions에 ECS 서비스 배포 권한 및 ECR에 푸쉬 할 수 있는 권한을 가진
    # IAM 유저의 액세스 키와, 시크릿 키 설정을 해준다.
    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: ${{ env.AWS_REGION }}

    - name: Login to Amazon ECR
      id: login-ecr
      uses: aws-actions/amazon-ecr-login@v1
      
    # 도커 이미지 빌드 시, 필요한 환경변수는 이미 .gitignore로 제외 되었기 때문에
    # 이미지 빌드 전, repository Secrets에 애플리케이션 환경 변수를 저장 후 생성해준다. 
    - name: make application.yml
      if: contains(github.ref, 'main')
      run: |
        cd ./src/main/resources
        touch ./application.yml
        echo "${{ secrets.ENVIRONMENT_MAIN }}" > ./application.yml
      shell: bash
      
    # 프로젝트 루트 경로의 도커파일에 맞게 이미지 빌드 후, ECR에 푸쉬
    - name: Build, tag, and push image to Amazon ECR
      id: build-image
      env:
        ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
        IMAGE_TAG: ${{ github.sha }}
      run: |
        '''
        도커 이미지 빌드 명령어
        도커 이미지 ECR 푸쉬 명령어
        '''
	
    # 배포될 테스크 정의 파일 경로 지정
    - name: Fill in the new image ID in the Amazon ECS task definition
      id: task-def
      uses: aws-actions/amazon-ecs-render-task-definition@v1
      with:
        task-definition: ${{ env.ECS_TASK_DEFINITION }}
        container-name: ${{ env.CONTAINER_NAME }}
        image: ${{ steps.build-image.outputs.image }}
	
    # ECS 테스크 정의 배포
    - name: Deploy Amazon ECS task definition
      uses: aws-actions/amazon-ecs-deploy-task-definition@v1
      with:
        task-definition: ${{ steps.task-def.outputs.task-definition }}
        service: ${{ env.ECS_SERVICE }}
        cluster: ${{ env.ECS_CLUSTER }}
        # 배포한 서비스가 상태가 확인될 때 까지 대기
        wait-for-service-stability: true
        
    # 배포 결과 슬렉 전송
    - name: action-slack
      uses: 8398a7/action-slack@v3
      with:
      	# 프론트엔드와 백엔드 레포지토리가 분리 되어있기 때문에 따로 설정해준다.
        status: ${{ job.status }}
        author_name: 백엔드 배포 결과
        fields: repo,message,commit,author,action,eventName,workflow
      env:
        SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} # required
      if: always()

 

위와 같이 yml 파일로 배포 자동화를 설정 후에 배포 자동화가 무사히 잘 이뤄진 것 까지 확인해보았다.

 

문제점

GitActions에서는 배포 때 마다, 매번 새로운 실행환경을 생성하니 도커 빌드의 캐시를 제대로 활용하지 못하고 있었음

 

이는 곧 매 배포 시마다 새롭게 이미지 빌드를 하며 배포 시간이 늘어남

 

해결방안 : GitActions에서의 도커 이미지 레이어 캐시 활용

레이어 캐시를 사용하는 step을 추가해주면 같은 레이어를 다시 빌드하는데 드는 시간을 줄일 수 잇다.

 

이전 빌드의 캐시를 복원하는 동시에 (커밋마다) 새 캐시를 저장하게 된다.

- name: Cache Docker layers
      uses: actions/cache@v2
      with:
        path: /tmp/.buildx-cache
        key: ${{ runner.os }}-buildx-${{ github.sha }}
        restore-keys: |
            ${{ runner.os }}-buildx-

 

 

path 블록

캐시할 디렉토리를 지정하며, '/tmp/.buildx-cache'는 Docker Buildx가 이미지 레이어를 저장하는 임시 경로이다.

 

key 블록

캐시의 고유한 키를 설정한다. 캐시 키 ${{ runner.os }}-buildx-${{ github.sha }}와 같이 지정된다.

여기서 runner.os는 GitHub Actions 러너의 운영 체제를 나타내고, github.sha는 현재 커밋의 SHA를 나타낸다.

이렇게 하면 각 커밋마다 새로운 캐시가 생성되므로, 도커 레이어가 변경될 때마다 새로운 레이어가 캐시에 저장된다.

 

restore-keys 블록

이전 캐시를 찾을 때 사용되는 키의 패턴, key 값으로 캐시를 찾지 못할 경우 해당 블록에서 지정한 패턴에 맞는 가장 최근의 캐시를 사용한다.

위의 경우(${{ runner.os }}-buildx-)에는 이전에 빌드한 모든 Docker 레이어 캐시를 검색하는 데 사용된다.

'AWS' 카테고리의 다른 글

IAM  (0) 2024.03.30
AWS Cloud Support Associate 1차 면접 후기  (9) 2023.12.12

+ Recent posts