AWS) 기본 설정

나 안해·2023년 3월 2일
0

AWS

목록 보기
1/12
post-thumbnail

0. 설정

  • fastapi requirements.txt에 추가
  • main.py에 handler = Mangum(app) 추가

0.1 DB

  • 데이터 베이스 수정에서 db 파라미터를 사용중인 db로 변경
  • db가 제대로 들어갔는지는 하이디로 확인
  • 하이디의 ip는 db의 연결 보안에 있는 엔드포인트
  • fastapi의 db도 host는 AWS의 엔드포인트

    이제 docker/mysql 내부의 코드들은 발생x, docker/api만 발생


1. 진행 순서

RDS -> IAM -> S3

  • RDS는 db에 들어가는 애
  • s3는 화면을 보여주는 애

1.1 RDS

1.1.1 RDS 작성

  • 도커파일 및 yml파일 변경 후 dockerfile의 경로인 docker/api로 들어가서 'docker build -t 이미지명 .' 입력
  • 원래 경로로 돌아가서 docker compose up
  • 자동으로 테이블이 들어와야 성공
    🐋 docker compose up 방법이 기억안나면

1.1.2 RDS 인스턴스 생성

생성하면서 확인

  • 표준 생성
  • 사용 엔진(이번에는 MySQL)
  • 템플릿 : 프리티어
  • 인스턴스 크기 : t3(t2도 상관없으나 t3도 프리데이터)
  • 스토리지 : 범용, 20, 자동 조정 비활성화
    ※ 스냅샷 체크를 해제해도 사용으로 된 경우도 있으므로 확인 필요

1.1.3 보안그룹 생성

주의사항

잘못하면 DB 해킹의 위험이 있는 부분이므로 주의

  • SecurityGroup 설정에서 보안 그룹을 생성하고 인바운드 규칙을 추가
  • 외부 접속 방지를 위해 로컬에서 개발하는 동안은 개인 IP 주소를 설정하지만 EC2로 접속하는 과정이 있으면 추가
    • 위치 무관을 체크해야 ubuntu에서 apt-get-update가 적용된다
  • 우측 상단 수정 → 생성한 식별자 선택
    • 퍼블릭 액세스: 예(마이너 버전으로 변경시 요금 발생)
    • 포트폴리오 사용할 일 없으면 : 아니오
    • 백업 보존기간 : 0일
    • 스냅샷 : 해제

이거 보고도 모르겠으면 여기 참고

1.1.4 파라미터 그룹 생성

좌측사이드바에서 파라미터 그룹(이하 Parameters)에서 파라미터 편집으로 넘어간다. 검색창에 char, coll 을 각각 입력 후 셀렉트박스에서 utf-8과 utf-8_general_ci 를 선택

  • DB 수정 → DB옵션에서 파라미터 그룹을 방금 설정한 그룹으로 변경

2. IAM

2.1 IAM 생성하기

S3 만들기 전에 반드시 iam 을 생성해야 한다. 이 파트를 생략해도 S3 가 만들어지지만, CORS 에서 많은 오류를 경험하기 싫으면 일단 생성하자

, s3


1.3 env.py 양식

USERNAME = "AWS 유저명"
PASSWORD = ""
HOSTNAME = "aws 사용시의 엔드포인트"
DATABASE = "AWS의 DB명"
PORT = 3306
CHARSET = "utf8"

DB_URL = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}"

1.3.2 dockerfile 양식

FROM python:3.9

WORKDIR /app
ADD requirements.txt .
RUN pip install --trusted-host pypi.python.org -r requirements.txt
EXPOSE 8000
CMD ["uvicorn", "app.main:app", "--reload", "--host", "AWS엔드포인트", "--port", "8000"]


1.4 한글 깨짐

  • 파라미터 그룹 -> 파라미터 편집에서
  • char : 전부 utf8mb4로 변경(0,1로 나오는 항목은 제외)
  • coll : collation_connection, collation_server의 값을 utf8mb4_general_ci로 변경

애자일 데브옵스


1.5 보안

개인적인 피해를 막기 위한 최소한의 보안

  • 인바운드는 어렵게 아웃바운드는 쉽게
    1) 사용자 그룹 생성
  • 권한 정책 연결 : AmazonS3FullAccess 선택
    2) MFA 설정
  • 준비 : Google OTP 어플리케이션
  • root 계정에서 보안자격 증명 → MFA 활성화 → 가상 MFA 디바이스 체크 후 계속
  • 먼저 본인 핸드폰에 설치한 Google OTP로 해당 QR코드 인식 후 MFA 코드 1 입력
    • MFA 코드 2는 MFA 코드 1 시간 경과 후 나오는 다음 코드

1.5.1Root가 IAM에게 비밀번호 변경 권한 주기

  • IAM에서 '계정 설정' 클릭
  • '암호 정책-> 편집'에서 체크
    • 사용자 지정 : 암호감독 체크박스 전체,
    • 기타 요구사항 :사용자 자신의 암호 변경 허용

