여러개 인스턴스 중에서 되는걸로 사용하는법

그냥 인스턴스만들기한다음 기타 + 스팟 체크해서 사용하는 방법도 있움

 

 

1. 템플릿 만든다. (AMI 설정/키페어/보안그룹/스토리지 등등)

2. 스팟 생성하기에서  템플릿 선택하고, 네트워크-가용영역-서브넷 설정 (서브넷 설정에서 private 안되게 지정해준다. private 서브넷 선택되면 ssh 안드가짐)

3. 인스턴스 유형 선택하기 ( inf2.xlarge를 사용하고 싶을땐 inf2.xlarge선택하고, 나머지는 그거보다 큰걸로 설정해놓으면 됨)

'<Cloud> > AWS' 카테고리의 다른 글

AWS Sagemaker Studio Data Wangler 실습  (0) 2022.12.27
[EC2 CLI] aws ec2 run-instances  (0) 2022.07.11
AWS 보안서비스 종류들  (0) 2022.05.19
AWS ECS 간단이해  (0) 2022.05.18
Lamdba Cold start 예방하는 방법 2가지  (0) 2022.05.18

AWS 가서 10-5시까지 Sagemaker 강의?워크샵? 듣고 왔다.

 

Workshop Studio

 

catalog.us-east-1.prod.workshops.aws

ㄴ 실습링크

 

강의순서는 다음과같았다.

1. Sagemaker Canvas

2. Feature Engineering

3. Bring Your Own Script

4. Bring Your Own Container

 

Sagemaker Canvas는 이전에 해봤던거라 중복이라 패쓰

 

2. Feature Engineering 부분에서 Sagemaker Data Wangler를 사용해서 실습을 진행했어서 이부분만 위주로 살펴보고자함

 

워크샵에서 아래 실습으로 진행했다. 그런데 리뉴얼되면서 중간중간 사진이랑 다른부분이 꽤 많았음. 달랐던 부분만 사진 첨부했다.

 

Workshop Studio

 

catalog.us-east-1.prod.workshops.aws

 

DATA Wrangler가 어디있나 한참 찾았음..ㅋㅋ
아이콘이랑 우클릭이 좀다른데 기본적인 기능은 동일한거같다.
add analysis 하고 저장하면 저렇게 가지가지 생긴다.
설명서에는 줄줄이 소세지처럼 보이지않고 뒤에 4개가 다 모여있다. 그냥 제일긴줄에서 맨뒤에있는거 플러스 클릭하고 진행하면된다

 

데이터 분석은 아래 예시처럼 피처별로, 여러 방식대로 선택해서 볼수 있다.

또 아테나에서 쿼리날려서 볼수도 있음.

 

 

[ Data Wangler 개인적으로 느꼈던점 ]

장점 :

  • 데이터 전처리할때 클릭으로만으로도 진행가능한게 (원핫인코딩,컬럼빼기,데이터합치기등등) 간단해서 좋다.
  • 히스토그램이나 scatter 일일히 피처마다 그리기 귀찮은데 그걸 알아서 클릭만하면 그려주기 때문에 데이터 분석할때 시간적으로 가성비가 진짜 최고인듯하다. (클릭클릭만 하면 꽤 괜찮아보이는 그래프 그려주고 한눈에 보기에도 좋음)

단점 : 

  • 파이썬 코드를 집어넣어서 진행하는 전처리는 사실 쥬피터에서 하는게 더 나아보였다.  
  • 데이터 분석까지는 최고인데 데이터 전처리부분은 사실 완벽하지는 않은 느낌이였음.

 

 

 

그외에 3. Bring Your Own Script, 4. Bring Your Own Container 시간에는 아래 실습을 진행했다.

일단 하라는대로 돌리긴 다돌렸는데 100% 다 이해하진 못했음.

 

Workshop Studio

 

catalog.us-east-1.prod.workshops.aws

 

아직까지는 연구실 서버는 공짜인데 sagemaker 쥬피터랑 콘솔을 쓰면 하나부터 열까지 돈이라 부담스럽고 비싸서 실제로 서버대용으로 사용하지는 못할거같다...

 

 

 

 

[ 그리고 강의에서 공유해주신것들 ]

  • 앵간한 코드는 여기서 복붙하면된다고 알려주신 사이트
 

1. Introduction — Dive into Deep Learning 1.0.0-beta0 documentation

 

d2l.ai

  • 실습링크보다 더 다양한 example이 있어서 참고하라고 알려주심
 

GitHub - aws/amazon-sagemaker-examples: Example 📓 Jupyter notebooks that demonstrate how to build, train, and deploy machine

Example 📓 Jupyter notebooks that demonstrate how to build, train, and deploy machine learning models using 🧠 Amazon SageMaker. - GitHub - aws/amazon-sagemaker-examples: Example 📓 Jupyter notebooks...

github.com

 

'<Cloud> > AWS' 카테고리의 다른 글

AWS Spot Instance Start  (0) 2024.03.29
[EC2 CLI] aws ec2 run-instances  (0) 2022.07.11
AWS 보안서비스 종류들  (0) 2022.05.19
AWS ECS 간단이해  (0) 2022.05.18
Lamdba Cold start 예방하는 방법 2가지  (0) 2022.05.18

 

여기 다나와있음

 

run-instances — AWS CLI 1.25.26 Command Reference

Note: You are viewing the documentation for an older major version of the AWS CLI (version 1). AWS CLI version 2, the latest major version of AWS CLI, is now stable and recommended for general use. To view this page for the AWS CLI version 2, click here. F

docs.aws.amazon.com

 

사용 예제는 다음과 같이 

aws ec2 run-instances --image-id $IMAGE_ID --count 1 --instance-type $INSTANCE_TYPE --key-name $AWS_KEY --subnet-id $SUBNET_ID --security-group-ids $SG_ID --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=ys-dcgmi}]')

 

 

