AWS

【AWS】LocalStackでlambda,S3,DynamoDB無料で使ってみた。

AWS
この記事は約11分で読めます。

はじめに

AWSの勉強をしていく中で、lambdaで遊んで見たいと思ったので、無料で使えるLocalStackを使用し

いくつか環境を作って見ましたのでご紹介いたします。

LocalStackの環境構築・AWS CLIのコマンドにつきまして下記記事をご覧ください。

lambda

概要

AWS Lambdaは、サーバレスコンピューティングサービス、開発者がインフラの詳細を気にせずにアプ

リケーションのビジネスロジックに集中できるようにするサービスです。

AWS Lambda の概要 - AWS Lambda
Lambda は、サーバーをプロビジョニングまたは管理することなくアプリケーションを構築できるようにするコンピューティングサービスです。

使用できる言語

AWS Lambdaは、使用できる言語が複数あり自身の得意な言語で記載することができます。

  • JAVA
  • GO
  • PowerShell
  • Node.js
  • C#
  • Python
  • Ruby
よくある質問 - AWS Lambda |AWS
AWS Lambda に関するよくある質問 (FAQ) をお読みください。

Hello World

それでは、今回はLambdaを使ってHello Worldを表示させていきたいと思います。

今回使用する言語につきましては、pythonを使用していきます。他の言語が得意な方は他の言語で行な

ってください。

lambda.pyの作成

lambda.pyファイルを作成しコードは下記を記載します。

def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': 'Hello World'
    }

ファイルのパッケージ化

先ほど作成したファイルをパッケージ化しておきます。

zip lambda.zip lambda.py

関数の作成

作成したzipファイルを元に関数をデプロイしていきます。

aws --endpoint-url=http://localhost:4566 lambda create-function --function-name helloworld --runtime python3.8 --role arn:aws:iam::123456789012:role/lambda-ex --handler lambda.lambda_handler --zip-file fileb://lambda.zip --profile localstack

関数の実行

aws --endpoint-url=http://localhost:4566 lambda invoke --function-name helloworld output.txt --profile localstack

上記コマンドを行うとoutput.txtファイルが作成され中身が下記のようになっているといます。下記の

コードになっていることでlambdaは成功です。

{"statusCode": 200, "body": "Hello World"}

lambda+S3

S3概要

Amazon S3(Simple Storage Service)は、アマゾン ウェブ サービス (AWS)が提供するクラウド

ストレージサービスです。耐久性と可用性が非常に高くデータの中長期保存やバックアップに最適なス

トレージです。また、単に画像やファイルなどのデータを保存するだけではなく、CloudFrontを併用す

ることでコンテンツの配信などにも利用されます。

Amazon S3 とは - Amazon Simple Storage Service
クラウドへのデータの保存と、Amazon S3 ウェブサービスでのバケットとオブジェクトの中心的概念を説明します。

lambda+S3の環境構築

S3バケットの作成

まずは、LocalStack環境を、こちらから作成し、S3バケットを下記コマンドにより作成していきたいと

思います。

aws --endpoint-url=http://localhost:4566 s3api create-bucket --bucket s3lambda --region us-east-1 --profile localstack

作成が上手くいっているか下記コマンドにて確認します。

aws --endpoint-url=http://localhost:4566 s3 ls

下記が出ていれば作成されています。

2024-01-29 11:24:55 s3lambda

lambdaファイルの作成

下記のコードを記載します。内容といたしましては、先ほど作成した「s3lambda」内に今の日付の.txt

ファイルを作成するというコードです。

import os
import boto3
from boto3.session import Session
from datetime import datetime

# セッションの設定
session = Session(
    aws_access_key_id='dummy',
    aws_secret_access_key='dummy',
    region_name='ap-northeast-1'
)
if os.getenv('LOCALSTACK_HOSTNAME') is None:
    endpoint = 'http://localhost:4566'
else:
    endpoint=f"http://{os.environ['LOCALSTACK_HOSTNAME']}:4566"
# S3サービスへの接続設定
s3 = session.resource(service_name='s3',endpoint_url=endpoint)

def lambda_handler(event, context):
    bucket = "s3lambda"
    key = datetime.now().strftime('%Y-%m-%d-%H-%M-%S') + '.txt'
    file_contents = 'Lambda Save File'
    s3.Bucket(bucket).put_object(Key=key, Body=file_contents)

    return 'create file'+ key

