見出し画像

S3 Select で郵便番号住所変換やってみた

こんにちは、先月介護資格(初任者研修)を取得したエンジニアの我那覇です。 郵便番号から住所に変換するAPIを自前で作る機会があったので、その方法をご紹介いたします。

概要


  1. 郵便番号情報を取得する

  2. S3へアップロード

  3. Lambda(S3 Select) で、郵便番号住所変換処理を作る

  4. API Gateway で、APIを作る



郵便番号情報を取得する


  1. 日本郵政から [住所の郵便番号最新全データ] をダウンロードします。

  2. utf_all.zip を解凍します。 utf_all.csv を取得します。



S3へアップロード


バケット作成


  1. S3

  2. バケット > バケットを作成

    • 一般的な設定

      • バケット名: lexues-zipcode-address

    • バケットを作成





アップロード


  1. lexues-zipcode-address

  2. アップロード

  3. utf_all.csv をドラッグアンドドロップする

  4. 閉じる



Lambda(S3 Select) で、郵便番号住所変換処理を作る


関数を作成


  1. Lambda

  2. 関数 > 関数の作成

    • 一から作成

    • 関数名: getAddressByZipCode

    • ランタイム: Node.js 16.x

    • 関数の作成

  3. 下記コードを入力 > 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};
};

ポリシーをアタッチ


  1. 設定 > アクセス制限 > ロール名 リンク押下

  2. 許可を追加 > ポリシーをアタッチ

    • AmazonS3ReadOnlyAccess チェック

    • 許可を追加




API Gateway で、APIを作る


APIを作成


  1. 設定 > トリガー > トリガーを追加

    • ソースを選択: API Gateway

    • Intent: Create a new API

    • API Type: REST API

    • Security: Open

    • 追加

  2. getAddressByZipCode-API リンク押下

  3. API をデプロイ

  4. ステージ: default > デプロイ


テスト


  1. Postman 等の HTTP Client でアクセスしてみる



さいごに

簡単に郵便番号住所変換APIを自作することができたのではないでしょうか? 外部のAPIが使えない場合は、 S3 Select を検討しても良いかもしれませんね。

※ 上記手順は、説明を簡単にするために、色々と削ぎ落としています。実運用上使用される場合は、適宜書き換えてください。ご参考まで!


いいなと思ったら応援しよう!