--image-id   이미지이름 ( ex: "ami-05f0a758b1c9909d1")

--count    인스턴스 몇개 생성할거냐

--instance-type   인스턴스 타입 (ex : "g4dn.xlarge")

--key-name   pem키이름 (ex : mykey.pem)

--subnet-id   서브넷은 뭘로할거냐 (ex : subnet-3deb2888)

--security-group-ids :   보안그룹 뭘로할거냐 (ex : sg-005ob...)

--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=[여기 인스턴스 이름적으면됨]}]'    : 태그다는건데 인스턴스 Name 설정해줌  

--user-data   :  cli 말고도 그냥 시작할때도 있다. 인스턴스 시작하면서 같이 수행해줄 명령어 bash 명령어 적어주면됨 ( 명령어 다 끝날떄까지 인스턴스 상태가 초기화상태가됨)

--placement AvailabilityZone=us-west-2c  :   원하는 리전에 인스턴스 생성

--launch-template LaunchTemplateName=MYTEMPLATE  :   생성한 템플릿으로 인스턴스 생성

--disable-api-termination :   실수로 종료되지않게끔 설정. 종료하고싶으면 아래처럼 설정을 바꿔준다음에 종료해주면 됨.

ec2-modify-instance-attribute --disable-api-termination false INSTANCEID

 

 

 

** 실행하기 앞서서 aws ec2 run-instance 로 지정해준 이미지나, 보안그룹등이 속하는 리전과  실행 터미널에서 aws configure 을 입력했을때의 리전이 같아야한다

'<Cloud> > AWS' 카테고리의 다른 글

AWS Spot Instance Start  (0) 2024.03.29
AWS Sagemaker Studio Data Wangler 실습  (0) 2022.12.27
AWS 보안서비스 종류들  (0) 2022.05.19
AWS ECS 간단이해  (0) 2022.05.18
Lamdba Cold start 예방하는 방법 2가지  (0) 2022.05.18

< Cloudtrail >

1) cloudtrail 에서 추적생성 (로그기록을 s3 버킷에 저장)

2) cloudwatch 로그그룹에서 지표필터생성(e.g. s3버킷을 필터링할것이다.)

3) cloudtrail log , cloudwatch 통합하기

4) SNS 이벤트 등록하기 (경보생성) -> 조건을 주고 그 조건에 해당하는 이상경보를 이메일이나 문자로 전송하는 역할

(e.g. s3에서 1개이상의 움직임을 보인다면(cloudtrail log에서감지) 이메일을 보내 알려라)

 

< Athena >

아테나를 통해 cloudtrail s3버킷에 저장된 로그기록을 쿼리해서 분석할수 있다.

ex) 지난 7일동안 사용한 user들의 리스트

 

< Config >

특정 규칙을 지정해주고 규칙에 반하는 리소스들을 확인가능

e.g.)

  • cloudtrail-enabled : CloudTrail 기능이 켜져있는지 확인합니다. 
  • ec2-instance-in-vpc : EC2 인스턴스가 VPC 에 연결이되어 있는지 확인합니다.
  • s3-bucket-versioning-enabled : S3 버킷의 Versioning이 enable 되어있는지 살펴봅니다

아래 대시보드 캡쳐에서 규칙은 위의 3가지 예와 같은 것들 / 리소스는 해당 규칙에 부합하는 모든 리소스들

특정 규칙에 부합하는 모든 리소스가 규칙에 만족하면 해당 규칙은 초록색으로 규칙준수 표시로 바뀐다. 

(e.g. s3안의 모든 bucket 들, EC2 인스턴스들이 모두 리소스에 해당 / s3의 모든 버킷(리소스)이 version 활성화되면 s3-bucket-versioning-enabled의 규칙은 초록색으로 규칙준수 상태표시)

 

< Inspector >

인스턴스 검사를 위해서 Agent 설치가 필요 but inspector 는 이미 설치되어있음

설치해서 들어가서 보면 다음과같이 보임. 위험도를 필터링해서 사용할수 있음.

 

< Macie >

민감한 데이터를 퍼블릭으로 오픈된 S3 에 올렸을경우 보안에 문제가 생길수 있음

S3 버킷을 스캐닝해서 위험도가 높은 데이터를 추려서 보여줌

e.g. 탐지해줄 버킷을 지정한다음 작업을 생성하면 아래처럼 민감한 데이터의 경우 위험하다고 경고해줌. pem 키나 개인정보를 저장할경우 위험도는 HIGH 로 뜬다.

 

< KMS >

kms 설정해준 버킷의 경우 안에 들어있는 내용물을 보기위해 링크로 접근하면 거부된다. 에러발생하는게 정상. 파일자체는 공개접근이 가능하게 세팅해주어도 객체를 복호화해줄 키가 없어서 에러가 발생함. 

 

 

< 개념 설명 >

 

 

Amozon ECR : Amazon에서 제공하는 컨테이너 이미지 저장소. ECR 리포지토리에서 푸쉬하면 이미지가 생긴다

 

컨테이너 인스턴스 :  도커구동을 위해서 작동하는 EC2 인스턴스입니다. 일반 EC2와 마찬가지로 오토스케일링,로드발란스 가능.

 

클러스터 : 작업요청을 실행할수 있는 1개이상의 컨테이너 인스턴스를 리전별로 그룹화한것. (=위에 언급한 컨테이너 인스턴스들의 묶음)

 

작업정의 : 작업의 일부가될 컨테이너의 갯수, 컨테이너가 사용할 리소스, 컨테이너간의 연결방식,컨테이너가 사용할 호스트포트같은 어플리케이션관련 컨테이너 정보를 지정해줌. (=작업정의는 이런 도커 컨테이너들을 위한 설정 템플릿입니다.)

 

 

<진행순서>

 

1.  ECR 리포지토리 생성

