Model、以後SAMと表記)を使用して、Boxにファイルを定期的にアップロードするLambdaを作成する機会がありました。BoxAPIが使用される部分で苦戦したので、備忘のために残しておきます。※SAMの基本的な仕組みについての説明は割愛します。前提として検証を行った環境は下記です。3.11.9クライアント資格情報許可形式のBoxアプリケーションを作成済み(※詳細は後述)やりたいことRDSに格納されているデータを取得し、それをcsvに書き出し、日次(毎日深夜1時)でboxのファイルにアップロードを行う簡素ですが、構成図としては以下のような仕組みになります。Boxの認証形式の違いBoxでカスタムアプリケーションを作成する際、下記画像のように認証方法を選択する部分があります。記載のようにサーバー認証(JWT使用)・ユーザー認証(OAuth2.0)・サーバー認証(クライアント資格情報許可)の3つがあります。外部コラボレーターやアプリの統合に最適。ユーザーがBoxにログインして認証を行う形式。アプリがクライアントIDとクライアントシークレットで認証を行う形式。今回の実装では、Lambdaの定期実行・・・つまりスクリプト処理になるので、サーバー認証(クライアント資格情報許可)を使用する、という形になります。サーバー認証(クライアント資格情報許可)アプリケーションを作成する際は、クライアントID・クライアントシークレット・EnterpriseIDこの3つが必要になります。※Enterpriseアプリケーションでは、boxの管理者に作成したカスタムアプリを承認していただく必要がありますので注意が必要です。template.yaml実装に使用したコードtemplate.yaml下記のような形でリソース定義をしています。ScheduledRuleForBoxUploadでEventBridgeルールを定義しています。その他の設定周りの解説は省略します。認証情報について、大部分は設定値を伏せています。logger_requirements.txt以下の外部ライブラリを使用するため記載しています。pythonを使用しています。ファイルのアップロードにあたってはupload_streamメソッドを使用しています。file_name)という形でファイルのアップロードを行うことができます。処理のおおまかな流れとしてはデータベースからデータを取得→認可処理を行いアクセストークンを取得しboxクライアントを作成→取得データをboxにアップロードするという形になります。(簡略化のために直書きしています。アップロードAPIのURL(簡略化のために直書きしています。{e}")ビルド&デプロイデプロイするユーザーのprofile(認証情報)を引数に指定してあげます。BoxアプリのEnterpriseIDを指定あとは、下記コマンドでビルド、デプロイを実施します。実際にデプロイしてLambdaを実行してみたところ、下記のようなエラーが出ていました。found"}]}エラー内容からして、アクセストークンを取得する関数は実行することができているようでしたが、その先のファイルアップロードの関数でエラーが出ているようでした。ローカルでcurlを叩いてみても、結果は同様でした。Found","request_id":"XXXXXX"}正しいフォルダIDを指定しているはずなのにエラーが出ている状況でした。解決したか原因が全くわからなかったため、とりあえず開発者用のアクセストークンを用いて、アップロードAPIを叩いてみたところ、正常にアップロードAPIが実行されました。※開発者トークンとは、開発およびテスト中に開発者が利用できるアクセストークンです。(あくまでも開発/テスト環境で使用するためのものなので、利用範囲についてはご注意ください。)(参照)そのため、原因はこのアクセストークンの権限の範囲が問題なのか?とも考えました。結果は全然違いました。アプリに関する設定をよくよく見返してみたところ、サービスアカウント情報の部分の説明文に、下記の説明がありました。このアプリが承認されると、サービスアカウントが自動的に生成されます。このアカウントは、あなたのアプリのユーザーとして使用されます。デフォルトでは、アプリはこのユーザーとしてAPIコールを行います。この記述から、「サービスアカウントのユーザーをフォルダに追加する必要がある?」と予想しました。アップロードAPIを叩くユーザーがフォルダにコラボレーターとして追加されていなければ、当然そのユーザーから見ればフォルダの存在を認識することはできません。エラーが出ていた、というわけでした。予想通り、アップロード対象のフォルダに、アプリ作成時のサービスアカウントをアップロード対象のフォルダに追加してあげることで、指定のフォルダにcsvファイルをアップロードすることができました。CloudWatchのログを見ると、定期実行も問題なく行われているようでした。【CloudWatchログ】まとめBoxAPIを使用するにあたって、今回行った実装内容に関連する日本語の記事があまり少なく、若干実装に苦戦しました。結果としては、公式ドキュメントに書いてあることや注意書きなどをしっかり見ることで解決につながったので、原点に立ち返って、初歩的な部分でミスをしていないかを確認することが改めて大事だなと感じました。Boxアプリの認証認可の仕組みや、Boxアプリの構造を十分理解して開発を行うことが重要だと感じたので、引き続き学習していければと思います。2023年4月にアイレットに新卒入社。DX開発事業部に所属し、開発エンジニアをしています。Champions選出。LaravelやPythonを使った開発に携わっています。Bedrockをはじめとした生成AI関連のサービスに興味を持って学習しています。趣味はランニング、音楽を聴くこと、お酒を飲むことです。佑宜が書いた記事xfacebookはてなブックマークpocketお客様のご要望に柔軟に対応いたします。お気軽にご相談ください。cloudpackは、アイレット株式会社が提供するクラウド支援サービスです。問い合わせまでトータルサポート!お問い合わせはこちらアイレットでは、様々な職種で一緒に働ける仲間を募集しています。インフラエンジニア、開発エンジニア、クリエイティブ職、営業職など、様々な職種で一緒に働ける仲間を募集しています。アイレット公式サイト採用情報をご覧ください。採用情報プライバシーポリシークラウド導入のご相談、お見積り、サービスについてのご質問などお気軽にお問い合わせください。最新情報が得られるメルマガ登録はこちら。