• 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

클라우드 컴퓨팅 : 컴퓨팅 파워, 데이터베이스 , 스토리지, 어플리케이션 및 기타 it리소스들을 온디맨드로 인터넷을 통해 제공하고, 사용한 만큼만 비용을 지불하는것.

이런 리소스들은 세계 여러위치에 존재하는 대규모 데이터센터에 구축된 서버 컴퓨터에서 실행된다. 사용자는 이곳에서 공급되는 컴퓨터를 사용가능하다.

*온디맨드: 주문형 서비스를 의미함

<소프트웨어로서의 인프라>

클라우드 컴퓨팅을 사용하면, 인프라를 더 이상 하드웨어로 생각하지않고, 대신 소프트웨어로 생각하고 사용가능해짐

기존컴퓨팅모델 vs 클라우드컴퓨팅 모델

기존 컴퓨팅 모델클라우드 컴퓨팅 모델
하드웨어형 인프라소프트웨어로서의 인프라
@하드웨어 솔루션@ : 공간, 직원, 물리적보안, 계획, 지본, 지출 필요@소프트웨어 솔루션@ 유연함
긴 하드웨어 구매주기하드웨어 솔루션보다 간편하고 빠르게 경제적으로 변경이 가능
이론적으로 최대 피크를 추정해서 용량을 프로비저닝해야함 ⇒ 실제 사용량이 예상최대피크를 초과하면 용량이 부족해짐. 요구사항을 충족시키지 못함. 이에 새로운 솔루션을 구현해야하는데, 시간과 인력 비용이 더 투자된다. 획일적인 과중한 작업 해소 ⇒ 왼쪽 기존 컴퓨팅모델에서 새로운 솔루션을 만들어내는게 아니라 손쉽게 바꾸어줄수있으므로 유지관리,용량계획같은 획일적인 작업들보다 더 중요한 문제에 집중할수있게 해줌

<클라우드 서비스 모델>

  • IaaS(서비스형인프라): 이 범주의 서비스는 클라우드IT의 기본 빌딩블록을 포함하고 일반적으로네트워킹기능, 컴퓨터(가상또는전용하드웨어) 및데이터스 토리지 공간을제 공합니다. IaaS는IT 리소스에 대한 최고수준의 유연성과 관리제어 기능을 제공합니다. 이는 현재 많은 IT 부서 및 개발자에게 익숙한 기존IT 리소스와 가장 유사합니다.
  • PaaS(서비스형플랫폼): 이 범주의 서비스를 이용하면 기본인프라(일반적으로하드웨어와운영체제)를 관리할 필요가 없어 애플리케이션 개발과 관리에 집중할 수 있습니다.
  • SaaS(서비스형소프트웨어): 이범주의 서비스는 서비스 공급자가 운영하고 관리하는 완제품을제공합니다.대 부분의 경우 서비스형 소프트웨어는 최종사용자 애플리케이션을 지칭합니다.

(아래로 갈수록 it리소스에 대한 제어능력이 감소함)

<클라우드 컴퓨팅 배포 모델>

  • 클라우드: 애플리케이션의 모든 부분이 클라우드에서 실행됨
  • 하이브리드: 클라우드 기반 리소스랑 클라우드에 위치하지 않는 기존 리소스간에 인프라와 어플리케이션을 연결하는 방법 (= 클라우드랑 온프레미스의 중간)
  • 온프레미스: =프라이빗 클라우드 / 리소스 활용도를 높이기 위해 애플리케이션 관리및 가상화기술을 사용한다는 점에서 레거시 it 인프라와 같다

<기존 온프레미스 공간과 AWS간의 유사점>