2. 컨테이너 이미지 생성후 ECR 리포지토리에 푸쉬 (ECR 리포지토리 푸쉬 명령 눌러서 명령어 차례차례 실행하기)

*ECR 레포지터리만들기 + 푸쉬하는법 (더보기 클릭)

3. 작업정의

    ECR 리포지토리 url 복사후 넣어주어 컨테이너 추가 (아래그림에서는 이미지란에 url 복붙)

    위의 개념에서 설명한것처럼 컨테이너가 사용할 호스트포트도 지정가능 

4.  클러스터 생성

5. 클러스터안의 서비스에서 생성버튼 눌러서 서비스 생성

 

 

 

 

 

 

 

참조

 

1. 람다 프로비저닝

(1) 성공적으로 작동하는 람다를 버전으로 저장 +(별칭 지정해주기 이건 선택사항)

(2) 프로비저닝 동시성설정해주기

**아래 (더보기) 버튼 눌러서 실습보기

 

2.EventBridge(구cloudwatch event) 에 일정시간마다(예:5분마다) test json 실행시켜주기

(람다 선택할때 버전 or 별칭 꼭 선택해줄것)

**아래 (더보기) 버튼 눌러서 실습보기

더보기
버전 or 별칭 지정안해주면 해당 규칙이 제대로 적용이안된다 중요중요

 

그다음에 쭉 [다음] -> [생성] 해서 규칙생성 완료해주기

생성해주고 들어가서 람다 버전 맞는지 다시한번 확인해줄것 

 

 

AWS 가 리뉴얼되면서 클릭 한번으로 VPC를 전부 구성할수 있게 되었다 ( 서브넷,인터넷 게이트웨이 등등...)

아래와같이 구성해주었을때의 구조랑 개념설명

 

( + CloudFormation Template를 사용해서도 한방에 vpc를 생성해줄수 있으나,사용자가 직접 template 를 구성해야한다는 번거로움이 있음)

 

<구조>

 

< 간략한 개념 설명 >

VPC : AWS 에서 독립적으로 사용가능한 네트워크라고 생각하면된다.

(디폴트 VPC 는 사용을 권장하지 않음. 이유는 퍼블릭상태라 외부에서 접근해서 변경해줄수가 있기 때문. 테스트용도로만 사용하기를 권장하며 중요한 프로젝트나 내용은 따로 VPC를 새로 생성해서 사용하는것을 권장한다)

 

서브넷 : 서브넷은 IP 주소에서 네트워크 영역을 부분적으로 나눈 부분 네트워크를 의미한다. 

(다만 아래 몇개 주소는 미리 예약되어 있는 주소라 사용불가능함.)

 

퍼블릭 서브넷 : 외부와 자유로운 통신이 가능하다. 한마디로 외부에서도 자유롭게 들어올수 있고 내부에서도 외부로 자유롭게 나갈수 있다. 예를들면 아이피를 찍어서 외부에서 내부로 직접 들어올수 있다. 

 

프라이빗 서브넷 : 중간다리를 통하지 않으면 외부에서 절대 접근이 불가능. 내부에서 외부로 나가는것만 가능하다. 

(예를들어서 web server만 퍼블릭하게 설정해주고 application server/database server 같은 부분은 외부에서 접속가능하면 큰일나기 때문에 private 으로 설정해줘야함)

 

Nat gateway : 프라이빗 서브넷이 외부와의 중간다리 역할을 하는게 이것. 프라이빗 서브넷을 사용하기위해서는 퍼블릭 서브넷안에 nat gateway 를 생성해주고 natgateway 를 통해서 퍼블릭 서브넷을 사용해 외부와 소통한다. 

 

elastic ip : 고정 IP (ec2 인스턴스를 중지했다가 다시시작하면 아이피가 바뀌기 떄문에 중지했다 다시 시작해도 고정된 아이피로 진행되게 한다. ipv4는 한정적이라 한계정당 5개정도밖에 지정을 못해준다고 한다)

 

인터넷 게이트웨이 : 인터넷 게이트웨이는 공공 네트워크 구간으로 퍼블릭 서브넷의 IP 통신을 도와준다. 한마디로 VPC 대문이라고 생각하면된다. 퍼블릭 서브넷이랑 연결된 라우팅 테이블 제일 마지막에는[ 0.0.0.0/0  인터넷게이트웨이 ] 이렇게 구성되어서 외부로 나갈수 있게 세팅해주어야한다.

 

사실 지금까지 호환성에 대해서는 그렇게 크게 신경쓰지 않았고,기존에 사용한 AMI 이미지를 사용했으나 이제껏 전혀 문제가 없었기 때문에 호환성에 대해 무지했고 버전에 중요성에 대해 크게 생각하지 않았다. 

그런데 꽤 최근에 나온 GPU에서 구 버전 CUDA를 사용하다가 생각도 못한 에러폭탄을 맞아서 호환성의 중요성에 대해 느끼게 되었다...

 

아래는 텐서플로우, 쿠다, 파이썬 버전 호환성 확인 (쿠다 11.2 이상부터는 파이썬도 3.7이상 사용해야함)

 

소스에서 빌드  |  TensorFlow

Help protect the Great Barrier Reef with TensorFlow on Kaggle Join Challenge 소스에서 빌드 소스에서 TensorFlow pip 패키지를 빌드하고 Ubuntu Linux 및 macOS에 설치합니다. 명령어는 다른 시스템에도 적용될 수 있지만, U

www.tensorflow.org

 

 

< G5 인스턴스 >

g5 인스턴스는 CUDA11.4 이상 사용을 권장

(aws repost 라고 aws호환성관련해서는 답은좀 느리지만 궁금한게 있으면 여기에 질문하는게 정확한것 같다. )

https://repost.aws/questions/QUNR0L1sSIRd-e1zeRIoEc1Q/gpu-fails-to-intialize-on-g-5-xlarge-instance

 

