この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
LambdaでQRコード生成を試してみました。
手軽に試したかったので、API Pathの任意の文字列をQRコード化し、S3バケットに画像として保存します。
※QRコードは(株)デンソーウェーブの登録商標です。
おすすめの方
- LambdaでQRコードを生成したい方
- LambdaでS3バケットにオブジェクトを保存したい方
QRコード生成アプリを作成する
SAM Init
sam init \
--runtime python3.8 \
--name QRCode-Sample \
--app-template hello-world \
--package-type Zip
SAMテンプレート
template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: QRCode-Sample
Resources:
ImageBucket:
DeletionPolicy: Retain
Type: AWS::S3::Bucket
Properties:
BucketName: cm-fujii-genki-qrcode-bucket
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: hello_world/
Handler: app.lambda_handler
Runtime: python3.8
Policies:
- arn:aws:iam::aws:policy/AmazonS3FullAccess
Environment:
Variables:
BUCKET_NAME: !Ref ImageBucket
Events:
HelloWorld:
Type: Api
Properties:
Path: /qrcode/{text}
Method: put
HelloWorldFunctionLogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: !Sub /aws/lambda/${HelloWorldFunction}
Outputs:
HelloWorldApi:
Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/qrcode/{text}"
requirement.txt
2つのライブラリを使用します。
requirements.txt
qrcode
pillow
Lambdaコード
app.py
import json
import qrcode
import io
import os
import boto3
BUCKET_NAME = os.environ['BUCKET_NAME']
s3 = boto3.client('s3')
def lambda_handler(event, context):
text = event['pathParameters']['text']
output = io.BytesIO()
image = qrcode.make(text)
image.save(output)
s3.put_object(
Bucket=BUCKET_NAME,
Key=f'{text}.png',
Body=output.getvalue(),
)
return {
'statusCode': 200,
}
デプロイ
sam build --use-container
を使うことで、実際にLambdaで使えるライブラリを使用します。
sam build --use-container
sam package \
--output-template-file packaged.yaml \
--s3-bucket cm-fujii.genki-deploy
sam deploy \
--template-file packaged.yaml \
--stack-name QRcode-Sample-Stack \
--s3-bucket cm-fujii.genki-deploy \
--capabilities CAPABILITY_NAMED_IAM \
--no-fail-on-empty-changeset
APIエンドポイントの取得
aws cloudformation describe-stacks \
--stack-name QRcode-Sample-Stack \
--query 'Stacks[].Outputs'
動作確認
「xxx」でQRコードを生成する
curl -XPUT https://xxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/qrcode/xxx
生成された画像が下記です。
iPhoneのカメラで確認した様子です。
「this-is-a-pen」でQRコードを生成する
curl -XPUT https://xxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/qrcode/this-is-a-pen
生成された画像が下記です。
iPhoneのカメラで確認した様子です。