こんにちは、高知からインターン・・・ではなく、大阪オフィスでインターンしている森田ドラゴンです。もう4ヶ月ほどインターンさせて頂いていますが、オフィスに来るのはこれが初めてです。リモートのやりとりだけでは分からない、サーバーワークスの空気感を知れたので、これからのインターンがますます楽しみです。
今日の課題は前回に引き続き
「S3にuploadされたpollyファイルの名前を変更して、再アップロードする」
という課題です。単純な課題ですが、色々なサービスを連携させて動作させることができたので、個人的には大満足です。特にSQSを利用して、Lambdaとjsをつなぐことが出来たのが楽しかったです。ちなみに下はフロントの画面です。前回と変わっていないですが、裏側はアップデートしてあります。
大まかな方針
- LambdaでS3のファイルの名前を変更する
- SQSに新しい名前と、古い名前のペアを送信する
- jsを使って、SQSに保存された名前を探索する
SQSを使うアイディアは、社員の森さんから頂きました。SQSはタスク割り振りのサービスだと思っていたので、教えて頂いてよかったです。
1.LambdaでS3のファイルの名前を変更する
LambdaでS3のファイル名を変更するのは簡単で、boto3のs3 client クラスを利用すれば簡単に実装できます。ただ、2つハマりポイントがあります。1つ目がlambda上でのファイルの保存場所です。前回アドバイス頂いて知りましたが、Lambda上ではファイルは /tmp/ 上にのみ保存することができるそうです。
2つ目は検索の仕方です。最初は "boto3 s3 doc"で調べて、出て来たドキュメントから "get"や"download"という接頭語がついた関数を実装していく。という手法を取っていました。ですが、項目が多く、実装には必要ない引数の説明等で時間を取られるので、あまり効率的ではありません。ダウンロード、アップロード、といったS3をLambdaから利用する際に、基本となるであろう動作を実装したいときは "boto3 s3 examples" と検索することをお勧めします。必要最低限の実装が書かれているので、コピペするだけで直ぐに利用できます。
https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-examples.html
Amazon S3 Examples
2.SQSに新しい名前と、古い名前のペアを送信する
SQSはデータを一時保存するためのキューを提供するサービスです。今回キューを利用したのは、Lambda新しく保存されたS3のファイルのリンクと、jsで生成されるリンクのURIを一致させるためです。そのために元のファイル名と、新しいファイル名をjson方式で保存する必要がありました。
僕が調べた限りではSQSではjsonをサポートしていなかったので、実装方法は悩みました。ただ、"json sqs"と調べると直ぐに答えが出て来ました。少し悔しかったです。 "jsonが送れないなら、string型でjsonを記述しちゃえばいい"ということが答えでした。jsで受け取る際はそれをjson.parse()してあげれば、jsonとして扱えるようになるとのことです。
3.jsを使って、SQSに保存された名前を探索する
最後の工程は、jsを使って、SQSに保存された名前を探索します。具体的には「SQSで保存されたデータからjsonを取得し、古いファイルと名前が一致していたら、もう一度SQSからjsonを取得し直す」という機能を実装します。SQSからデータを取得することは簡単にできましたが、jsの仕様である非同期処理に苦しめられました。便利な機能ですが使いこなせていないので、次はjsの仕様も調べてみたいと思います。
jsは無理やり実装した感じがするので、エラーが出そう。。。と言ったら次の課題はリファクタリングとSAMでのデプロイになりました。SAMは苦戦した思い出があるので、リベンジマッチと洒落込みたいと思います。
感想
今回は大阪オフィスにお邪魔させて頂いて、オフィスの方々と、リモートでは関わらない方々と交流させていただきました。緊張しましたが、暖かく迎え入れてくださったので、すぐに大阪オフィスに馴染むことができました。( 馴染めてましたよね? )
課題についての質問や、それ以外の開発手法についても色々質問することができたので、また大阪オフィスにきてインターンしたいです。次に来られるのは12/27 になりそうなので、それまではまたリモートで頑張っていきます。リモートだと影が薄くなりがちなので、slackで存在感出していけたらなと思います。
ではまた、よろしくお願いします