はじめに
AWSの勉強をしていく中で、lambdaで遊んで見たいと思ったので、無料で使えるLocalStackを使用し
いくつか環境を作って見ましたのでご紹介いたします。
LocalStackの環境構築・AWS CLIのコマンドにつきまして下記記事をご覧ください。
lambda
概要
AWS Lambdaは、サーバレスコンピューティングサービス、開発者がインフラの詳細を気にせずにアプ
リケーションのビジネスロジックに集中できるようにするサービスです。
使用できる言語
AWS Lambdaは、使用できる言語が複数あり自身の得意な言語で記載することができます。
- JAVA
- GO
- PowerShell
- Node.js
- C#
- Python
- Ruby
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を併用す
ることでコンテンツの配信などにも利用されます。
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 データベースサービスであり、シームレスなスケー
ラビリティを備えた高速で予測可能なパフォーマンスを提供します。
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を作成しアイテムの出し入れがこれでできるか
と思います。