S3 Select で郵便番号住所変換やってみた
2023年10月3日 火曜日 | AWS BIZ & TECH
こんにちは、先月介護資格(初任者研修)を取得したエンジニアの我那覇です。
郵便番号から住所に変換するAPIを自前で作る機会があったので、その方法をご紹介いたします。
概要
郵便番号情報を取得する
- 日本郵政から [住所の郵便番号最新全データ] をダウンロードします。
- utf_all.zip を解凍します。 utf_all.csv を取得します。
S3へアップロード
バケット作成
- S3
- バケット > バケットを作成
- 一般的な設定
- バケット名: lexues-zipcode-address
- バケットを作成
- 一般的な設定
アップロード
- lexues-zipcode-address
- アップロード
- utf_all.csv をドラッグアンドドロップする
- 閉じる
Lambda(S3 Select) で、郵便番号住所変換処理を作る
関数を作成
- Lambda
- 関数 > 関数の作成
- 一から作成
- 関数名: getAddressByZipCode
- ランタイム: Node.js 16.x
- 関数の作成
- 下記コードを入力 > Save > Deploy
12345678910111213141516171819202122232425262728293031323334353637const AWS = require("aws-sdk");const s3 = new AWS.S3();exports.handler = async (event) => {// 郵便番号を取得const zipcode = event.queryStringParameters.zipcode;// S3 Selectconst response = await s3.selectObjectContent({Bucket: 'lexues-zipcode-address',Key: 'utf_all.csv',Expression: `SELECT s._7 AS "address1", s._8 AS "address2", s._9 AS "address3" FROM s3object s WHERE s._3 = '${zipcode}' LIMIT 1`,ExpressionType: "SQL",InputSerialization: {CSV: {FileHeaderInfo: 'NONE',RecordDelimiter: "\r\n",},CompressionType: 'NONE'},OutputSerialization: {JSON: {RecordDelimiter: "\n",},},}).promise();// 結果を取得let data = "";for await (const event of response.Payload) {if (event.Records) {data += event.Records.Payload.toString();}}return { statusCode: 200, body: data};};
ポリシーをアタッチ
- 設定 > アクセス制限 > ロール名 リンク押下
- 許可を追加 > ポリシーをアタッチ
- AmazonS3ReadOnlyAccess チェック
- 許可を追加
API Gateway で、APIを作る
APIを作成
- 設定 > トリガー > トリガーを追加
- ソースを選択: API Gateway
- Intent: Create a new API
- API Type: REST API
- Security: Open
- 追加
- getAddressByZipCode-API リンク押下
- API をデプロイ
- ステージ: default > デプロイ
テスト
- Postman 等の HTTP Client でアクセスしてみる
さいごに
簡単に郵便番号住所変換APIを自作することができたのではないでしょうか?
外部のAPIが使えない場合は、 S3 Select を検討しても良いかもしれませんね。
※ 上記手順は、説明を簡単にするために、色々と削ぎ落としています。実運用上使用される場合は、適宜書き換えてください。ご参考まで!