<클라우드 컴퓨팅의 이점>

  1. 자본 지출을 가변 비용으로 대체

    자본비용(CapEx) = 물리적 자산을 유지관리하는 자금

    가변비용 = 비용을 부담하는 사람이 쉽게 변경하거나 피할수 있는 비용

    (= 리소스를 사용할떄만, 사용한 리소스에 대해서만 비용지불) ⇒ 몇주, 며칠이 아니라 몇분만에 새로운 어플리케이션에 맞춰서 필요한 만큼의 공간을 구축가능

  1. 규모의 경제로 얻게되는 이점

    *규모의 경제 = 산출량이 증가함에 따라 장기 평균 총비용이 하락하는 현상 (노동의전문화) ⇒ 공장에 근로자가 많을수록 분산해서 일을 하기 떄문에 더 효율적이어지는거

    ⇒ 수많은 고객의 사용량이 클라우드에 집계되어 aws와 같은 공급자는 더 높은 규모의 경제를 달성할수있다. 따라서 지불하는 종량제 요금이 더 낮아짐

  1. 용량 추정 불필요

    최대 얼마나 사용할수있을지, 필요한 인프라 용량을 추정할 필요가 없음. 필요한만큼의 리소스에 액세스하고 몇분만에 확장/축소가 가능하기 떄문

  1. 속도 및 민첩성 개선

    새 it리소스를 클릭 몇번으로 확보가능. 실험&개발에 드는 비용과 시간이 단축됨

  1. 데이터 센터 운영 밎 유지 관리에 비용 투자 불필요

    인프라가 아니라 비즈니스를 차별화하는 프로젝에 집중할수 있다/ 서버관리하느냐 시간 허비 안하고 그 남는 시간을 고객에게 더 집중할수있음

  1. 몇분 안에 전 세계에 배포가능

웹 서비스?

: 인터넷을 통해 이용할 수 있도록 제공되는 소프트웨어. API(어플리케이션 프로그래밍 인터페이스) 상호작용의 요청및 응답에 대해 xml또는 json과 같은 표준화된 형식을 사용한다.

웹서비스는 인터넷 or 프라이빗네트워크(인트라넷) 을 통해 사용할 수 있는 모든 소프트웨어

특정 운영체제 & 프로그래밍 언어에 종속되지 않음 / 인터페이스 정의파일을 통해 자체적으로 기술되며 검색가능함

AWS?

: 다양한 클로벌 클라우드 기반 제품을 제공하는 안전한 클라우드 플랫

-컴퓨팅,스토리지,네트워크.데베등 기타 it리소스와 관리도구에 대한 온디맨드 엑세스를 제공함

-유연성 제공 (환경은 필요에 따라 재구성&업데이트하거나 , 자동확장 또는 축소가능)

-필요한 개별 서비스에 대해 사용한 만큼만 비용을 지불하면됨

-aws서비스는 빌딩블록처름 서로 유기적으로 작동함

e.g. ec2 인스턴스로 데이터를 전공. / s3 스토리지를 사용 / 네트워크 서비스인 vpc 를 실행할수도 있음

사용 사례별로 다음과같이 여러가지 aws컴퓨팅 오퍼링을 사용가능

이름태그
Amazon EC2AWS 컴퓨팅리소스를완벽하게제어하려는경우
AWS Lambda코드를실행하면서서버를관리하거나프로비저닝하지않으려는경우
AWS Elastic Beanstalk웹애플리케이션을배포, 관리및확장하는서비스가필요한경우
AWS Batch수십만개의배치워크로드를실행해야하는경우
AWS Outpost온프레미스데이터센터에서AWS 인프라를실행하려는경우
Amazon Elastic Container Service(Amazon ECS), Amazon Elastic Kubernetes Service(Amazon EKS) 또는AWS Fargate컨테이너또는마이크로서비스아키텍처를구현하려는경우
VMware Cloud on AWS온프레미스서버가상화플랫폼을AWS로마이그레이션하려는경우마찬가지로, 다른범주에도선택할수있는다양한서비스가있으며, 서비스수는계속늘어나고있습니다

<AWS와 상호작용하는 3가지 방법>

  • AWS management console : 사용하기 쉬운 그래픽 인터페이스
  • AWS CLI (명령줄 인터페이스) : 개발 명령또는 스크립트를 사용해서 서비스에 액세스
  • SDK (소프트웨어 개발 키트) : 코드에서 직접 서비스에 엑세스

→ 3가지 모두 aws의 기초 역할을 하는 공통적인 rest유형의 api를 기반으로 함

<aws 클라우드로 전환> -클라우드 컴퓨팅은 기존 보델에 비해 많은 이점을 제공하지만, 대부분의 조직에서 클라우드 도입이 즉시 이루어지지는 않음.

-기술,인력,프로세스 3가지가 갖추어져야함.

<AWS CAF> - cloud adoption framework

-조직이 전사적으로, 또한 it수명 주기 전반에 걸쳐 클라우드 컴퓨팅에 대한 포괄적인 접근 방식을 구축하여 성공적인 클라우드 도입을 가속화하는데 도움이 되는 지침과 모범 사례를 제공함

6가지 관점으로 구성됨 (좌: 비즈니스 역량에 집중 / 기술 역량에 집중 )

  • 비즈니스 관점