GPU fails to intialize on g5.xlarge instance | AWS re:Post

Hello, I have tried to create several g5.xlarge innstance with various AMI "quickstart" (Deep Learning AMI GPU TensorFlow 2.7.0 (Amazon Linux 2) 20211111 - ami-0850c76a5926905fb, Deep Learning AMI...

repost.aws

 

< p4d.24xlarge 인스턴스 >

아래는 내가 물어본질문이다. 

쿠다 10.1에서는 도저히 에러해결이 안되서 동일한 암페어 GPU (2020년 9월 출시한 RTX 3000 시리즈는 공식적으로 쿠다11이상만 지원하고있다 )가 쿠다 11이상을 지원하는걸보고 11.4로 실행했더니 해결했다. 

뒤늦게 답이 달렸는데 쿠다버전, 텐서플로우버전, 심지어 이미지까지 알려주셨다. 

https://repost.aws/questions/QUdPFPsWPcSh6TIozmOGBidw/runtime-error-cuda-runtime-implicit-initialization-on-gpu-0-failed-status-device-kernel-image-is-invalid

 

RuntimeError: CUDA runtime implicit initialization on GPU:0 failed. Status: device kernel image is invalid | AWS re:Post

The environment I'm using is: - aws p4dn.24xlarge instance (NVIDIA Ampere A100 GPU ) - cuda 10.1 - tensorflow 2.3.0 - python 3.6.9 I get an error when I run the following. What is the reason? `...

repost.aws

 

 

 

 

 

 

 

 

 

  • aws configure 설정은 기본으로 되어있다는 가정하에 시작

 

아래 코드를 받아서 실행해보기

LAUNCH_INFO=$(aws ec2 run-instances 
--image-id $IMAGE_ID
--count 1 
--instance-type $INSTANCE_TYPE \\
--key-name $AWS_KEY 
--subnet-id $SUBNET_ID 
--security-group-ids $SG_ID)

INSTANCE_ID=$(echo $LAUNCH_INFO | jq -r '. | .Instances[0].InstanceId')
INSTANCE_DNS=$(aws ec2 describe-instances --instance-ids $INSTANCE_ID | jq -r '. | .Reservations[0].Instances[0].PublicDnsName')

 

image id 

1. cli 명령어로 찾는 방법

aws ec2 describe-images --filters 'Name=description,Values=*Deep Learning Base AMI*' --query 'Images[*].[ImageId,Description]' --output table

2. 검색해서 찾기

https://aws.amazon.com/marketplace 여기서 검색해서 찾으면됨

( 찾는 방법은 https://brunch.co.kr/@topasvga/872 여기보면 자세히 나와있음)

 

** 주의할점 : region 마다 ami-12345 이름이 다르다고 한다.

us-west-2 의 이름을 다시한번 검색해보기

aws ec2 describe-images --image-ids ami-048d4939678169ad1 --region us-west-2

ㄴ 결과동일함

 

 

key-name

 

- 새로운 키를 만들어주고 시작

키페어 만들기

# aws ec2 create-key-pair --key-name ys-oregon
aws ec2 create-key-pair --key-name ys-oregon2 --query 'KeyMaterial' --output text > ys-oregon2.pem
chmod 400 ys-oregon2.pem

 

 

실행 과정에서 생긴 에러들

실행시 에러 발생)

An error occurred (OptInRequired) when calling the RunInstances operation: In order to use this AWS Marketplace product you need to accept terms and subscribe. To do so please visit https://aws.amazon.com/marketplace/pp?sku=2vxg2tallhcptfrs5iu2ml6dx

⇒ 다른 인스턴스로 변경하고나서 해결

( 아니면 마켓 플레이스에서 subscribe 하고 사용하면 됨)

 

실행시 에러 발생)

인스턴스 생성후 인스턴스 접속시에 문제발생

Warning: Identity file ys-oregon not accessible: No such file or directory.

경로에 한글이 들어있어서 그렇다고한다.

(x) 시도1 )

파일내에서 여기저기 위치를 변경해주어도 파일경로를 살펴보니 /Users/사용자/FIle/.. 이렇게 파일이름이 한글인것이 문제인듯하여 ⇒ 그냥 노트북을 한글 → 영어로 세팅 변경

(x) 시도2 ) 파일 이름을 변경해봄

  • 주소/abc.pem
  • 주소/abd
  • abc
  • abc.pem....

(x) 시도 3) chmod 400 ys-oregon.pem

chmod 400 ./ys-oregon.pem

chmod 400 /Users/heoyunseo/desktop/aws_pem/ys-oregon.pem

https://stackoverflow.com/questions/31469392/ec2-chmod-cannot-access-mypemfile-pem-no-such-file-or-directory

(x) 시도 4) aws ec2 create-key-pair --key-name ys-oregon2 --query 'KeyMaterial' --output text > ys-oregon2.pem 로 키페어 다시만들기

(0) 시도5) 인스턴스 생성할떄는 --key-name ys-oregon2 / 인스턴스에 접속할때는 ys-oregon2.pem 으로 접속

ㅠㅠㅠㅠ SSH 접속할때 ys-oregon2.pem 이 아니라 ys-oregon 으로 적용해줘서 에러가 났던것... 멍청....

 

실행시 에러 발생)

ssh: connect to host ec2-34-217-124-46.us-west-2.compute.amazonaws.com port 22: Operation timed out

⇒ 보안그룹의 인바운드규칙 에 모든 트래픽을 추가해주었더니 해결

 

 

 

INSTANCE_ID=$(echo $LAUNCH_INFO | jq -r '. | .Instances[0].InstanceId')
INSTANCE_DNS=$(aws ec2 describe-instances --instance-ids $INSTANCE_ID | jq -r '. | .Reservations[0].Instances[0].PublicDnsName')

