概要
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ファイルをアップロード
Step3:S3 Selectを試してみる
S3 Selectタブ選択して、画面下の次へを押す。
SQLが入力できることを確認
Step4:Lambdaを作成
・ 言語はPython
・ 作成後、IMAロールにS3の読み取り権限を付与する
・ 対象のロールからS3ReadOnlyAccessを付与する
・ ソースコードは以下にて作成
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名を入力
・ メソッドの作成、GETメソッドを選択、統合タイプをLambdaにして、Lambda関数名に上記でセットした名前にする
・ 統合リクエストを選択
・ マッピングテンプレートにapplication/jsonと入力して、チェックをつけ、
テンプレートに設定するGETパラメータの値を入力
・ APIのデプロイを選択。
・ ステージ名をつけて、保存すれば・・・
完成!
完成したURLを叩くと、JSON形式で結果が返ってくる。
PostCodeがパラメーターになっている。
↓ レスポンス例
最後に
LamdbaでAPI作れて便利ですが、ただではないです。
Lamdbaは呼ばれるたびにお金がかかります。
あとパフォーマンスは要チェックです。