![見出し画像](https://assets.st-note.com/production/uploads/images/119114718/rectangle_large_type_2_ddd7da0096eb78b6c579f9da8c767377.png?width=800)
S3 Select で郵便番号住所変換やってみた
こんにちは、先月介護資格(初任者研修)を取得したエンジニアの我那覇です。 郵便番号から住所に変換するAPIを自前で作る機会があったので、その方法をご紹介いたします。
概要
郵便番号情報を取得する
S3へアップロード
Lambda(S3 Select) で、郵便番号住所変換処理を作る
API Gateway で、APIを作る
![](https://assets.st-note.com/img/1697163555-Xygl736fzU.png?width=800)
郵便番号情報を取得する
日本郵政から [住所の郵便番号最新全データ] をダウンロードします。
utf_all.zip を解凍します。 utf_all.csv を取得します。
![](https://assets.st-note.com/img/1697163556-xc7haXgRGc.png?width=800)
S3へアップロード
バケット作成
S3
バケット > バケットを作成
一般的な設定
バケット名: lexues-zipcode-address
バケットを作成
![](https://assets.st-note.com/img/1697163557-nmBmtTTHcE.png?width=800)
![](https://assets.st-note.com/img/1697163559-uOCbCcVG6P.png?width=800)
![](https://assets.st-note.com/img/1697163560-8NKmf3BUqn.png?width=800)
アップロード
lexues-zipcode-address
アップロード
utf_all.csv をドラッグアンドドロップする
閉じる
![](https://assets.st-note.com/img/1697163561-wzhKBlluUF.png?width=800)
![](https://assets.st-note.com/img/1697163562-DlyWNM0LSD.png?width=800)
![](https://assets.st-note.com/img/1697163563-THI8KU1QiU.png?width=800)
![](https://assets.st-note.com/img/1697163564-3bSUhcCGHE.png?width=800)
Lambda(S3 Select) で、郵便番号住所変換処理を作る
関数を作成
Lambda
関数 > 関数の作成
一から作成
関数名: getAddressByZipCode
ランタイム: Node.js 16.x
関数の作成
下記コードを入力 > Save > Deploy
![](https://assets.st-note.com/img/1697163565-YqLxxvKenf.png?width=800)
![](https://assets.st-note.com/img/1697163567-NLlVIyN7Gi.png?width=800)
![](https://assets.st-note.com/img/1697163568-seOabvLQni.png?width=800)
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 チェック
許可を追加
![](https://assets.st-note.com/img/1697163569-k6KWW2121k.png?width=800)
![](https://assets.st-note.com/img/1697163570-Gl4zbX558O.png?width=800)
![](https://assets.st-note.com/img/1697163571-XL8MejhP32.png?width=800)
API Gateway で、APIを作る
APIを作成
設定 > トリガー > トリガーを追加
ソースを選択: API Gateway
Intent: Create a new API
API Type: REST API
Security: Open
追加
getAddressByZipCode-API リンク押下
API をデプロイ
ステージ: default > デプロイ
![](https://assets.st-note.com/img/1697163572-3lPpOAz3pO.png?width=800)
![](https://assets.st-note.com/img/1697163573-VjL5pfQJ9p.png?width=800)
![](https://assets.st-note.com/img/1697163575-Zdiniyg8iy.png?width=800)
![](https://assets.st-note.com/img/1697163576-BxVO9fcHDO.png?width=800)
![](https://assets.st-note.com/img/1697163577-sm2Hl8oFAM.png?width=800)
テスト
Postman 等の HTTP Client でアクセスしてみる
![](https://assets.st-note.com/img/1697163555-Xygl736fzU.png?width=800)
さいごに
簡単に郵便番号住所変換APIを自作することができたのではないでしょうか? 外部のAPIが使えない場合は、 S3 Select を検討しても良いかもしれませんね。
※ 上記手順は、説明を簡単にするために、色々と削ぎ落としています。実運用上使用される場合は、適宜書き換えてください。ご参考まで!
この記事が気に入ったらサポートをしてみませんか?