주메뉴 바로가기 본문 바로가기

알림

콘솔 이동 시 로그인이 필요합니다.

로그인하시겠습니까?

아니요

닫기

주문 불가 알림

주문권한이 없습니다.

콘솔에 접근할 수 없는 계정입니다.

확인

닫기

알림

신용카드 등록이 필요합니다.

신용카드 등록 페이지로 이동하시겠습니까?

아니요

닫기
C&C Tech
img

AWS Bedrock(Stable Diffusion), Lambda, API Gateway를 활용한 이미지(영화 포스터) 생성

img 서평호
| 2024.10.19
  • Bedrock
  • Stable Diffusion
  • Lambda
  • API Gateway
  • AWS
  • IAM

AWS Bedrock의 Stable Diffusion 모델을 활용하여 Lambda와 API Gateway로 이미지(영화 포스터)를 자동 생성하는 방법을 단계별로 소개합니다.

시작하며: 이 글을 통해 얻을 수 있는 것들

인공지능과 클라우드의 발전으로 이미지 생성 분야에서도 혁신적인 변화가 일어나고 있습니다.
AWS Bedrock의 Stable Diffusion 모델은 고품질의 이미지를 생성할 수 있으며, 이를 Lambda와 API Gateway와 결합하면 자동화된 이미지 생성 서비스를 손쉽게 구축할 수 있습니다.
이 글에서는 이러한 기술들을 조합하여 간단한 이미지인 영화 포스터를 생성하는 과정을 알려 드립니다.
 

AWS Bedrock과 Lambda의 특장점

  • 손쉬운 AI 모델 활용: AWS Bedrock은 다양한 AI 모델에 대한 접근을 제공하며, Stable Diffusion은 고품질 이미지 생성을 지원합니다.
  • 서버리스 아키텍처의 장점: Lambda를 활용하면 서버 관리를 할 필요 없이 코드를 실행할 수 있으며, API Gateway와 결합하여 RESTful API를 손쉽게 구축할 수 있습니다.
  • 확장성과 비용 효율성: 필요할 때만 리소스를 사용하므로 비용을 절감할 수 있고, 트래픽 증가에도 유연하게 대응할 수 있습니다.
 

구현 아키텍처


[그림1 - 아키텍처 다이어그램]
 

사용리소스 주요특징 및 역할

Amazon S3 (Simple Storage Service)
  • 데이터 용량에 관계없이 무제한으로 저장 가능, 높은 내구성을 제공하여 데이터 손실 위험 최소화
  • 역할: 생성된 영화 포스터 이미지를 저장하는 저장소
AWS Lambda
  • 서버 관리 없이 코드 실행 가능, 오토스케일링 지원. AWS Managed 서비스로 사용한만큼 과금
  • 역할: 서버리스 컴퓨팅 환경에서 코드 실행을 담당하며, 영화 포스터 생성 로직을 구현
AWS Bedrock
  • 다양한 AI 모델 지원 - 이미지 생성 외에도 텍스트, 음성 등 다양한 생성형 AI 모델 제공
  • 역할: Stable Diffusion과 같은 생성형 AI 모델을 활용하여 이미지 생성 기능을 제공
Amazon API Gateway
  • 간편한 API 생성 - 몇 번의 클릭으로 API 엔드포인트 생성 가능.
  • 역할: 외부 클라이언트가 Lambda 함수를 호출할 수 있도록 RESTful API를 생성 및 관리
AWS IAM (Identity and Access Management)
  • 역할 기반 접근 - 특정 역할에 필요한 권한만 부여하여 보안 강화
  • 역할: Lambda 함수와 다른 AWS 서비스 간의 권한 관리를 담당
boto3 (AWS SDK for Python)
  • 다양한 서비스 지원 -S3, Bedrock, Lambda 등 거의 모든 AWS 서비스와 통합 가능
  • 역할: Lambda 함수 내에서 AWS 서비스와 상호작용하기 위해 사용되는 Python용 SDK


서비스 호출 흐름

1. 클라이언트 요청: 사용자가 API Gateway를 통해 영화 포스터 생성을 요청
2. API Gateway: 요청을 받아 Lambda 함수로 전달
3. AWS Lambda:
  • 요청된 프롬프트를 받아 AWS Bedrock의 Stable Diffusion 모델을 호출하여 이미지 생성
  • 생성된 이미지를 Amazon S3 버킷에 저장
  • 저장된 이미지의 프리사인 URL을 생성하여 클라이언트에 반환
4. Amazon S3: 생성된 이미지 저장 및 프리사인 URL을 통해 이미지 제공
5. AWS Bedrock: 이미지 생성을 위한 AI 모델 제공
*IAM: Lambda 함수가 S3 및 Bedrock과 안전하게 통신할 수 있도록 권한 관리


아키텍처 구현

1. 환경 준비: 필요한 AWS 자원 생성

S3 버킷 생성: 이미지 저장을 위한 버킷 sphmovieposterdesign01을 생성합니다.

[그림2 - S3버킷 생성]


2. Lambda 함수 생성 및 설정

Lambda 함수 생성: sphMoviePosterDesignFunction 이름으로 함수를 생성합니다.

[그림3 - Lambda Function 생성]

