LambdaでQRコードを生成してみた

LambdaでQRコードを生成し、S3バケットに保存してみました。
2021.06.10

LambdaでQRコード生成を試してみました。

システム概要図

手軽に試したかったので、API Pathの任意の文字列をQRコード化し、S3バケットに画像として保存します。

おすすめの方

  • 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

生成された画像が下記です。

QRコード(xxx)

iPhoneのカメラで確認した様子です。

QRコードを読んでいる様子(xxx)

「this-is-a-pen」でQRコードを生成する

curl -XPUT https://xxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/qrcode/this-is-a-pen

生成された画像が下記です。

QRコード(this-is-a-pen)

iPhoneのカメラで確認した様子です。

QRコードを読んでいる様子(this-is-a-pen)

おまけ:S3バケットの様子

参考