aws CAF를 사용해서 설득력있는 클라우드 도입의 타당성을 확보하고 클라우드 도입 이니셔티브의 우선순위를 지정가능. 이해관계자는 조직의 비즈니스 전략 및 목표가 it전략 및 목표와 일치하는지 확인해야함

  • 인력관점

인력관점의 이해관계자들은 aws CAF를 사용해서 조직구조및 역할, 새로운 기술 및 프로세스 요구사항을 평가하고 격차를 파악할수 있다. 요구사항과 격차를 분석하면 민첩한 조직을 구축하기 위한 교육, 인력배치 및 조직 변경의 우선순위를 정하는데 도움이 된다.

  • 거버넌스 관점

거버넌스 관점의 이해 관계자는 AWS 를 사용해서 it전략및 목표를 비즈니스 전략및 목표에 맞추는데 필요한 기술과 프로세스에 집중할수있음. 이런 목표는 조직이 it투자의 비즈니스 가치를 극대화하고 비즈니스 위험을 최소화하는데 도움이됨

  • 플랫폼관점

대상 상태 환경의 아키텍쳐를 자세히 설명간으해야함.

  • 보안관점

조직이 가시성, 감사능려그 제어및 민첩성과 관련된 보안목표를 충족하도록 보장해야함

  • 운영관점

일일, 분기별, 연도별 비즈니스 수행방식을 정의,

?????

새로운 사용자에 AdministratorAccess 권한을 준다음, keypair 다운로드 받은다음 열어서 확인하고, cmd에

aws configure

쳐서 4개 나오는거 keypair 내용 복붙해서 차례차례 입력해준다.

 

 

1. upload

위에를 실행한 cmd창에서 py upload.py 로 실행하면 로컬에있던 y.png파일이 지정해준 버킷으로 올라감.

#cmd창에서 실행해봄. youa.png로 실행해봄. 버킷에 올라감.

import boto3  #aws sdk 이다
s3 = boto3.client('s3') # s3에 대한 권한및 상태를 s3(변수)에 저장
filename = 'y.png'
bucket_name = 'bucket1'

# filename : 로컬에서 올릴 파일이름 /bucketname : S3 버킷 이름 / filename : 버킷에 저장될 파일 이름.
s3.upload_file(filename, bucket_name, filename)

#버킷에 이름이 똑같은 파일 올리면 그냥 덮어쓴다 수정시간이 바뀔뿐

 

 

2. downlaod

이건 download.py (버킷에있던게 로컬로 다운로드)

import boto3
s3 = boto3.client('s3')
filename = 'y.png'
bucket_name = 'bucket1'
#다운로드할 버킷이름 / 다운로드할것 / 다운로드받을이름
s3.download_file(bucket_name,filename,filename)

 

 

3. uplaod & download lamda

로컬 cmd창 말고 람다에서 실행

(버킷1에 있던걸 다운로드받아서 버킷2에 올려줌)

import boto3
from time import time

s3_client = boto3.client('s3')

def lambda_handler(event, context):
    input_bucket = event['input_bucket']
    object_key = event['object_key']
    output_bucket = event['output_bucket']

    path ='/tmp/'+object_key  #이거 아래 설명!!!!!!!!!!!!!!!!!!!!!!!!

    s3_client.download_file(input_bucket, object_key, path)
    s3_client.upload_file(path, output_bucket, object_key)

**** /tmp/에 로컬 파일위치를 넣어주니까 에러가 떴다.  /tmp/로 하면 잘 실행된다. 그런데 tmp파일은 도대체 로컬에 있는 파일인지 람다에 있는 파일인지 헷갈리고 찾아도 보이지도않는다 https://aws.amazon.com/ko/lambda/faqs/ 이링크에서 찾아본결과 람다안에있는 비영구 디스크공간이라고한다.

 

Q: AWS Lambda 함수를 위해 디스크에 스크래치 공간이 필요하면 어떻게 합니까?

각 Lambda 함수에는 자체 /tmp 디렉터리에 500MB의 비영구 디스크 공간이 제공됩니다.

 

테스트이벤트 json파일

{
  "input_bucket": "bucket1",
  "object_key": "y.png",
  "output_bucket": "bucket2"
}

 

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

Lambda Container 연습  (0) 2021.08.25
EC2 user data 에 start.sh  (0) 2021.05.09
Flask + EC2 튜토리얼  (0) 2021.05.09
AWS launch templates, launch configuration, load balancing, autoscaling 초간단 개념  (0) 2021.05.09
Aws acedemy Module1  (0) 2021.03.09

+ Recent posts