1.5.2 IAM 로그인시 비밀번호 지정

IAM -> 사용자 -> 사용자명 클릭

  • 보안 자격 증명 -> 콘솔 액세스 관리 -> 활성화 후 비밀번호 지정

  • 권한을 받은 IAM사용자명, 방금 지정한 비밀번호로 로그인 가능

참고 : https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/id_credentials_passwords_enable-user-change.html

1.5.3 권한 부여

  • Root 사용자의 IAM으로 들어가서 권한을 준다

1.5.4 IAM 사용자 결제 대시보드 접근 권한 설정

  • builling은 AdministratorAccess에 포함되어 있다

    기본적으로 결제 정보 메뉴에 대한 권한이 없는 IAM 사용자가 해당 권한을 얻기 위한 조건은

    • (1) 이 계정이 IAM 및 페더레이션 사용자가 결제 정보에 액세스하도록 허용
    • (2) 필요한 IAM 권한을 보유하도록 함으로써 사용자 또는 그룹에 대해 권한
  • (1)은 Root 계정으로만 설정 가능

    • 계정 → 결제 정보에 대한 IAM 사용자 및 역할 액세스 :편집
    • IMA 액세스 활성화 체크 → 업데이트

2. Sam으로 Serverless 설정

참고

2.1 설치

  • AWS CLI버전 2를 위한 사전 조건에서 AWS CLI 설치 : 버전 2.
  • sam 설치 : 버전 1.사용
  • 파이참 플러그인(settings → Plugin)에서 AWS Toolkit 설치
  • aws configure 입력 후 상세 내용 넣기
    • 리전 : ap-northeast-2
    • Default output format : json

2.2 프로젝트 생성

file → New project → AWS Serverless Application

  • 생성된 yml파일에서 run을 클릭해서 실행한 후
  • app.py 실행

2.3 Lambda 함수 실행

AWS Toolkit을 이용한 AWS Lambda 함수 로컬 실행
1) Python용 함수 핸들러가 포함된 코드 파일(app.py)에서 함수 핸들러 옆에 있는 ‘Lambda 아이콘’을 이용하여 실행
2) template.yaml 파일에서 실행
- 프로젝트 폴더 내의 template.yaml 파일을 연다
- 함수의 리소스를 정의한 부분 옆에 있는 실행 아이콘 클릭
- 실행 또는 디버그를 선택합니다.
- 실행 환경을 구성할 때 input 부분은 ‘File’을 선택한 후 [events] 폴더 안의 event.json 파일로 지정
- 도커 빌드가 완료됐는지 확인

2.4 GitHub Action으로 배포

참고(fastapi 아님)

  • Access key ID,Secret access key는 Settings → secrets and variables → Actions → New repository secret에서 설정
    • AWS_ACCESS_KEY_ID : ~
    • AWS_SECRET_ACCESS_KEY : ~
  • 성공하면 AWS에 람다 함수가 생성된 것을 확인할 수 있다.

    ※ 생성한 이후에는 같은 codeUri로 Lambda를 생성할 수 없다

2.5 Gateway가 Lambda 함수를 호출할 수 있게 설정

  • AWS Lambda에서 해당 함수를 클릭하고 테스트에서 실핼

Pulumi로 Serverless 설정

pulumi참고

액세스키 생성시 반드시 .csv파일 저장해서 보관

  • 유저 생성 이후에 개별적으로 액세스 키를 만들 때 pulumi를 쓰면 CLI방식을 체크
  • 터미널에 입력해서 환경변수 설정
$Env:ACCESS_KEY_ID = ""
$Env:AWS_SECRET_KEY_ID= ""
$Env:AWS_DEFAULT_REGION = "ap-northeast-2 "
  • pulumi 설치
  • 터미널 종료 후 재실행해서 choco install pulumi 입력
  • 경로

    Project
    | api
    |
    |
    infara
    |aws
    |

pulumi new aws-python 실행

- aws 폴더 내부에 아래 파일 세 개가 생겼으면 OK - __main__.py - Pulumi.지정한 이름.yaml - Pulumi.yaml
  • 각 파일에 아래 코드 작성

main

import json
import pulumi
import pulumi_aws as aws

import iam

region = aws.config.region
custom_stage_name = "v1"

Lambda Layer

lambdalayer = aws.lambda.LayerVersion(
"fastapiLayer", compatible_runtimes=["python3.9"],
code=pulumi.FileArchive("../../fastapi-serverless-layer.zip"), layer_name="fastapi-serverless-layer"
)

Lambda function

lambdafunc = aws.lambda.Function(
"fastapi-serverless-example", role=iam.lambda_role.arn, runtime="python3.9", handler="main.handler",
layers=[lambda_layer.arn], code=pulumi.AssetArchive({
'.': pulumi.FileArchive('../../')
})
)