lambdaからバケットにファイルを作成し入れる

コードを作成し終えたら、ファイルをパッケージ化し、関数のデプロイを行い関数を実行していきま

す。下記のコードを順番に行なっていきます。

zip lambda.zip lambda.py
aws --endpoint-url=http://localhost:4566 lambda invoke --function-name s3 output.txt --profile localstack
aws --endpoint-url=http://localhost:4566 lambda update-function-code --function-name "test-function" --zip-file fileb://lambda.zip --profile=localstack

上記をエラーなく行えたら、下記のコマンドでバケット内にファイルができているか確認していきま

す。

aws --endpoint-url=http://localhost:4566 s3 ls s3://s3lambda --profile localstack
2024-01-29 11:42:44         16 2024-01-29-02-42-44.txt

上記を確認できたら成功です。

lambda+DynamoDB

DynamoDB概要

Amazon DynamoDB は、フルマネージド NoSQL データベースサービスであり、シームレスなスケー

ラビリティを備えた高速で予測可能なパフォーマンスを提供します。

Amazon DynamoDB とは - Amazon DynamoDB
このフルマネージド NoSQL データベースサービスを使用して、任意の量のデータの保存と取得、および任意のレベルのリクエストトラフィックの処理を行えます。

lambda+DynamoDBの環境構築

DynamoDBテーブルの作成

まずは、DynamoDBテーブルを下記コマンドにより作成していきたいと思います。

aws --endpoint-url=http://localhost:4566 dynamodb create-table --table-name lambdaTable --attribute-definitions AttributeName=user,AttributeType=S AttributeName=time,AttributeType=S --key-schema AttributeName=user,KeyType=HASH AttributeName=time,KeyType=RANGE --billing-mode PAY_PER_REQUEST

作成が上手くいっているか下記コマンドにて確認します。

aws --endpoint-url=http://localhost:4566 dynamodb list-tables

下記が出ていれば作成が成功しています。

{
    "TableNames": [
        "lambdaTable"
    ]
}

lambdaファイルの作成

下記のコードを記載します。内容としましては、新たに「lambdaTable」内に記載のアイテムを追加す

るコードです。

import os
import boto3
from datetime import datetime

aws_access_key_id = 'dummy'
aws_secret_access_key = 'dummy'
region_name = 'ap-northeast-1'

if os.getenv('LOCALSTACK_HOSTNAME') is None:
    endpoint_url = 'http://localhost:4566'
else:
    endpoint_url = f"http://{os.environ['LOCALSTACK_HOSTNAME']}:4566"

dynamodb_client = boto3.client(
    'dynamodb',
    aws_access_key_id=aws_access_key_id,
    aws_secret_access_key=aws_secret_access_key,
    region_name=region_name,
    endpoint_url=endpoint_url
)

def lambda_handler(event, context):
    current_time = datetime.now().isoformat()
    try:
        response = dynamodb_client.put_item(
            TableName='lambdaTable',
            Item={
                'user': {'S': 'user1234'},
                'time': {'S': '202201011230001'},
                'attribute1': {'S': 'value2'},
                'attribute2': {'N': '1234'}
            }
        )
        return response
    except Exception as e:
        print(e)
        return {"Error": str(e)}

lambdaによるDynamoDBアイテムの挿入

コードを作成し終えたら、ファイルをパッケージ化し、関数のデプロイを行い、関数を実行していきま

す。下記のコードを順番に行なっていきます。

zip lambda.zip lambda.py
aws --endpoint-url=http://localhost:4566 lambda create-function --function-name dynamo --runtime python3.8 --role arn:aws:iam::123456789012:role/lambda-ex --handler lambda.lambda_handler --zip-file fileb://lambda.zip --profile localstack
aws --endpoint-url=http://localhost:4566 lambda invoke --function-name dynamo output.txt --profile localstack

上記をエラーなく行えたら、下記のコマンドでバケット内にファイルができているか確認していきま

す。

aws --endpoint-url=http://localhost:4566 dynamodb scan --table-name lambdaTable
{
    "Items": [
        {
            "attribute1": {
                "S": "value2"
            },
            "time": {
                "S": "202201011230001"
            },

上記を確認できたら成功です。

おわりに

いかがでしょうか。ローカル上で無料でS3やDynamoDBを作成しアイテムの出し入れがこれでできるか

と思います。