👻

AWS Lambdaとfreee APIでPixiv Boothの売上登録を自動化する(S3トリガー・Node.js版)

に公開

はじめに

この記事では、クリエイター向けECサイトPixiv Boothからダウンロードした売上CSVをトリガーにして、会計freeeに自動で取引を登録するサーバーレスアプリケーションの構築手順を解説します。

確定申告の時期に発生しがちな、大量の売上データの手入力作業から解放されることを目的としています。

対象読者

  • AWSの基本的なサービス(S3, Lambda, IAM, Secrets Manager)の概要を理解している方
  • Node.jsとnpmの基本的な知識がある方
  • freee APIの利用経験がある、またはこれから利用したい方

アーキテクチャ

この自動化は、以下のAWSサービスを連携させて実現します。

  1. ユーザー: Pixiv Boothから売上CSVをダウンロードし、S3バケットにアップロードします。
  2. Amazon S3: ファイルのアップロードを検知し、Lambda関数を起動します。
  3. AWS Lambda:
    • S3からCSVファイルを取得・解析します。
    • Secrets Managerから認証情報を取得します。
    • freee APIから最新のアクセストークンと各種ID(勘定科目など)を取得します。
    • 解析したデータに基づき、freeeに取引を登録します。

事前準備

  • AWSアカウント
  • freeeアカウント(開発者向けアプリ登録が可能なプラン)
  • GitHubアカウント
  • Node.js実行環境(ローカルでのカスタマイズやテスト用)

ステップ1: ソースコードの準備

本プロジェクトのソースコードはGitHubで公開しています。

https://github.com/qryuu/booth-freee-automator-repo

まずはご自身のアカウントにフォークし、ローカルにクローンしてください。

git clone https://github.com/qryuu/booth-freee-automator-repo.git
cd booth-freee-automator-repo

主要なファイルは以下の通りです。

  • index.js: Lambda関数のメインロジック
  • package.json: 依存するNode.jsライブラリの定義
  • buildspec.yml: AWS CodeBuildでのビルド手順を定義
  • .gitignore: Gitの管理対象外ファイルを定義

ステップ2: freeeの認証情報と基本IDの取得(一回だけ)

Lambda関数をセットアップするために、以下の情報を一度だけ手動で取得します。

2.1. freeeでアプリを登録

  1. freeeアプリストアにログインし、「アプリ管理」画面へ。
  2. 「新しいアプリを作成」をクリック。
  3. アプリ名などを入力し、コールバックURLurn:ietf:wg:oauth:2.0:oob と入力。
  4. 権限設定で、以下のスコープにすべてチェックを入れます。
    • 取引: write_deals, read_deals
    • 口座: read_walletables
    • 事業所: read_companies
    • 勘定科目: read_account_items
    • 税区分: read_taxes
  5. アプリを保存し、表示されるClient IDClient Secretを控えます。

2.2. 初回トークンと各種IDの取得 (CloudShell利用)

  1. AWSマネジメントコンソールからCloudShellを起動します。
  2. 認可コードの取得:
    • 以下のURLの<YOUR_CLIENT_ID>をご自身のClient IDに置き換え、ブラウザでアクセスします。
      https://accounts.secure.freee.co.jp/public_api/authorize?client_id=<YOUR_CLIENT_ID>&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code
    • 画面の指示に従って連携を許可し、表示された認可コードをコピーします。
  3. トークンの取得:
    • CloudShellで、以下のcurlコマンドの各<...>をご自身の情報に置き換えて実行し、**access_tokenrefresh_token**を取得します。
curl -X POST -H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=authorization_code" \
-d "client_id=<YOUR_CLIENT_ID>" \
-d "client_secret=<YOUR_CLIENT_SECRET>" \
-d "code=<YOUR_AUTHORIZATION_CODE>" \
-d "redirect_uri=urn:ietf:wg:oauth:2.0:oob" \
https://accounts.secure.freee.co.jp/public_api/token
  1. 事業者IDの取得:
    • 取得したaccess_tokenを使い、CloudShellで以下のコマンドを実行して 事業者ID (company_id) を取得します。
curl -H "Authorization: Bearer <YOUR_ACCESS_TOKEN>" https://api.freee.co.jp/api/1/companies
  1. 口座IDの取得:
    • freeeのUIで、事前に「口座」>「口座の一覧・登録」から「決済サービス・電子マネー」としてPixiv Booth用の口座を作成しておきます。
    • 取得したaccess_tokencompany_idを使い、以下のコマンドを実行します。実行結果の中から、作成した Pixiv Booth用の口座 を探し、そのidを控えます。
curl -H "Authorization: Bearer <YOUR_ACCESS_TOKEN>" "https://api.freee.co.jp/api/1/walletables?company_id=<YOUR_COMPANY_ID>"

ステップ3: AWSインフラの構築

3.1. Secrets Managerに機密情報を保管

  1. AWSコンソールで Secrets Manager を開きます。
  2. 「新しいシークレットを保存する」 をクリックし、「その他のシークレットのタイプ」を選択します。
  3. 「キー/値」タブで、以下のキーと、ステップ2で取得した値を設定します。
    • FREEE_CLIENT_ID
    • FREEE_CLIENT_SECRET
    • FREEE_REFRESH_TOKEN
    • FREEE_COMPANY_ID
    • FREEE_WALLETABLE_ID
  4. シークレット名booth-freee-automator/credentials と入力して保存し、作成されたシークレットのARNをコピーしておきます。

3.2. S3バケットを作成

CSVファイルをアップロードするためのS3バケットを、ユニークな名前で作成します。