def swagger_route_handler(arn):
return ({
"x-amazon-apigateway-any-method": {
"x-amazon-apigateway-integration": {
"uri": f'arn:aws:apigateway:{region}:lambda:path/2015-03-31/functions/{arn}/invocations',
"passthroughBehavior": "when_no_match",
"httpMethod": "POST",
"type": "aws_proxy",
},
},
})

API Gateway

rest_api = aws.apigateway.RestApi("fastapi-serverless", body=lambda_func.arn.apply(
lambda arn: json.dumps({
"swagger": "2.0",
"info": {"title": "api", "version": "1.0"},
"paths": {
"/{proxy+}": swagger_route_handler(arn),
},
})
))
deployment = aws.apigateway.Deployment("api-deployment", rest_api=rest_api.id, stage_name="")
stage = aws.apigateway.Stage("api-stage", rest_api=rest_api.id, deployment=deployment.id, stage_name=custom_stage_name)

Permission

invokepermission = aws.lambda.Permission(
"api-lambda-permission", action="lambda:invokeFunction", function=lambda_func.name,
principal="apigateway.amazonaws.com", source_arn=deployment.execution_arn.apply(lambda arn: arn + "/")
)

pulumi.export("apigateway-rest-endpoint", deployment.invoke_url.apply(lambda url: url + custom_stage_name))


###Pulumi.지정한 이름.yaml###

encryptionsalt: ${salt}
config:
aws:region: ap-northeast-2

pulumi preview 실행

  • 비밀번호 지정 : pulumi stack change-secrets-provider passphrase
  • 터미널 다시 시작해서 $Env 입력
  • pulumi preview 실행

AWS에서 lambda 사용

yaml(context file)을 사용하는 Serverless Framework보다 IaC방식(TypeScript 사용)인 Pulumi를 더 많이 사용

  • serverless와 pulumi 방식중 선택해서 사용

? error

?.1 Sam

?.1.1 Error: Select AWS credentials in 'AWS Connection'

?.1.2 Error: Missing option '--stack-name', 'sam deploy --guided' can be used to provide and save needed parameters for future deploys.

원인

에러 내용대로 해당 내용을 지정해주지 않아서 발생

해결

에러차엥서 요구하는 내용을 추가해준다

  • 예시 : - run: sam deploy --no-confirm-changeset --no-fail-on-empty-changeset --stack-name aws-sam-cli-managed-default --resolve-s3 --capabilities CAPABILITY_IAM

?.1.3 Error: Stack aws-sam-cli-managed-default exists, but the ManagedStackSource tag is missing. Failing as the stack was likely not created by the AWS SAM CLI.

원인

codeUri 중복

해결

AWS에서 CloudFormation을 열고 aws-sam-cli-managed-default 스택을 삭제한 다음 재배포를 시도

  • 다시 돌리고 싶은 경우 sam delete --stack-name aws-sam-cli-managed-default로 한번 지워주고 사용

?.2 Pulumi

?.2.1 pulumi enter your passphrase to unlock config/secrets

원인

비밀번호 오류 혹은 비밀번호 미설정

해결

pulumi stack change-secrets-provider passphrase 입력 후 비밀번호 지정

?.2.2 View Live: https://app.pulumi.com/Seongbae103/PulumiProject/PulumiStack/previews/ff48aaf3-a528-4bd2-a5f0-cdd2d8a

ac256

Type                 Name                       Plan       Info
  • pulumi:pulumi:Stack PulumiProject-PulumiStack create
    └─ aws:iam:Role lambdaRole 1 error

Diagnostics:
aws:iam:Role (lambdaRole):
error: unable to validate AWS credentials.
Details: no valid credential sources for found.

Please see
for more information about providing credentials.

Error: failed to refresh cached credentials, no EC2 IMDS role found, operation error ec2imds: GetMetadata, request send failed, Get "http://169.254.169.254/latest/meta-data/iam/security-credentials/": dial tcp 169.254.169.254:80
: i/o timeout

Make sure you have:

    • Set your AWS region, e.g. `pulumi config set aws:region us-west-2`
    • Configured your AWS credentials as per https://pulumi.io/install/aws.html
    You can also set these via cli using `aws configure`.

※ 커밋시 env에 있는 엔드포인트는 반드시 지우거나 gitignore로 제대로 적용됐는지 확인

주의

  • 인공지능 모델은 lambda
  • 상시로 열려있는 페이지는 EC2가 더 유리하다

    이제는 매번 도커에 설치할 필요 x

Mangum + Lambda + SAM

Mangum

API Gateway를 처리하기 위해 AWS Lambda에서 ASGI 애플리케이션을 설정하기 위한 어댑터

프리티어 사용시 주의

  • 인스턴스 구성시 t2로 설정
  • RDS에서 스토리지의 할당된 스토리지는 20으로(스토리지 자동 조정 활성화는 체크를 해제)

참고

0개의 댓글