1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

サーバーレスな郵便番号検索APIを作成してみた

Last updated at Posted at 2019-12-30

概要

AWSでサーバーレスな郵便番号検索をつくってみたの手順書です。
ファイルを置いて、プログラムを少し書くだけ簡単にできます。

必要なもの

AWSアカウント

利用するサービス

・ S3 : 郵便番号のCSVを格納

・ S3 Select : S3のデータをSQLライクに抽出する

・ Lambda : S3のCSVからレスポンスを返すメソッド

・ API GetWay : Lambdaの内容をAPI化する

Step1:郵便局のCSVダウンロード

日本郵政のページから以下CSVをダウンロード。
文字コードがShiftJISなので、UTF8に変換しておく。

またSQLをわかりやすくかけるように、以下のヘッダーを付与する。

JISCode,OldPostCode,PostCode,PrefecturesNameKana,CityNameKana,TownNameKana,PrefecturesName,CityName,TownName,Note1,Note2,Note3,Note4,Note5,Note6

Step2:S3にCSVデータをアップロード

バケットを作成の上、対象のCSVファイルをアップロード

S3 Management Console 2019-12-30 20-53-20.png

Step3:S3 Selectを試してみる

S3 Selectタブ選択して、画面下の次へを押す。

S3 Management Console 2019-12-30 18-38-30.png

SQLが入力できることを確認

S3 Management Console 2019-12-30 18-39-05.png

Step4:Lambdaを作成

 ・ 言語はPython

 ・ 作成後、IMAロールにS3の読み取り権限を付与する

S3Select - Lambda 2019-12-30 18-41-52.png

 ・ 対象のロールからS3ReadOnlyAccessを付与する

IAM Management Console 2019-12-31 07-52-41.png

 ・ ソースコードは以下にて作成

import boto3
 
BUCKET_NAME = 'XXXXXX'
OBJECT_KEY = 'XXXXXX.CSV'
COMPRESSION_TYPE = 'NONE'

def lambda_handler(event, context):
    # APIのパラメーター
    postcode = event['postcode']
    # S3 Select
    query = 'select * from s3object s where PostCode =\'' + postcode + '\''
    s3 = boto3.client('s3')

    #S3.Client.select_object_contentの設定
    response = s3.select_object_content(
        Bucket=BUCKET_NAME,
        Key=OBJECT_KEY,
        ExpressionType='SQL',
        Expression=query,
        InputSerialization={
            'CSV': {
                'FileHeaderInfo': 'USE',
                'RecordDelimiter': '\n',
                'FieldDelimiter': ',',
            },
            'CompressionType': COMPRESSION_TYPE,
        },
        OutputSerialization={
            'JSON': {
                'RecordDelimiter': '\n'
            }
        }
    )
 
    # 結果を表示
    for payload in response['Payload']:
        if 'Records' in payload:
            records = payload['Records']['Payload']
            return records

Step5:APIGetWayを作成

 ・ RESTを選択、新しいAPIを選択、適当なAPI名を入力

API Gateway 2019-12-30 18-59-49.png

 ・ メソッドの作成、GETメソッドを選択、統合タイプをLambdaにして、Lambda関数名に上記でセットした名前にする

API Gateway 2019-12-30 19-00-43.png

 ・ 統合リクエストを選択

API Gateway 2019-12-30 19-08-48.png

・ マッピングテンプレートにapplication/jsonと入力して、チェックをつけ、
  テンプレートに設定するGETパラメータの値を入力

API Gateway 2019-12-30 19-13-13.png

・ APIのデプロイを選択。

API Gateway 2019-12-30 19-18-57.png

・ ステージ名をつけて、保存すれば・・・

API Gateway 2019-12-30 19-19-23.png

完成!

完成したURLを叩くと、JSON形式で結果が返ってくる。
PostCodeがパラメーターになっている。

あ.execute-api.ap-northeast-1.amaz.png

↓ レスポンス例

image.png

最後に

LamdbaでAPI作れて便利ですが、ただではないです。
Lamdbaは呼ばれるたびにお金がかかります。

あとパフォーマンスは要チェックです。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?