In this blog, I’ll walk you through exactly how I created an AI-powered blog generator bot using Amazon Bedrock, Lambda, S3, and API Gateway. This was a mini project to practice serverless architecture using AWS services and AI text generation models to get introduce to Amazon Bedrock.

🔧 I used a non-chat LLaMA model from Amazon Bedrock, because that was available in my region (ap-south-1) and suited my use case well for blog generation, dont hesitate to use anyother model.


✨ What You’ll Learn

  • How to access and use Amazon Bedrock models
  • How to prepare a Lambda function with external libraries like boto3
  • How to integrate Lambda with API Gateway for POST requests
  • How to store generated blog content into S3 buckets
  • How to test the endpoint using free tools like ReqBin

🛠️ Step 1: Enable Amazon Bedrock and Choose Model

🔹 Accessing Bedrock

  1. Go to AWS Console → Services → Amazon Bedrock.
  2. Request model access (you may need to request access for models like LLaMA3, Titan, etc.).
  3. Wait for approval (this can take from minutes to a few hours).

💡 I used meta.llama3-8b-instruct-v1:0, which was available in my region. I didn’t choose a chat model specifically — I used what was available for experimentation. If available you should choose a chat based model or any other good text based model.

Amazon Bedrock Model Access


🧠 Step 2: Write and Prepare the Lambda Function

🔹 Writing the Function

The Lambda function handles:

  • Receiving the blog topic from API Gateway
  • Sending the prompt to the Bedrock model
  • Receiving and parsing the response
  • Saving the blog to S3
import boto3
import botocore.config
import json
from datetime import datetime
def blog_generate_using_bedrock(blogtopic:str)->str:
    prompt=f"""Write a blog minimum 300 to 500 words(no need to strictly follow) in a professional mammer with only 5 subtopics and a conclusion {blogtopic}"""
    body={
        "prompt":prompt,
        "max_gen_len":600,
        "temperature":0.5,
        "top_p":0.9
    }
    try:
        bedrock=boto3.client("bedrock-runtime",region_name="ap-south-1",config=botocore.config.Config(read_timeout=300,retries={'max_attempts':3}))
        response=bedrock.invoke_model(body=json.dumps(body),modelId="")

        response_content=response.get('body').read()
        response_data=json.loads(response_content)
        print(response_data)
        blog_details=response_data['generation']
        return blog_details
    except Exception as e:
        print(f"Error generating the blog:{e}")
        return ""

def save_blog_details_s3(s3_key,s3_bucket,generate_blog):
    s3=boto3.client('s3')
    try:
        s3.put_object(Bucket = s3_bucket, Key = s3_key, Body =generate_blog )
        print("Code saved to s3")

    except Exception as e:
        print("Error when saving the code to s3")

def lambda_handler(event, context):
    # TODO implement

    event=json.loads(event['body'])
    blogtopic=event['blog_topic']
    generate_blog=blog_generate_using_bedrock(blogtopic=blogtopic)
    if generate_blog:
        curr_time=datetime.now().strftime('%H%M%S')
        s3_key=f"blog-output/{curr_time}.txt"
        s3_bucket=''
        save_blog_details_s3(s3_key,s3_bucket,generate_blog)
    else:
        print("No blog was generated ")

    return{
        'statusCode':200,
        'body':json.dumps('Blog Generation is Completed')
    }

NOTE: - Replace 'Your_Model_ID' with your bedrock model's ModelID and 'Your_s3_bucket' with your AWS bucket

🔹 Important: Add boto3 Dependency

Amazon Bedrock needs latest boto3 version, which is not included in Lambda by default. You have two options:

✅ Option 1: Create a Lambda Layer with boto3

  1. On your local system, run:
mkdir python
   pip install boto3 -t python/
   zip -r boto3_layer.zip python
  1. Go to AWS Console → Lambda → Layers → Create Layer
  2. Upload boto3_layer.zip and choose compatible runtimes (Python 3.12, 3.11, or 3.10)
  3. Attach the layer to your Lambda function

Your Result should look like this
layer

🧠 Option 2: Include boto3 manually in deployment zip

(Same as above, but upload the entire zipped folder as your Lambda deployment package.)


🔗 Step 3: Setup API Gateway for Integration

🔹 Create an HTTP API

  1. Go to AWS Console → API Gateway
  2. Choose HTTP API
  3. Click “Build” and name it (e.g., BlogGenAPI)

🔹 Configure Routing

  1. Create a route: POST /blog-generation
  2. Add integration target: Your Lambda function
  3. Deploy the API and create a Stage (in my case: dev)
  4. You’ll get
Invoke URL
   https://your-api-id.execute-api.region.amazonaws.com/dev/

   AND 

   Route details
   POST /blog-generation

Stage Deploy


API Route integration with lambda


🪣 Step 4: Create and Connect S3 Bucket

  1. Go to AWS Console → S3 → Create a bucket
    • Bucket name: awsbedrocktapas (you can name it anything but should be unique)
  2. No need to make it public
  3. Go to IAM role of the Lambda and allow:
    • s3:PutObject on your bucket

s3 Bucket

In your Lambda code, the S3 upload part looks like this:

s3_key = f"blog-output/{curr_time}.txt"
s3_bucket = 'YOUR Bucket'
s3.put_object(Bucket=s3_bucket, Key=s3_key, Body=generated_blog)

Raplace 'YOUR Bucket' with your bucket name you just created


🧪 Step 5: Test the API using any tool, I am using ReqBin (Free Online Tool)

  1. Go to reqbin
  2. Choose method: POST
  3. URL: Your deployed API Gateway endpoint
https://your-api-id.execute-api.region.amazonaws.com/dev/blog-generation
  1. Choose Content-Type: json
  2. Add body:
{
  "blog_topic": "Benefits of Remote Work in 2025"
}
  1. Hit “Send” and check the response

API Testing

You should see:

{
  "blog_topic": "Benefits of Remote Work in 2025"
}

Now check your S3 bucket — you’ll find a .txt file with your freshly AI-generated blog!

S3 output files


🧾 Example Output Blog

Blog Output


✅ Final Flow Diagram (Optional)

Architecture


🎯 Conclusion

Using just four core AWS services — Bedrock, Lambda, API Gateway, and S3 — we’ve built a complete, serverless AI-powered blog generator.

This project taught me how to:

  • Work with LLMs via Bedrock
  • Integrate custom code into Lambda
  • Manage external Python libraries via Lambda Layers
  • Expose a POST API endpoint for external use
  • Save data persistently using S3

💬 You can build on top of this by adding:

  • A frontend (React/Next.js)
  • An email sender to notify when blog is ready
  • An admin dashboard for blog management

🌐 My Socials

Feel free to connect with me or collaborate on other serverless & AI projects:


📂 Project Repository

🔗 GitHub: https://github.com/its-tapas/blogGen


🤝 Open to improvements, ideas, and suggestions. Don't hesitate to fork, star, or contribute to this project!


Thanks for reading 🙌 — Tapas Singhal