시작하며: 이 글을 통해 얻을 수 있는 것들
인공지능과 클라우드의 발전으로 이미지 생성 분야에서도 혁신적인 변화가 일어나고 있습니다.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 Managed 서비스로 사용한만큼 과금
- 역할: 서버리스 컴퓨팅 환경에서 코드 실행을 담당하며, 영화 포스터 생성 로직을 구현
- 다양한 AI 모델 지원 - 이미지 생성 외에도 텍스트, 음성 등 다양한 생성형 AI 모델 제공
- 역할: Stable Diffusion과 같은 생성형 AI 모델을 활용하여 이미지 생성 기능을 제공
- 간편한 API 생성 - 몇 번의 클릭으로 API 엔드포인트 생성 가능.
- 역할: 외부 클라이언트가 Lambda 함수를 호출할 수 있도록 RESTful API를 생성 및 관리
- 역할 기반 접근 - 특정 역할에 필요한 권한만 부여하여 보안 강화
- 역할: Lambda 함수와 다른 AWS 서비스 간의 권한 관리를 담당
- 다양한 서비스 지원 -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을 생성하여 클라이언트에 반환
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!') } |

[그림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 기반 서비스를 빠르게 개발할 수 있습니다.
- 비용 효율성: 서버리스 아키텍처를 통해 필요한 만큼만 리소스를 사용하여 비용을 절감할 수 있습니다.
- 확장성: 트래픽 증가에 따라 자동으로 확장되므로 안정적인 서비스 운영이 가능합니다.