[DEV] 7주차. AWS 클라우드(5)
1. Docker
- 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼
- 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있음
- 같은 코드여도 환경에 매우 의존적 -> 여러 os에 배포할 때 정상적으로 작동하지 않는 경우가 많음
- 가상화된 독립적인 환경까지 같이 배포하자!
Docker Image
- 이미지
- 컨테이너를 생성할 때 필요한 요소
- 컨테이너의 목적에 맞는 바이너리와 의존성이 설치되어 있음
- 여러 개의 계층으로 된 바이너리 파일로 존재
- 컨테이너
- 호스트와 다른 커넽이너로부터 격리된 시스템 자원과 네트워크를 사용하는 프로세스
- 이미지는 읽기 전용으로 사용하여 변경사항은 컨테이너 계층에 저장
- 컨테이너에서 무엇을 하든 이미지는 영향을 받지 않음
Docker Life Cycle
- docker file (build) -> 이미지 (pull) -> 컨테이너 (run) -> 이용
- 이미지는 직접 만들 수도 있고 (push), 도커 허브에서 가져올 (pull) 수도 있음
- 서버(로컬) - 도커 허브와 연동되어 있음
Docker Network
- 호스트와 컨테이너를 포트로 연동해주어야 함 (port forwarding)
- 호스트에서 띄운 포트로 클라이언트가 접속하여 서비스 실행
Docker 주요 명령어
- 컨테이너
- 생성 및 실행
run
- 중지
stop
- 실행
start
-
재실행
restart
- 확인
ps
-
삭제
rm
- 로그 확인
logs
- 컨테이너에 명령어 수행
exec
- 생성 및 실행
- 이미지
- 확인
images
- 삭제
rmi
- 다운로드
pull
- 업로드
push
- 태그 지정
tag
- 확인
Docker file
FROM
: 베이스 이미지 설정. <이미지 이름="">:<태그> 형식태그>이미지>METATAINER
: 메인테이너 정보RUN
: 쉘 스크립트나 명령 실행. 이미지 생성 시에 실행CMD
: 컨테이너가 시작되었을 때 실행할 파일 또는 쉘 스크립트EXPOSE
: 호스트와 연결할 포트 번호WORKDIR
: CMD에서 설정한 실행 파일이 실행될 디렉터리
- Java 예시
FROM openjdk:8-jdk-alpine
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} demo-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java", "-jar", "/demo-0.0.1-SNAPSHOT.jar"]
Docker-compose
- 여러 도커 파일을 띄우거나 관리하기 위해 사용
2. ECR / ECS
- ECR: 이미지 저장 및 관리 서비스
- ECS: ECR에 저장된 이미지를 기반으로 가상화된 서비스 제공 (Serverless)
리포지토리 생성
- [푸시 명령 보기] 에 나온 명령어를 차례로 실행
- 이미지 빌드 - 태그 설정 - 푸시
IAM 사용자 생성
- ECR Full Access 권한
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "ecr:*",
"Resource": "*"
}
]
}
ECS 사용
- 클러스터 & 서비스에서 ECR의 이미지 URI를 불러와서 생성
- 서비스 접속은 ELB를 구성해서 포트로 연결하여 사용!!
장점
- 별도의 EC2 연결 없이 docker로 간단하게 구성 가능
- CI/CD도 서비스까지 바로 적용될 수 있도록 할 수 있음
- gradle의 jib 플러그인을 이용하여 CI/CD를 구성할 수 있음
3. Lambda
- 서버리스 서비스
- 별도의 물리적인 서버(인스턴스)나 환경 없이 만든 함수만 등록해서 서비스할 수 있도록
- 특정 이벤트가 일어났을 때 프로그램이 실행되도록 함!
lambda 함수 생성
생성된 함수에서 코드 작성후 Deploy
S3 버킷에서 이벤트 알림 설정 - 만들어 둔 lambda 함수 연결
S3에서 파일이 업로드되면(event) 로그를 출력하도록 함
json 파일 업로드해주기
ClientError: An error occurred (AccessDenied) when calling the GetObject operation: Access Denied
에러
- 인터넷에 쳐보니 json 파일 내용에 문제가 있을 수 있다고 해서 아래 방법으로 다시 만들었는데도 오류가 발생했음
- 역시 역할 문제였음!
- IAM에서 연결되어있다고 생각했던 역할에 S3Access 정책을 부여했는데 다른 역할이었음..ㅎㅎ
- [lambda] - [구성] - [권한] - [실행 역할]에서 역할 바로 연결 가능!
- S3FullAccess 정책을 연결했음
python으로 json 파일 만들기
- mac에서 텍스트 편집기로 만들고 json으로 변경했더니 이상한 문자들이 덧붙여짐
import json
data = {
"temperature": 45
}
json_data = json.dumps(data)
with open('ex.json', 'w') as f:
f.write(json_data)
로그 생성
- CloudWatch에서 확인 가능
아래에서 3번째 줄에 설정한 로그가 출력됨! Be careful! It's getting really hot!!
4. API Gateway
- Gateway 역할을 하는 Serverless 서비스
- Lambda에 들어가는 트리거 역할을 할 수 있음
- 별도의 서버 구성 없이 간단한 코드로 API를 생성할 수 있음
- Lambda에서 추가적으로 DB나 파일에 데이터를 저장하도록 구성할 수 있음
- API 유형
- HTTP API
- 웹 소켓 API
- REST API
- REST API (private)
- VPC 내에서만 접속 가능
생성
REST API 생성
리소스 생성
메서드 생성
lambda 함수 생성 - 기본 코드
import json
def lambda_handler(event, context):
# TODO implement
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
lambda 함수 등록
lambda에 API Gateway가 연결됨
테스트 생성
정상적으로 호출됨