이 부분에 대한 이해

  • echo $LAUNCH_INFO 로 인스턴스 시작
  • 실행한 결과를 jq 에 전달 ( 버티컬바는 왼쪽의 결과를 오른쪽에 넘겨준다는 의미)
$ echo '{"a": {"b": {"c": "d"}}}' | jq '.a | .b | .c'
"d"

  • INSTANCE_ID 는 INSTANCE_DNS를 구하기위해 사용
  • INSTANCE_DNS 는 ssh 연결을 위해 구해줌

 

 

 

 

참조 : https://brunch.co.kr/@topasvga/872

https://www.44bits.io/ko/post/cli_json_processor_jq_basic_syntax

 

 

 

<맥북기준> 현재 위치에 인스턴스내 모든 파일 저장

scp -i /Users/yyyooo/desktop/aws_pem/ys.pem -r ubuntu@18.206.202.171:/home/ubuntu/Hardware-Data/ .

- 18.206~ 이건 본인 인스턴스  퍼블릭 IPv4 주소 로 바꿔주면 되고, ec2 일경우 ubuntu 말고 아마 ec user? 로 바꿔주면 될것

- ys.pem 이건 본인 pem 키 위치 바꿔서 넣어주면된다. (yyyoo는 내 노트북내 내이름)

- /home/ubuntu/Hardware-Data/ .  => 이거는 왼쪽에 옮겨줄 ec2 내 파일위치 / 오른쪽 . 이건 내 현재 위치 말함

 

<윈도우 기준>

scp -i C:/Users/Owner/Desktop/ys2.pem -r ubuntu@54.226.138.113:/home/ubuntu/Hardware-Data/ .

 

#!/bin/bash = #!/bin/sh

ㄴ 스크립트파일 bash쉘로 실행. 기본적으로 bash 쉘로 되어있어서 굳이 안써도 상관은없는데 오류방지를 위해 쓰는것이 좋다.

 

EC2 CLI

run-instances
[--block-device-mappings <value>]
[--image-id <value>]
[--instance-type <value>]
[--ipv6-address-count <value>]
[--ipv6-addresses <value>]
[--kernel-id <value>]
[--key-name <value>]
[--monitoring <value>]
[--placement <value>]
[--ramdisk-id <value>]
[--security-group-ids <value>]
[--security-groups <value>]
[--subnet-id <value>]
[--user-data <value>]
[--additional-info <value>]
[--client-token <value>]
[--disable-api-termination | --enable-api-termination]
[--dry-run | --no-dry-run]
[--ebs-optimized | --no-ebs-optimized]
[--iam-instance-profile <value>]
[--instance-initiated-shutdown-behavior <value>]
[--network-interfaces <value>]
[--private-ip-address <value>]
[--elastic-gpu-specification <value>]
[--elastic-inference-accelerators <value>]
[--tag-specifications <value>]
[--launch-template <value>]
[--instance-market-options <value>]
[--credit-specification <value>]
[--cpu-options <value>]
[--capacity-reservation-specification <value>]
[--hibernation-options <value>]
[--license-specifications <value>]
[--metadata-options <value>]
[--enclave-options <value>]
[--count <value>]
[--secondary-private-ip-addresses <value>]
[--secondary-private-ip-address-count <value>]
[--associate-public-ip-address | --no-associate-public-ip-address]
[--cli-input-json <value>]
[--generate-cli-skeleton <value>]

describe-instances
[--filters <value>]
[--instance-ids <value>]
[--dry-run | --no-dry-run]
[--cli-input-json <value>]
[--starting-token <value>]
[--page-size <value>]
[--max-items <value>]
[--generate-cli-skeleton <value>]
LAUNCH_INFO=$(aws ec2 run-instances --image-id $IMAGE_ID --count 1 --instance-type $INSTANCE_TYPE \
--key-name $AWS_KEY --subnet-id $SUBNET_ID --security-group-ids $SG_ID)

 

[--count <value>]

시작할 인스턴스 수.(기본값은 1). 범위가 min:max 형식으로 제공되면 첫 번째 숫자는 시작할 최소 인스턴스 수로 해석되고 두 번째 숫자는 시작할 최대 인스턴스 수로 해석함.

[--image-id <value>]

AMI의 ID. AMI ID는 인스턴스를 시작하는 데 필요하며 시작할떄 지정해줘야함.

[--instance-type <value>]

인스턴스 타입 (ex:g4dn.xlarge)

[--key-name <value>]

키 쌍의 이름. (CreateKeyPair 또는 ImportKeyPair 를 사용하여 키 페어를 생성할 수 있다.)

[--subnet-id <value>]

[EC2-VPC] 인스턴스를 시작할 서브넷의 ID. 네트워크 인터페이스를 지정하는 경우 서브넷을 네트워크 인터페이스의 일부로 지정해야 함.

[--security-group-ids <value>]

보안 그룹의 ID. (CreateSecurityGroup을 사용하여 보안 그룹을 만들 수 있다.) 네트워크 인터페이스를 지정하는 경우 보안 그룹을 네트워크 인터페이스의 일부로 지정해야 한다.

**** echo**

확인용 https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-usage-returncodes.html

[--instance-ids <value>]

The instance IDs. (Default: Describes all your instances.)

 

 

JQ

  • jq로 json 처리하기

ㄴ -query로 수행할 수 없는 고급 필터링의 경우 명령줄 JSON 프로세서인 jq를 고려할 수 있다.

더보기
더보기
더보기

INSTANCE_ID=$(echo $LAUNCH_INFO | jq -r '. | .Instances[0].InstanceId')

$ cat sample.json
{"data":{"name":"myname","values": [{"id": "id0","url": "url0"},{"id": "id1","url": "url1"},{"id": "id2","url": "url2"}]}}
$ cat sample.json | jq .
{
  "data": {
    "name": "myname",
    "values": [
      {
        "id": "id0",
        "url": "url0"
      },
      {
        "id": "id1",
        "url": "url1"
      },
      {
        "id": "id2",
        "url": "url2"
      }
    ]
  }
}