Lambda 테스트 및 boto3 버전 확인: Lambda에서 AWS 서비스를 사용하기 위해 boto3 라이브러리 버전을 확인합니다.

[python 코드]
import json
import boto3
print(boto3.__version__)

def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
Lambda 타임아웃 시간 조정: 이미지 생성에는 시간이 걸리므로 Lambda 타임아웃 시간을 1분이상으로 늘려줍니다.

[그림4 - Labmda 타임아웃 설정] 


권한 설정: 초기에는 테스트를 위해 Lambda에 필요한 권한을 부여합니다. 이후 최소 권한으로 조정합니다.

[그림5 - Lambda 권한 설정]
IAM 정책 조정: 보안 강화를 위해 Lambda 함수에 필요한 최소한의 권한만 부여합니다. BedrockFullAccess와 AmazonS3FullAccess 정책을 적용합니다.


3. Bedrock 모델 호출 구현

Stable Diffusion 모델 ID 확인: 모델을 호출하기 위해 모델 ID를 확인합니다.

[그림6 - 모델ID확인]

Lambda에서 실제 실행될 소스코드를 작성합니다.
Lambda 코드 수정 및 구현: 아래와 같이 Lambda 함수를 수정하여 Bedrock 모델을 호출하고, 생성된 이미지를 S3에 업로드합니다.
*주의) 아래 코드에서 모델ID 부분은 위에서 확인한 모델ID를 입력합니다.

[python 코드]
import json
import boto3
import base64
import datetime

# Bedrock 및 S3 클라이언트 생성
client_bedrock = boto3.client('bedrock-runtime')
client_s3 = boto3.client('s3')

def lambda_handler(event, context):
    # 이벤트에서 입력 프롬프트 추출
    input_prompt = event['prompt']
    print(f"Input Prompt: {input_prompt}")

    # Bedrock 서비스 요청 페이로드 생성
    model_id = 'stability.stable-diffusion-xl-v1'
    request_payload = {
        "text_prompts": [{"text": input_prompt}],
        "style_preset": "cinematic",
        "seed": 0
    }

    # Bedrock 모델 호출
    response_bedrock = client_bedrock.invoke_model(
        contentType='application/json',
        accept='application/json',
        modelId=model_id,
        body=json.dumps(request_payload)
    )

    # 응답 처리
    response_body = json.loads(response_bedrock['body'].read())
    base64_image_data = response_body['artifacts'][0]['base64']
    decoded_image_data = base64.b64decode(base64_image_data)

    # 이미지 이름 생성
    image_name = f"poster_{datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.png"

    # S3에 이미지 업로드
    bucket_name = 'sphmovieposterdesign01'
    client_s3.put_object(
        Bucket=bucket_name,
        Body=decoded_image_data,
        Key=image_name
    )

    # 이미지에 대한 프리사인드 URL 생성
    presigned_url = client_s3.generate_presigned_url(
        'get_object',
        Params={'Bucket': bucket_name, 'Key': image_name},
        ExpiresIn=3600
    )

    return {
        'statusCode': 200,
        'body': presigned_url
    }
 

4. 이미지 생성 테스트

Lambda 함수 테스트: 정상적으로 이미지(포스터)가 생성되는지 확인합니다.

[그림7 - 이미지생성 테스트]

완료된 이미지 생성 결과물을 확인합니다.

[그림8 - 이미지생성 테스트결과]


5. API Gateway 설정

API 생성 및 설정: Lambda 함수를 연결하는 API Gateway를 생성합니다.

[그림9 - API 생성 및 설정]

메서드 요청 및 통합 설정: 필요한 설정을 적용하여 API가 Lambda 함수를 호출할 수 있도록 구성합니다.

[그림10 - 메서드 요청 및 통합 설정]

API 배포: API를 배포하여 외부에서 접근할 수 있는 엔드포인트를 생성합니다.

[그림11 - API배포]


6. API를 통한 테스트 진행

테스트 예시:
prompt=a photo of an astronaut riding a horse on mars
prompt=image of a cute dog
결과 확인: API를 통해 요청을 보내고, 정상적으로 이미지가 생성되고 S3에 업로드되는지 확인합니다.

[그림12 - API테스트 결과확인]
 

결론

이번 글에서는 AWS Bedrock의 Stable Diffusion 모델을 활용하여 Lambda와 API Gateway로 영화 포스터를 생성하는 과정을 살펴보았습니다.
서버리스 아키텍처와 AI 모델을 결합하여 손쉽게 이미지 생성 서비스를 구축할 수 있음을 확인했습니다.

주요 교훈은 다음과 같습니다.
  • 신속한 AI 서비스 구축: AWS의 다양한 서비스를 활용하면 복잡한 인프라 없이도 AI 기반 서비스를 빠르게 개발할 수 있습니다.
  • 비용 효율성: 서버리스 아키텍처를 통해 필요한 만큼만 리소스를 사용하여 비용을 절감할 수 있습니다.
  • 확장성: 트래픽 증가에 따라 자동으로 확장되므로 안정적인 서비스 운영이 가능합니다.

 
img
서평호 | Cloud컨설팅팀

멀티클라우드/하이브리드 클라우드 기술 전문성을 확보하고 전파하고자 노력하고 있습니다.