이제 docker/mysql 내부의 코드들은 발생x, docker/api만 발생
RDS -> IAM -> S3
- RDS는 db에 들어가는 애
- s3는 화면을 보여주는 애
생성하면서 확인
주의사항
잘못하면 DB 해킹의 위험이 있는 부분이므로 주의
- SecurityGroup 설정에서 보안 그룹을 생성하고 인바운드 규칙을 추가
- 외부 접속 방지를 위해 로컬에서 개발하는 동안은 개인 IP 주소를 설정하지만 EC2로 접속하는 과정이 있으면 추가
- 위치 무관을 체크해야 ubuntu에서 apt-get-update가 적용된다
- 우측 상단 수정 → 생성한 식별자 선택
- 퍼블릭 액세스: 예(마이너 버전으로 변경시 요금 발생)
- 포트폴리오 사용할 일 없으면 : 아니오
- 백업 보존기간 : 0일
- 스냅샷 : 해제
이거 보고도 모르겠으면 여기 참고
좌측사이드바에서 파라미터 그룹(이하 Parameters)에서 파라미터 편집으로 넘어간다. 검색창에 char, coll 을 각각 입력 후 셀렉트박스에서 utf-8과 utf-8_general_ci 를 선택
- DB 수정 → DB옵션에서 파라미터 그룹을 방금 설정한 그룹으로 변경
S3 만들기 전에 반드시 iam 을 생성해야 한다. 이 파트를 생략해도 S3 가 만들어지지만, CORS 에서 많은 오류를 경험하기 싫으면 일단 생성하자
, s3
USERNAME = "AWS 유저명"
PASSWORD = ""
HOSTNAME = "aws 사용시의 엔드포인트"
DATABASE = "AWS의 DB명"
PORT = 3306
CHARSET = "utf8"
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) 사용자 그룹 생성- 권한 정책 연결 : AmazonS3FullAccess 선택
2) MFA 설정
IAM -> 사용자 -> 사용자명 클릭
보안 자격 증명 -> 콘솔 액세스 관리 -> 활성화 후 비밀번호 지정
권한을 받은 IAM사용자명, 방금 지정한 비밀번호로 로그인 가능
builling은 AdministratorAccess에 포함되어 있다
기본적으로 결제 정보 메뉴에 대한 권한이 없는 IAM 사용자가 해당 권한을 얻기 위한 조건은
- (1) 이 계정이 IAM 및 페더레이션 사용자가 결제 정보에 액세스하도록 허용
- (2) 필요한 IAM 권한을 보유하도록 함으로써 사용자 또는 그룹에 대해 권한
(1)은 Root 계정으로만 설정 가능
file → New project → AWS Serverless Application
- 생성된 yml파일에서 run을 클릭해서 실행한 후
- app.py 실행
AWS Toolkit을 이용한 AWS Lambda 함수 로컬 실행
1) Python용 함수 핸들러가 포함된 코드 파일(app.py)에서 함수 핸들러 옆에 있는 ‘Lambda 아이콘’을 이용하여 실행
2) template.yaml 파일에서 실행
- 프로젝트 폴더 내의 template.yaml 파일을 연다
- 함수의 리소스를 정의한 부분 옆에 있는 실행 아이콘 클릭
- 실행 또는 디버그를 선택합니다.
- 실행 환경을 구성할 때 input 부분은 ‘File’을 선택한 후 [events] 폴더 안의 event.json 파일로 지정
- 도커 빌드가 완료됐는지 확인
참고(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를 생성할 수 없다
액세스키 생성시 반드시 .csv파일 저장해서 보관
- 유저 생성 이후에 개별적으로 액세스 키를 만들 때 pulumi를 쓰면 CLI방식을 체크
$Env:ACCESS_KEY_ID = ""
$Env:AWS_SECRET_KEY_ID= ""
$Env:AWS_DEFAULT_REGION = "ap-northeast-2 "
Project
| api
|
| infara
|aws
|
main
import json
import pulumi
import pulumi_aws as awsimport 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
yaml(context file)을 사용하는 Serverless Framework보다 IaC방식(TypeScript 사용)인 Pulumi를 더 많이 사용
- serverless와 pulumi 방식중 선택해서 사용
원인
에러 내용대로 해당 내용을 지정해주지 않아서 발생
해결
에러차엥서 요구하는 내용을 추가해준다
- 예시 : - run: sam deploy --no-confirm-changeset --no-fail-on-empty-changeset --stack-name aws-sam-cli-managed-default --resolve-s3 --capabilities CAPABILITY_IAM
원인
codeUri 중복
해결
AWS에서 CloudFormation을 열고 aws-sam-cli-managed-default 스택을 삭제한 다음 재배포를 시도
- 다시 돌리고 싶은 경우 sam delete --stack-name aws-sam-cli-managed-default로 한번 지워주고 사용
원인
비밀번호 오류 혹은 비밀번호 미설정
해결
pulumi stack change-secrets-provider passphrase 입력 후 비밀번호 지정
ac256
Type Name Plan Info
- pulumi:pulumi:Stack PulumiProject-PulumiStack create
└─ aws:iam:Role lambdaRole 1 errorDiagnostics:
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 timeoutMake 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로 제대로 적용됐는지 확인
이제는 매번 도커에 설치할 필요 x
API Gateway를 처리하기 위해 AWS Lambda에서 ASGI 애플리케이션을 설정하기 위한 어댑터
- Mangum을 써야 fastapi를 lambda로 올릴 수 있다
https://bysssss.tistory.com/207