. (점하나)

입력그대로 출력함

.foo (점다음에 key값)

점다음에 키값의 value를 출력한다.

.foo = .["foo"] = ."foo"

 

.[] (점뒤에 괄호)

 

결과 9 8

|(파이프)

두개 필터를 결합함.

ex) .a | . | .b = .a.b

.a.b.c = .a | .b | .c.

-raw-output / -r (ex: jq -r)

필터의 결과가 문자열이면 따옴표가 있는 JSON 문자열로 형식이 지정되지 않고 표준 출력에 직접 기록됨. non-JSON-based systems과 통신할때 사용.

사용예제 : https://gist.github.com/hummus/8592113

여러줄일때는 맨뒤에 \ 붙이고 이어서 다음줄에 줄줄이 쓰면됨

입력그대로 출력함

 

 

 

EC2 describe~

  • EC2 특징출력하기

https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-usage-filter.html

$ aws ec2 describe-volumes

  • EC2 인스턴스들 나열하고 정보확인하기

https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-services-ec2-instances.html

 

 

aws ec2 describe-instances --instance-ids i-12abc34 --query 'Reservations[].Instances[].PublicDnsName'

ㄴ i-12abc34 라는 인스턴스아이디를 가진 인스턴스의 PublicDnsName

 

 

 

 

웹에서 input 데이터를 API Gateway 로 보내려고 AJAX를 사용했다.

아래 코드는 웹에서 클릭 버튼을 눌렀을때, input 데이터들을 api 로 전달해주고 + output 데이터들을 받아오는 Funtion 이다

index.js

function clickclick(){
    let form = $("#ajax-upload-form");
    let formData = new FormData(form[0]);

    formData.append('inputdata_one', $("#inputdata_one").val());
    formData.append('inputdata_two', $("#inputdata_two").val());
	//formData 에 전달해줄 INPUT 데이터값들을 추가로 붙여준다. 

    this.result = []
    $.ajax({
    type: "POST",
    url: 'https://vvvvvv.execute-api.us-east-1.amazonaws.com/pp/predict',  //api gateway URL
    header: {
        "Content-Type": "application/json",	//Content-Type 설정
        "X-HTTP-Method-Override": "POST",
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Methods': 'POST',
        'Access-Control-Allow-Headers': '*',
        'Access-Control-Allow-Age': 3600
    },
    dataType: "json",
    data: formData,
    AccessControlAllowOrigin: '*',
    crossDomain: true,
    contentType: false,
    async: false,
    enctype: 'multipart/form-data',
    processData: false,

    success: function (data, status) { //람다에서 제대로 잘 돌아왔을때,
        let result = data['body'] //API 에서 건너온값 data 중 'body'부분만 솎아낸다
        result = result.replace("\"", ""); 
        result = result.split('&');  //result가 여러개라 &로 구분하였기 때문에 끊어줌
        
        console.log("data : ", data) //잘들어온건지 확인하고 싶어서
        console.log(result[0]) //잘나눠졌는지 확인하고 싶어서
    },
    error: function (e) {
        console.log("ERROR : ", e);
        $("#btnSubmit").prop("disabled", false);
        alert(e.message);
    }
    });
}

 

index.html 일부 (파일올리고 제출하는 부분)

                    <form method="POST" enctype="multipart/form-data" id="ajax-upload-form" name="upload-form">
                        <input type="file" name="upload-file" id="upload-file" onchange="loadFile(this)" required>
                        <input type="button" value="Submit" id='ajax-submit'>
                    </form>

 

이렇게 웹에서 input 데이터들을 api 를 통해서 람다에서 받아보면 아래처럼 data가 들어온다.

 

body = "------WebKitFormBoundaryWvqm9JrHYYK3TJSv\r\nContent-Disposition: form-data; name=\"upload-file\"; filename=\"sample.json\"\r\nContent-Type: application/json\r\n\r\n[{\"A\":1278.751,\"B\":7.168,\"C\":4025.032,\"D\":9.056,\"E\":56.962,\"F\":4646.806}]\r\n------WebKitFormBoundaryWvqm9JrHYYK3TJSv\r\nContent-Disposition: form-data; name=\"inputdata_one\"\r\n\r\nGGGGGGGG\r\n------WebKitFormBoundaryWvqm9JrHYYK3TJSv\r\nContent-Disposition: form-data; name=\"inputdata_two\"\r\n\r\n3333333\r\n------WebKitFormBoundaryWvqm9JrHYYK3TJSv--"

 

위는 data['body'] 부분이다.

인풋파일3개 (json 파일1개, 입력값2개) 가 잘 들어있는지 확인해보자면,

 

