- 발표자료 준비
- 팀명, 팀 발표 준비 열중
- 이미지분석 인프라 구축
- 데이터분석 아키텍처 구성
- 사용할 서비스 선정
- 데이터 구하기
- 사용할 서비스 사용해보기
Private Repository 생성
- Image, Text 두개의 Private repository를 사용한다.
(추가) Cloud9 생성
- Cloud9을 생성할 때 가장 중요한것은 RDS와 리전을 맞춰주는 것이다.
이미지 push
- 먼저 이미지를 생성할 코드를 가져온다.
- 코드는 미리 작성하여 github에 업로드 했다.
ImageProcess
- https://github.com/jo1132/ImageProcess_AWS_Lambda.git
cd ImageProcess_AWS_Lambda/
aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <account>.dkr.ecr.<region>.amazonaws.com
docker build -t ai_image_process .
docker tag <이미지이름:버전> <account>.dkr.ecr.<region>.amazonaws.com/<이미지이름:버전>
- 버전관리를 위한 버전있게 push
docker tag <이미지이름:버전> <account>.dkr.ecr.<region>.amazonaws.com/<이미지이름:latest>
- Lambda 이미지 배포를 위한 latest
docker push <account>.dkr.ecr.<region>.amazonaws.com/ai_image_process:v.01.22.09.05
- 버전관리 버전 push
docker push <account>.dkr.ecr.<region>.amazonaws.com/ai_image_process:latest
- 람다 이미지 배포용 버전 push
- 잘 업로드 되었다.
TextProcess
- https://github.com/jo1132/TextProcess_AWS_Lambda.git
cd ImageProcess_AWS_Lambda/
- 여기서 Dockerfile에
RDS_ENDPOINT
,USERNAME
,PASSWORD
,DB_NAME
,TABLE_NAME
을 수정해줘야 한다.
- 여기서 푸시 명령을 복사해서 편하게 업로드할 수 있다.
docker tag <이미지이름:버전> <account>.dkr.ecr.<region>.amazonaws.com/<이미지이름:버전>
docker push <account>.dkr.ecr.<region>.amazonaws.com/<이미지이름:버전>
- 다만 버전관리를 위한 push를 따로 해준다.
- 역시 잘 push되었다.
- 퍼블릭 액세스 비활성화
- 암호화 및 객체잠금 활성화
- 버킷에 Credential과 이미지를 업로드할 디렉토리를 생성해준다.
- GCP Vision API Credential을 객체 잠금하고 읽기 모드만 허용한다.
- 거버넌스 모드로 특정계정에게만 덮어쓰기 및 삭제를 허용한다.
- 보존 만료 날짜는 일단 1일만 보존한다.
- 프리티어 적용을 받는다.
Lambda IAM Role 생성
Ai-Image-Process-lambda-s3-policy
- lambda가 s3에서 이미지를 가져올 수 있도록 정책을 생성한다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "logs:CreateLogGroup", "Resource": "arn:aws:logs:ap-northeast-2:709861978753:*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:ap-northeast-2:709861978753:log-group:/aws/lambda/AI-Image-Process:*" ] }, { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": "arn:aws:s3:::ai-item-image/*" }, ] }
Ai-Text-Process-lambda-VPC-policy
- lambda가 s3에서 이미지를 가져올 수 있도록 정책을 생성한다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "logs:CreateLogGroup", "Resource": "arn:aws:logs:ap-northeast-2:709861978753:*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:ap-northeast-2:709861978753:log-group:/aws/lambda/AI-Image-Process:*" ] }, { "Effect": "Allow", "Action": [ "ec2:DescribeNetworkInterfaces", "ec2:CreateNetworkInterface", "ec2:DeleteNetworkInterface", "ec2:DescribeInstances", "ec2:AttachNetworkInterface" ], "Resource": "*" } ] }
역할 만들기
- 신뢰할 수 있는 엔터티로 Lambda를 클릭한다.
- 이와같이 각각의 정책을 연결해서 역할을 생성해준다.
TextProcess function 생성
- TextProcess 이미지를 잘 연결해주고, 역할을 맞춰 연결해준다.
- 기본 설정 편집에서 제한시간을 1분으로 늘려준다.
- VPC에 연결해준다. RDS에 맞춰 생성해줘야 한다.
- Public으로 연결할 필요가 없기 때문에 Private으로 연결해준다.
ImageProcess function 생성
- 컨테이너 이미지로 람다함수를 생성한다.
- ImageProcess로 이미지를 만들고 역할을 연결해준다.
- 제한시간을 1분으로 늘려준다.
- ImageProcess Lambda Function은 트리거와 대상을 수정해줘야한다.
트리거
- 트리거 대상을 S3로 지정한다.
- 버킷을 선택해준다.
- Prefix는 접두사로, Images 디렉토리 안에 들어오는 이벤트만 이벤트를 부른다.
- Suffix는 접미사로, .jpg, .png등 파일이름에 확장자를 지정하는 등 파일의 이름 끝으로 이벤트발생을 조절할 수 있다.
대상 생성
- 비동기식 호출로 생성한다.
- ImageProcess가 성공시에 텍스트 데이터와 bucket이름, key를 인자로 보낸다.
- Ai-Text-lambda function가 호출되어 텍스트를 분석하고 RDS로 INSERT될 것이다.
Image_Process
git clone https://git-codecommit.ap-northeast-2.amazonaws.com/v1/repos/<CodeCommit name>
cp ImageProcess_AWS_Lambda/* <CodeCommit name>/
- 아까 github에서 clone해왔던 내용을 복사한다.
- 여기서
buildspec.yaml
코드를 수정한다.- ECR
login
,build
,tag
,push
, 그리고Lambda Deploy
코드를 수정해줘야한다.buildspec.yaml
version: 0.2 phases: pre_build: commands: - echo Logging in to Amazon ECR... - ls - aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <account>.dkr.ecr.ap-northeast-2.amazonaws.com build: commands: - echo Build started on `date` - echo Building the Docker image... - cat app.py - docker build -t <이미지이름> . - docker tag <이미지이름>:latest <account>.dkr.ecr.<region>.amazonaws.com/<이미지이름>:latest - today=$(date "+%Y%m%d") - docker tag <이미지이름>:latest <account>.dkr.ecr.<region>.amazonaws.com/<이미지이름>:${today} post_build: commands: - echo Build completed on `date` - echo Pushing the Docker image... - docker push <account>.dkr.ecr.<region>.amazonaws.com/<이미지이름>:latest - docker push <account>.dkr.ecr.<region>.amazonaws.com/<이미지이름>:${today} - echo Deploy New Image to Lambda function... - aws lambda update-function-code --region <region> --function-name <lambda function name> --image-uri <account>.dkr.ecr.<region>.amazonaws.com/<이미지이름>:latest
CodeCommit push
git add .
git commit -m "Init repo"
git push
- 잘 업로드 되었다.
Text_Process
git clone https://git-codecommit.ap-northeast-2.amazonaws.com/v1/repos/<CodeCommit name>
cp ImageProcess_AWS_Lambda/* <CodeCommit name>/
buildspec.yaml
파일을 ImageProcess와 같이 수정해준다.- 다시한번 Dockerfile의 환경변수를 확인해준다.
- 잘 PUSH되었다.
- 역할을 새로 만들어준다.
- 이렇게 새로 역할을 만들고, 그 역할에 정책을 추가할 것이다.
- 잘 생성되었다. 하지만 권한을 주지 않아서 빌드 실패가 된것을 볼 수 있다.
정책 생성
Ai_Image_Process_CodeBuild_Policy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "ecr:SetRepositoryPolicy", "ecr:GetRepositoryPolicy" ], "Resource": "arn:aws:ecr:<region>:<Account>:repository/<ECR Repo name>/" }, { "Sid": "ECRPullPolicy", "Effect": "Allow", "Action": [ "ecr:BatchCheckLayerAvailability", "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage" ], "Resource": [ "arn:aws:ecr:<region>:<Account>:repository/<ECR Repo name>/" ] }, { "Sid": "ECRAuthPolicy", "Effect": "Allow", "Action": [ "ecr:GetAuthorizationToken" ], "Resource": [ "arn:aws:ecr:<region>:<Account>:repository/<ECR Repo name>/" ] }, { "Effect": "Allow", "Action": [ "lambda:UpdateFunctionCode" ], "Resource": [ "*" ] } ] }
Ai_Text_Process_CodeBuild_Policy
- Text_Process도 마찬가지로 ECR리포지토리를 잘 연결해준다.
역할생성
- CodeBuild를 생성할때 같이 생성했던 역할을 찾아준다.
- 기본으로 존재하는 정책 + 위에서 생성한
Ai_Image_Process_CodeBuild_Policy
정책 +AmazonEC2ContainerRegistryPowerUser
AWSLambdaBasicExecutionRole
이렇게 총 5개의 정책을 연결해준다.
- 마찬가지로
Ai_Text_Process_CodeBuild
도 위 정책을 Text로 잘 연결해준다.
- 빌드가 잘 성공했다.
- Source와 Build를 진행중이다.
- Source, Build 모두 성공했다.
Pipeline test
docker tag ai_image_process:latest <account>.dkr.ecr.ap-northeast-2.amazonaws.com/ai_image_process:$(today)
- Docker Image push명령어에서 ai_image_process의 버전이 Latest밖에 올라가지 않았다.
- 그래서 자동으로 태깅하여 버전관리를 해주는 코드를 넣어봤다.
- 태그는 오늘 날짜가 들어가도록 한다.
- git push를 하자 바로 빌드가 시작된다.
- 빌드 성공
- 오늘 날짜태그와 latest태그가 잘 들어갔다.
- 여기 보안그룹에 IP 제한때문에 Lambda가 RDS와 연결하지 못했다.
- Lambda가 들어갈 수 있도록 보안그룹을 조정해주야한다.
Amazon Personalize
- 유저의 데이터를 S3에 넣거나, 애플리케이션에 자바스크립트 라이브러리를 이용한 Amazon Personalize API를 사용하여 Amazon Personalize 서비스를 이용할 수 있다.
- 데이터를 읽고, 훈련, 분석, 최적화,
- Image -> Text 가운데에 SQS추가하기