한마디로 정의하자면 -> AWS 클라우드에 배포한다.
sam build 명령어로 구성된 아티팩트를 가져와서 Amazon Simple Storage Service(Amazon S3)에 업로드하고 AWS CloudFormation을 사용하여 배포를 진행한다. sam deploy 명령의 출력문에서 AWS CloudFormation 스택에 대한 변경 사항을 볼 수 있습니다.
✏️ 좀 이해하기 어려웠지만 람다 생성기? 라고 생각하고 넘어갔다. 로컬에서 편하게 람다함수 작성하고 yml 파일 수정도 하여 로컬 테스트 환경도 제공한다.
aws 실습문서 의 설명이다.
이 설명서에서는 단원을 사용하여 샘플 Hello World 애플리케이션을 다운로드, 빌드 및 AWS SAM 배포합니다. 그런 다음 AWS 클라우드에서 애플리케이션을 테스트하고 필요에 따라 개발 호스트에서 로컬로 테스트할 수 있습니다.이 애플리케이션은 기본적인 API 백엔드를 구현합니다. 이 구성에는 Amazon API Gateway 엔드포인트와AWS Lambda 함수가 포함됩니다. API Gateway 엔드포인트에 GET 요청을 보내면 Lambda 함수가 호출됩니다. 이 함수는 hello world 메시지를 반환합니다.
이 글에서 다룰 내용은 샘플 Hello World 애플리케이션을 다운로드, 빌드 하여 S3 업로드 하고 CloudFormation 을 사용하여 배포를 진행한다.
전제조건
- aws 계정
- aws iam 사용자 추가 (sam_user)
- aws cli 설치
- sam cli 설치
(aws cli, sam cli 순으로 설치한다.)
위의 내용의 경우 좀만 검색하면 아주 잘 설명되있으므로 생략한다.
원하는 위치로 이동하여 sam init 명령어를 실행하면 템플릿 선택해달라고 나온다. 우린 AWS 에서 지원하는 템플릿 helloworld 로 진행할꺼기 때문에 1번 누르고 엔터하자.
공부하면서 정말 많이 보는 Hello World Example(1) 를 선택하자
그러면 위와 같이 뜨는데 무슨말이냐 도와줘요 파파고
y 를 선택하면 이놈이 일반적인 런타임 과 패키지 유형을 알아서 선택해준다고 한다. 난 y 를 선택
했다. n 을 선택하면 런타임과 패키지 유형을 선택하는 메뉴가 나오니 하고싶은걸로 진행하면 된다.
넌 또 누구냐...
내가아는 X선은 X레이 뿐인데... 뭔 소리냐 넌
아주 간단한 코드는 Lambda 로그를 통해서 에러를 디버깅하거나 Performance를 확인할 수 있지만 코드가 복잡해 지거나 Step Fuction을 통해서 여러개의 Lambda function이 동시 다발적으로 실행된다면 디버깅이 쉽지 않을 것이다. 이때 AWS X-Ray를 활용하면 좀 더 쉽게 Lambda에서 실행되는 코드를 Tracing 할수 있습니다.
코드를 쉽게 확인하고 디버깅 할 수 있는 기능인거 같다. 잘 모르는 기능이지만 Y 를 누른다.
자 번역
읽다보면 애플리케이션을 모니터링하는 서비스인거로 확인 됬다. 난 y 를 선택했다.
프로젝트 이름 그냥 enter 누르면 sam-app 로 시작된다.
위와 같이 설정내역과 함께 폴더가 생성된다. 해당 폴더의 구조는 아래와 같다.
./
├── README.md
├── __init__.py
├── events/
│ └── event.json
├── hello_world/
│ ├── __init__.py
│ ├── app.py
│ └── requirements.txt
├── samconfig.toml
├── template.yaml
└── tests/
├── __init__.py
├── integration/
├── requirements.txt
└── unit/세요
해당 폴더로 이동해서 sam build
명령을 실행하면 다음과 같이 성공한다.
sam deploy -g (sam deploy --guided) 명령어로 배포를 하니... 에러가 뜬다?
코드를 자세히 보니 내가 설정한 유저가 아니다... 난 sam_user 로 했는데? 원인 파악 !
cli 에서 aws configure 명령어 사용하여 유저 변경을 진행했다.
그러고 배포명령어를 입력하여 실행였는데.
또 에러... 뭐지 하고 클라우드포메이션에 스택의 이벤트를 확인하니 S3 Acess Denied 가 떠서 바로 알아챘다. sam_user 에게 권한을 안줬구나...
바로 추가 해주고 또 실행해본다. 또 에러... 권한이 또 없다는거 같다. 여기서부터 판단이 세워졌다. 아 생각보다 많은 권한이 필요하구나. 바로 구글링하여 sam으로 배포시 무슨 권한이 필요한가 검색하였다. 이것 저것 추가하면서 공식문서를 찾아서 진행하였다. https://docs.aws.amazon.com/ko_kr/ARG/latest/userguide/gettingstarted-prereqs.html 해당 페이지의 권한 추가법이 나오니 공식문서 확인해서 똑같이 진행하자.
나는 위와 같이 추가해줬다.
또 에러... 이 부분에서 거의 두시간 날렸다.
에러코드를 보니 ApplicationInsights 관련한 에러로 보이는데...
구글링 해보고 해보아도 답이 안나오던 찰나 나는 웬만하면 삭제하고 다시하는걸 싫어한다. 에러코드를 보고 그거에 대한 원인을 찾아서 하는 편이 원인파악도 되기 때문이지만... 크루님께서 삭제하고 다시해보라는 조언을 따라 진행하였다.
sam init 명령어 실행하고 기본 설정을 진행하던중 익숙한 글자가 보인다? Application insights? 이놈인가? 이놈 기능을 안쓰게되면 안뜨는 에러이지 않을까?
그래서 바로 이놈이 뭐하는 놈인지... 내가 하는 작업에 필요한 놈인지 아마존 공식문서에 접속하여 읽어보았다. 내가 이해하기로는 배포와는 관계 없고 로그 및 경보를 파악하고 지속적으로 모니터링하여 이상 및 오류를 감지하는 서비스? 인거 같다.
내가 하려는 실습과는 관계가 없다고 판단하여 N 으로 하고 진행하였다.
뭔가 초록불이 많다. 그렇다 성공이다.
aws Lambda 로 이동 StatusCode 200 인거 확인하였다. 배포가 성공적으로 되었다... 후
아까 sam init 에서 Application insights? 가 에러의 원인이었다. 근데 왜 Y 로 하면 안되는거지? 궁금했다. 궁금하면 찾아야된다.
내 킹리적인 의심과 각종 구글링으로 알아낸 결론은 사용자 권한
이 문제다. 각종 권한을 추가하고 지우고 추가하고 지우고 반복하다. 크루님이 올려주신 글을 발견했다.
sam 배포에 필요한 권한 정책은 표 안에 있는 것들이다.
만일 Application insights? 부분에서 Y 를 누른다면
CloudWatchApplicationInsightsFullAccess
권한도 추가해줘야 한다고 한다.
바로 다시 또 해본다.
나는 루트계정으로 진행 안하고 sam-user 라는 계정을 만들어 진행하였다.
각각의 서비스 마다 사용자를 추가해서 최소한의 권한뭔 부여하여 관리해주면 좋다고 해서 진행하였지만 그러한 이유로 나타난 트러블 이었다. 루트계정으로 진행하면 안생기는 트러블 이었다.
계정을 새로 만들어서 진행할 시 해당 서비스에 최소한의 권한을 우선적으로 파악하여 부여해야 한다.