[{\"A\":1278.751,\"B\":7.168,\"C\":4025.032,\"D\":9.056,\"E\":56.962,\"F\":4646.806}] 이부분은 input 파일인 sample.json 안의 내용이다.

 

그외에 두가지 인풋이 더 있었는데 잘 살펴보면

inputdata_one : GGGGGGGG

inputdata_two : 3333333

로 들어가있음을 확인할수 있다.

 

해당 인풋파일 3개를 추출해내기 위해서 사용한 파싱방법

    json_feature = json.loads(body[body.find('['): body.rfind(']')+1]) 
    // json 파일안의 내용 뽑아내기
    
    body = body.replace('\n',"")
    body = body.replace('\r',"")
    body = body.replace('-',"")
	
    INPUTTWO = (body[body.find('inputdata_one')+14: body.rfind('WebKitFormBoundary')])
    body = (body[: body.rfind('WebKitFormBoundary')])
    INPUTONE = int(body[body.find('inputdata_one')+14: body.rfind('WebKitFormBoundary')])

 


1. EFS 사용

- 람다 저장소안에 패키지며 필요한 파일들 전부넣기보다 EFS를 활용하는 방법

- EFS안에 필요한 패키지들(파이썬,텐서플로우,넘피 등등) 세팅 + 필요한 파일들(트레이닝된 DL 모델) 등등 세팅해놓는다

- EFS 세팅은 EC2 인스턴스에서 EFS 마운트한다음에 해주면 된다 ( EC2 인스턴스 종료하고 다시켜면 또 마운트해서 연결해줘야한다. 인스턴스 종료안하고 계속 켜두면 계속 연결된 상태로 있다)

- 람다에서 프로비저닝해준다음 api 배포 해주면 끝

2.  ECR (Container) 사용

- 도커로 이미지를 만들어서 사용하는 방법이다.

- 필요한 패키지들은 requirements.txt에 지정,  필요한 파일들은 깃클론해서 복사(COPY로 옮겨준다) , app.py (람다에서 실행될 코드) 등등 세팅해준다음 이미지로 만들어준다

- ECR 에서 이미지로 만들고 배포

- 람다에서 새로 하나 만드는데 이미지로 만들기 선택하고, ECR 에서 배포한 이미지를 선택해주면 된다.

- EFS 에 비해 프로비저닝 비용이 들지 않는다

# python3.8 lambda base image
FROM public.ecr.aws/lambda/python:3.8

# copy requirements.txt to container
# 설치할 패키지들을 requirements.txt 에 기재
COPY requirements.txt ./   

# installing dependencies
RUN pip3 install --upgrade --ignore-installed pip setuptools
RUN pip3 install -r requirements.txt
RUN yum install git -y

# Copy function code to container
COPY feature_info.py ./   # host 에서 Container 로 file copy
COPY app.py ./            # host 에서 Container 로 file copy
RUN git clone https://github.com/ ~~~  # 사용할 파일들 불러오기

# setting the CMD to your handler file_name.function_name
CMD [ "app.lambda_handler" ]  # app.py 에서 handler 함수를 시작하도록 세팅

 

 

https://gallery.ecr.aws/

 

ECR Public Gallery

Amazon ECR Public Gallery is a website that allows anyone to browse and search for public container images, view developer-provided details, and see pull commands

gallery.ecr.aws

ㄴ람다 베이스 이미지는 여기서 불러와 서 사용할수 있다.

 

 

'<Cloud> > AWS' 카테고리의 다른 글

Lambda, API Gateway, AJAX 주거니 받거니  (0) 2021.08.31
서버리스 활용 1)EFS , 2)ECR  (0) 2021.08.31
Lambda Container 파일 접근 위치 + 파일 형식  (0) 2021.08.25
Lambda Container 연습  (0) 2021.08.25
EC2 user data 에 start.sh  (0) 2021.05.09

- 람다에서 기본적인 파일위치는 /tmp

- 작업 디렉토리 접근 경로 /var/task (Lambda Container 사용시)

작업 디렉터리(Working directory)에 함수에 대한 작업 디렉터리의 전체 경로를 입력합니다. 다음 예제에서는 Lambda의 AWS 기본 이미지에 대한 작업 디렉터리를 보여줍니다 (참조 https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/lambda-dg.pdf )

COPY app.js package.json /var/task/

ㄴ DOCKERFILE 에서 다음과 같이 파일들을 /var/task 로 옮겨야한다.

model_dnn = tf.keras.models.load_model(f"/var/task/model_dnn")
# 람다에서 모델을 불러올땐 이런식으로 모델을 불러와야한다

추가 참조 : https://alestic.com/2014/11/aws-lambda-environment/

- trained 모델은 pb 형태로 저장하고 불러와야 에러가 안남 

'<Cloud> > AWS' 카테고리의 다른 글

서버리스 활용 1)EFS , 2)ECR  (0) 2021.08.31
Lambda Container Dockerfile 작성예시  (0) 2021.08.25
Lambda Container 연습  (0) 2021.08.25
EC2 user data 에 start.sh  (0) 2021.05.09
Flask + EC2 튜토리얼  (0) 2021.05.09
  • 참조한 영상 (쉽고 괜찮다)

https://www.youtube.com/watch?v=23fE57EFRK4

https://github.com/srcecde/aws-tutorial-code/blob/master/lambda/container-image/app.py

 

: EC2(우분투) 세팅
sudo apt-get update    # sudo yum update 
sudo apt-get install docker-compose  #sudo yum install docker-compose
sudo apt install awscli -y

mkdir lambda-docker  //파일생성
// 그리고 여기에 깃허브에 올라와있는 파일 3개(app.py, requirements.txt, Dockerfile 업로드)
vim app.py
vim Dockerfile
vim requirements.txt
: EC2(centos version) 세팅
# centos버전

sudo yum update
# docker-compose 설치
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# docker-compose 실행 권한 부여
sudo chmod +x /usr/local/bin/docker-compose

# 설치된 docker-compose 실행 확인
docker-compose --version

sudo yum install docker
aws configure

# https://league-cat.tistory.com/347 도커 에러 참조

sudo yum install git -y
# git clone ~~~~~ 
sudo service docker start
sudo usermod -a -G docker ec2-user

 

: ECR 접속해서 리파지토리만들기

: 만든 리파지토리 눌러서 '푸시명령보기' 누르고 나오는 명령어 차례차례 터미널에 입력

** 추가적으로 맨앞에 sudo 꼭 붙여야 한다

** 중간에 에러두번나는데

  1. aws configure 로 해결

