S3 Select で郵便番号住所変換やってみた
こんにちは、先月介護資格(初任者研修)を取得したエンジニアの我那覇です。 郵便番号から住所に変換するAPIを自前で作る機会があったので、その方法をご紹介いたします。
概要
郵便番号情報を取得する
S3へアップロード
Lambda(S3 Select) で、郵便番号住所変換処理を作る
API Gateway で、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
const AWS = require("aws-sdk");
const s3 = new AWS.S3();
exports.handler = async (event) => {
// 郵便番号を取得
const zipcode = event.queryStringParameters.zipcode;
// S3 Select
const 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 を検討しても良いかもしれませんね。
※ 上記手順は、説明を簡単にするために、色々と削ぎ落としています。実運用上使用される場合は、適宜書き換えてください。ご参考まで!