220905

HyeonKi Jo·2022년 9월 5일
0

최종

  • 발표자료 준비
  • 팀명, 팀 발표 준비 열중

오늘의 할일

  • 이미지분석 인프라 구축
  • 데이터분석 아키텍처 구성
    • 사용할 서비스 선정
    • 데이터 구하기
    • 사용할 서비스 사용해보기

이미지 분석 인프라 구축

ECR

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되었다.

S3생성

  • 퍼블릭 액세스 비활성화
  • 암호화 및 객체잠금 활성화
  • 버킷에 Credential과 이미지를 업로드할 디렉토리를 생성해준다.

  • GCP Vision API Credential을 객체 잠금하고 읽기 모드만 허용한다.
  • 거버넌스 모드로 특정계정에게만 덮어쓰기 및 삭제를 허용한다.
  • 보존 만료 날짜는 일단 1일만 보존한다.

RDS 생성






  • 프리티어 적용을 받는다.

Lambda function 생성

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될 것이다.

CodeCommit

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되었다.

CodeBuild





  • 역할을 새로 만들어준다.
  • 이렇게 새로 역할을 만들고, 그 역할에 정책을 추가할 것이다.

  • 잘 생성되었다. 하지만 권한을 주지 않아서 빌드 실패가 된것을 볼 수 있다.

정책 생성

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로 잘 연결해준다.
  • 빌드가 잘 성공했다.

CodePipeLine





  • 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태그가 잘 들어갔다.

RDS 확인

  • 여기 보안그룹에 IP 제한때문에 Lambda가 RDS와 연결하지 못했다.
  • Lambda가 들어갈 수 있도록 보안그룹을 조정해주야한다.

데이터 분석 아키텍처 구성

사용할 서비스 선정

AWS의 데이터 분석 서비스들

Amazon Personalize

  • 유저의 데이터를 S3에 넣거나, 애플리케이션에 자바스크립트 라이브러리를 이용한 Amazon Personalize API를 사용하여 Amazon Personalize 서비스를 이용할 수 있다.
  • 데이터를 읽고, 훈련, 분석, 최적화,

다음에 할일

  • Image -> Text 가운데에 SQS추가하기
profile
Talking Potato

0개의 댓글