AWS의 ARN 이해하기
공식문서에서 AWS 리전에 대해 검색해보면 AWS는 전세계 곧곧의 리전들로 이루어져있고 리전마다 가용영역이 있다고 설명합니다. 이때문에 높은 가용률을 유지한다고하지만 머릿속은 더 혼란스러워집니다(…)
AWS에서 물리적인 단위를 이야기할때 리전/가용영역/엣지로케이션에 대해 알아야합니다. 먼저 리전은 AWS를 이루는 가장 큰 단위입니다. 각 리전들은 물리적으로 완전히 독립적이며 서울에서 만든 EC2와 도쿄에서 만든 EC2는 완전히 독립적으로 취급됩니다.
가용영역은 리전에 속해있는 데이터센터입니다. 각 리전은 하나 이상의 가용영역으로 이루어져있습니다. 우리가 서울리전으로 부르는곳도 2개의 가용영역 즉 2곳의 데이터센터로 이루어져있습니다. 그렇다면 왜 데이터센터를 한곳이 아니라 2곳을이상을 지을까요? 그 이유는 가용성입니다.
각각의 가용영역은 1개의 데이터센터 혹은 더 많은 복수개의 데이터센터로도 이루어질 수 있습니다.
AWS의 서비스들을 읽어보면 “가용성을 보장한다"라는 표현을 볼 수 있습니다. 다시말하면 가용성 이하로 떨어진다면 보상을 한다라는 뜻입니다. 1년에 가용성이 99.99%라면 365x24에 해당하는 8760동안 0.08시간이하의 다운타임을 가지며 그 시간을 초과할경우 보상을하게됩니다.
복수개의 가용영역은 매우 중요합니다. 만약 A라는곳에서 불이나도 B와 C가 있다면 서울리전에서의 서비스를 정상적으로 작동합니다. 단순계산으로 만약 데이터센터를 한곳만 돌렸을때 에러가 발생할 확률이 천분에 1이라고 한다면 2곳의 데이터센터가 동시에 문제가 발생할 확률은 1백만분에 1로 기하급수적으로 내려가게됩니다. (물론 실제로 그 일은 아주 쉽게 일어났습니다…)
또한가지, 가용영역을 더 잘 이해하기 위해서는 ARN에 대해서도 이해해야합니다. ARN은 Amazon Resource Number의 약자로 우리가 람다함수를 생성할때 EC2를 생성할때 생성되는 일련번호입니다. AWS에는 각각의 서비스에서 만든 리소스들을 ARN으로 구분하고 ARN이 다르다면 서로 다르게 취급됩니다. 일반적인 ARN은 아래와 같이 이루어져있습니다.
ARN/파티션구분자/서비스명/리전/계정번호 + 서비스마다의 상세 구분자
파티션 구분자 aws가 있는 이유는 중국에 AWS콘솔과 독립적인 서비스가 있때문입니다. 이 서비스의 경우 arn:aws-ch로 시작합니다. 미국정부 역시 AWS를 사용하고있는데 보안상의 이유로 독립된 파티션 구분자를 갖습니다.
arn:aws:lambda:region:account-id:function:function-name
람다함수의 경우 상세구분자로 function과 function-name이 있습니다. 그 이유는 람다함수에 layer라는 서비스도 있기때문에 layer일경우 layer:layer-name으로 구분지어줍니다. 눈여겨 볼것은 함수 이름이 다르면 완전히 다른 리소스로 처리를합니다. 람다함수의 이름을 바꾸고싶다면 새로운 람다함수를 만들어 소스코드를 붙여넣기 하는 수밖에 없습니다. ARN에 함수이름이 포함되기때문에 완전히 다른 개체로 봐야하기때문입니다. 이렇든 ARN은 많은 정보를 포함하고있습니다. 하지만 ARN에 가용영역 정보는 없습니다. 그래서 가용영역을 바꾼다고 했을때 새로운 함수를 만들 필요가 없고 언제든 가용영역이 바뀔 수 있습니다. 만약 C의 가용영역에서 불이나서 A의 가용영역에서 동작을한다고 다르게보지않습니다.
ARN이 너무 많이 쪼개지는것같다는 느낌이 들 수 있겠지만 ARN형식은 IAM을 통해 권한을 설정할때 정말 쉽게도와줍니다.
{ "Effect": "Allow",
"Action": "lambda:*",
"Resource": [ " arn:aws:lambda:ap-northeast-2:964581251123123:function:lambda_api_billing",
위의 IAM 정책은 lambda_api_billing라는 lambda함수의 모든 설정을 부여합니다. 이때 모든 서울리전에 있는 모든 람다함수중 964581251123123에 연결된 람다에대해 권한을 주고싶다면
arn:aws:lambda:ap-northeast-2:964581251123123:*
모든 리전에 주고싶다면
arn:aws:lambda:*
위와같이 표시할 수 있습니다.