https://stackoverflow.com/questions/60583847/aws-ecr-saying-cannot-perform-an-interactive-login-from-a-non-tty-device-after

  1. sudo apt-get install gnupg2 pass로 해결 (우분투일떄만 해주면 됨

: 다 만들면 람다에서 컨테이너 이미지로 새로생성 가능

 

S3 버킷안에 있는거 복사해오기(EC2로)
aws s3 cp s3://ys-profet-package-model/profet_trained_model/ ./s3_file/  (에러)

https://stackoverflow.com/questions/45109533/aws-cli-s3-copying-file-locally-using-the-terminal-fatal-error-an-error-occu 참조

aws s3 cp s3://ys-profet/package_model_for_lambda_container/ ./s3_file --recursive

 

 

< 도커 용어정리 >

CMD ? ENTRYPOINT? → 컨테이너 실행시 동작 명령어 (전자) , 컨테이너 구동시 실행할 명령어 (후자)

ARG?

ARG 명령어 는 빌드 시 전달할 수 있는 변수를 정의합니다 . Dockerfile에 정의되면 이미지를 빌드하는 동안 --build-arg 플래그로 전달할 수 있습니다. Dockerfile에 여러 ARG 명령어가 있을 수 있습니다. ARG는 Dockerfile에서 FROM 명령어 앞에 올 수 있는 유일한 명령어입니다.2019. 9. 16.

https://github.com/heowc/programming-study/issues/90

alpine?

http://labs.brandi.co.kr/2021/01/20/hwangsg.html

초반에는 직접 빌드하여 올려두고 사용하였으나 현재는 각종 공식 업체에서 기본 이미지를 생성하여 제공하고 있고, Dockerfile에 alpine버전으로 가져와서 필요한 것만 빌드하여 저용량으로 이미지를 수월하게 만들 수 있게 되었습니다. 이렇게 생성된 이미지를 가지고 실행하면 컨테이너가 생성되고 해당 공간은 내부에 전혀 영향 없는 독립적인 별개의 공간으로 활용 할 수 있습니다. docker-compose를 이용하면 더 쉽게 여러 개의 컨테이너를 실행 할 수 있습니다.

https://jonnung.dev/docker/2020/04/08/optimizing-docker-images/ (좋음!)

  • RUN, ADD, COPY 이 3가지 단계만이 레이어로 저장되고, CMD, LABEL, ENV, EXPOSE 등과 같이 메타 정보를 다루는 부분은 임시 레이어로 생성되지만 저장되지 않아 도커 이미지 사이즈에 영향을 주지 않는다.
  • ..
  • 그래서 Alpine 리눅스 이미지를 사용한다면 모든 Python 패키지에서 C 코드를 컴파일 해야 하므로 도커 이미지를 빌드하는 시간이 상당히 많이 소모된다. → GCC 나온이유!!!!!!
  • 추가로 덧붙이자면 Alpine 리눅스 이미지를 베이스 이미지로 사용한 Python 이미지는 용량도 크고, 몇 가지 버그들에 대한 취약점도 갖고 있다고 한다.
도커관련해서 최적화하는 방법 !!!!!!
  • 이미지 레이어 개수를 줄이는 것이 좋다.(성능영향엔 별상관없긴한데 최적화 측면에서 도움됨+ 가독성,유지보수에좋음)
RUN apt-get update && apt-get install -y \
    gcc \
    git \
    locales
  • 애플리케이션 코드 복사 명령(COPY) 은 자주 변경되지 않는 명령문 다음에 오는 것이 이미지 빌드 시간을 단축하는 데 유리하다.
  • 이전 단락에서 의존성 패키지를 명시한 파일로 requirements.txt를 사용했다. 이 파일은 Python의 공식 패키지 관리자인 PIP에서 사용하는 관행적으로 지칭하는 파일이다.Python 개발 환경을 기준으로 봤을 때 PIP는 패키지별 상호 의존성에 관계를 관리할 때 부족한 면이 있다. 그래서 요즘은 좀 더 발전된 Locking 시스템을 갖춘 Pipenv나 Poetry를 사용하는 것을 추천한다.
  • 이 도구들을 이용해 생성된 Lock 파일 (예: Pipfile)을 기반으로 패키지가 설치될 수 있도록 한다면 위 (3) 단락에서 설명한 캐시 레이어의 장점을 얻을 수 있고, 예상치 못한 패키지 버전 업데이트도 방지할 수 있다.
  • 멀티-스테이지 빌드
     는 위 (2), (3), (4) 단락에서 했던 노력보다 훨씬 더 효과적으로 도커 이미지 사이즈를 줄이는 방법이다.
  • 멀티-스테이지 빌드는 Dockerfile 1개에 FROM 구문을 여러 개 두는 방식이다.각 FROM 명령문을 기준으로 스테이지를 구분한다고 했을 때 특정 스테이지 빌드 과정에서 생성된 것 중 사용되지 않거나 불필요한 모든 것들을 무시하고, 필요한 부분만 가져와서 새로운 베이스 이미지에서 다시 새 이미지를 생성할 수 있다.

https://dodonam.tistory.com/126 참조

 

https://stackoverflow.com/questions/59747986/how-to-use-tensorflow-2-0-with-aws-lambda →  (EFS,Container)

 

Uploaded by Notion2Tistory v1.1.0

 

  • adcanced details - user data 부분에 sh파일 넣어주면된다
  • sh 파일안에 pip3 install -r requirements.txt 이걸 넣어주면 올인원에 끝내줄수있음
  • 그러면 터미널에서 일일이 Pip3 ~~ 안깔아줘도 됨

https://arifulislam-ron.medium.com/flask-web-application-to-classify-image-using-vgg16-d9c46f29c4cd

ERROR : 크롬, 사파리에서 안열림, 네이버 웨일에서는 열림

# 시작코드

export FLASK_APP=main.py

flask run --host=0.0.0.0 --port=5000

'<Cloud> > AWS' 카테고리의 다른 글

Lambda Container 연습  (0) 2021.08.25
EC2 user data 에 start.sh  (0) 2021.05.09
Flask + EC2 튜토리얼  (0) 2021.05.09
Aws acedemy Module1  (0) 2021.03.09
AWS S3,Lamda,CLI 활용한 파일 upload/download  (0) 2021.01.13

+ Recent posts