3.3. CodeBuildプロジェクトを作成

  1. AWSコンソールでCodeBuildを開き、ビルドプロジェクトを作成します。
  2. ソースとして、ステップ1で準備したご自身のGitHubリポジトリと連携させます。
  3. 環境Amazon Linux 2023Standardイメージを選択します。
  4. アーティファクトで、タイプをAmazon S3に設定し、3.2で作成したS3バケットを指定します。
  5. 作成されたCodeBuildのサービスロールに、IAMコンソールからAmazonS3FullAccess(またはより制限されたポリシー)とAWSCodeBuildAdminAccessポリシーをアタッチします。

3.4. Lambda関数を作成・設定

  1. AWSコンソールでLambdaを開き、Node.js 20.xランタイムで新しい関数を作成します。
  2. IAMロールへの権限追加:
    • Lambdaの実行ロールに、Secrets Managerの読み書き (GetSecretValue, UpdateSecret)と、S3バケットの読み取り (GetObject) を許可するインラインポリシーを追加します。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [ "secretsmanager:GetSecretValue", "secretsmanager:UpdateSecret" ],
            "Resource": "YOUR_SECRET_ARN"
        },
        {
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*"
        }
    ]
}
  1. 基本設定の調整:
    • 「一般設定」でメモリ1024MBタイムアウト30秒程度に設定します。

ステップ4: ビルドとデプロイ

  1. ローカルのソースコードをGitHubにプッシュします。
  2. AWS CodeBuildプロジェクトの画面で 「ビルドを開始」 します。
  3. ビルドが成功すると、アーティファクト用のS3バケットにdeployment.zipが作成されます。
  4. Lambda関数の「コード」タブで、「アップロード元」>「Amazon S3 の場所」を選択します。
  5. 「S3のURL」入力欄に、CodeBuildがS3に出力したdeployment.zipオブジェクトURI(例: s3://your-bucket.s3.region.amazonaws.com/deployment.zip)を貼り付けて保存します。

ステップ5: 実行と確認

  1. Pixiv Boothからダウンロードした売上CSVを、CSVアップロード用に作成したS3バケットにアップロードします。
  2. アップロードが完了すると、自動的にLambda関数が実行されます。
  3. freeeにログインし、取引が正しく登録されていることを確認してください。

以上で、すべてのセットアップは完了です。


追記: v1.1.0 - Node.js 22 ランタイムへのアップデート手順

AWS LambdaのNode.js 20.xランタイムは2026年4月にサポートが終了(EOL)する予定です。
このプロジェクトを長期的に安定してご利用いただくため、ランタイムを最新のLTSバージョンであるNode.js 22.xにアップデートする手順を記載します。

既存のv1.0.0環境を構築済みの方は、お手数ですが以下の手順でアップデートをお願いいたします。

アップデート手順の概要

  1. ソースコードの更新: buildspec.ymlpackage.jsonを修正し、Node.js 22に対応させます。また、index.jsを修正し、テストと本番環境の切り替えを容易にします。
  2. 変更のデプロイ: 更新したコードをGitHubにプッシュし、CodeBuildで新しいdeployment.zipをビルドします。
  3. Lambda関数の設定更新: Lambdaコンソールの画面で、ランタイムのバージョンアップと、新しい設定(環境変数)の追加、そして最新のコードへの更新を行います。

1. ソースコードの更新

1.1. buildspec.ymlの修正

CodeBuildがビルド時に使用するNode.jsのバージョンを更新します。

# buildspec.yml
version: 0.2

phases:
  install:
    runtime-versions:
      # Node.jsのバージョンを22に更新
      nodejs: 22
  build:
    # ... (以下変更なし)

1.2. 依存ライブラリの更新

Node.jsのメジャーバージョンアップに伴い、依存しているライブラリも最新版に更新します。ローカルのプロジェクトディレクトリで以下のコマンドを実行してください。

npm update

これにより、package.jsonpackage-lock.jsonが更新されます。

1.3. index.jsの修正

v1.1.0から、参照するSecrets Managerのシークレット名を環境変数経由で指定するように変更しました。これにより、テスト環境と本番環境の切り替えが容易になります。

index.js
// index.js

// 変更前
// const SECRET_NAME = "booth-freee-automator/credentials";

// 変更後
const SECRET_NAME = process.env.SECRET_NAME;

2. 変更のデプロイ

  1. 更新したbuildspec.yml, package.json, package-lock.json, index.jsをコミットし、GitHubリポジトリにプッシュします。
git add .
git commit -m "feat: Update runtime to Node.js 22 and dependencies"
git push
  1. 設定済みのCI/CDパイプラインが自動的に実行され、CodeBuildによって新しいdeployment.zipがS3バケットにアップロードされます。

3. Lambda関数の設定更新

3.1. ランタイムの更新

  1. AWS Lambdaコンソールにログインし、対象の関数(例: booth-freee-automator)を開きます。
  2. 「コード」タブ > **「ランタイム設定」**の「編集」をクリックします。
  3. 「ランタイム」の項目を、「Node.js 20.x」から「Node.js 22.x」に変更して「保存」します。

3.2. ★重要★ 環境変数の設定

  1. 「設定」タブ > **「環境変数」**に移動し、「編集」をクリックします。
  2. **「環境変数を追加」**し、以下のように設定して「保存」します。
    • キー: SECRET_NAME
    • 値: booth-freee-automator/credentials (本番用のシークレット名)

3.3. コードのデプロイ

  1. 「コード」タブに戻り、「アップロード元」>「Amazon S3 の場所」を選択します。
  2. CodeBuildがS3に出力した、最新のdeployment.zipのオブジェクトURLを貼り付けて「保存」します。

以上でアップデートは完了です。
これにより、今後も長く安全にこの自動化システムをご利用いただけます。

Discussion