こんにちは、高知からリモートインターンしている森田ドラゴンです。先日のインターンはサクサク進んだので、今日もそのノリでいけるかなと期待していたんですけど、色々つまりました。
課題の内容は
S3のPutObjectトリガーでLambdaを動かして、S3にアップロードされたmp3ファイルの名前を変更する
という内容です。s3は単純なイメージがあるので、boto3でチョチョっと値を変えれば動く気がしたんですけどね。
とりあえずLambda関数を作って見て、開発の手順を考えました
・Pollyがアップロード完了したということを検知しないといけない -> 投稿状態というものがあるのでアップが完全に完了したかどうかを検知する必要がある
・S3でファイルをコピーして、元にあったファイルを削除
・ファイル名は、SDKの方とリンクurlが同じになるようにする
動作の確認はAWS SNS
トリガーは、Lambdaの左側にあるタブから簡単に追加できるので、すぐに終わりました。次はアップロードに反応してコードが動いているか確かめる方法を考えました。テスト項目にS3のPUTイベントというものがありましたが、設定したトリガーが動くかどうかはわからないのでAWS SNSを設定しました。
今考えると「え、トピックとサブスクリプション作るだけやん」と思いますが、その時はトリガーやS3のPUTイベントやらわからないことが多く色々と不安だったので、頭が回りませんでした。問題を分解して考えても、なんとなく不安を感じてしまうのは悪い癖ですね。
頭が回っていなかったので、トピックとサブスクリプションを設定してから、SNSの方でもS3のトリガーを設定しようとしていました。ドキュメントを読んでいるときに「今回はLambdaから設定しないと意味がない」ということを思い出していなければ、そのまま時間を潰してしまう所でした。
SNSをLambdaから起動するようコードを打ち込んであげると、S3にファイルをアップロードした際にメールが届くようになりました。
パケットコピーしてもファイル名は変更できない?
テストのたびに一々ファイルをアップロードするのは面倒だったので、eventのjsonを出力してそれをテストイベントとして登録しました。bucketやobjectのprefixなど既に知っている項目もあれば、responseElementsなどの、見たことのないデータも送られてきていました。* 余談ですけど、eventのデータを調べると、Cloud Trailのドキュメントが最初に出てきました。サービス間でやりとりされるデータは類似しているようです。
S3 eventのデータもわかったので、意気揚々とboto3( AWS (Amazon Web Services) を Python から操作するためのライブラリ )のドキュメントを開くと、そこにはSDKを超えるドキュメントが、ありました。
文句をいう訳ではないですが、AWS SDKのドキュメントに比べて読みにくい気がします。あちらはパラメータの横に、パラメータが必須かどうかが記述されていましたが、こちらは分離して書かれていました。そのせいで、何度か書き間違いによるミスを起こしてしまいました。
S3ファイルのコピーに必要な関数や、パラメータがわかったので、とりあえずコピーして見ようとしましたが、動きませんでした。そもそも、ファイルをコピーする関数には、名前を変更する項目がなかったので、この関数を使うことは諦めました。手間はかかりますが、データを取得後に、そのファイルの名前を変えてアップロードするというやり方を取ることにしました。
ですが、そのやり方も思った通りに動かず。よくよくドキュメントを読んでみると、boto3にはclientとresource、2つのS3との連携の仕方があり、またget_object関数とdownload_file関数、2種類のデータの取得の仕方があることがわかりました。僕の中では オブジェクト = ファイルという認識だったので、なぜわざわざ関数が2つあるのか理解できませんでした。どちらかの関数が動けば、そこから考察していけるので、Googleで検索しながら進めましたが、どちらも動く気配がなく、詰まってしまいました。記事を書いている途中に、自分がわかっていなかったことが整理できたので、次はLambdaで取得したデータの状態について、パスとkeyの違いについて調べるところから始めます。
アドバイス
書き終わった後に/tmp/ の階層にしかlambdaはファイルを置けないということを教えてもらいました
😛
感想
SNSとS3のトリガーのドキュメントを読み始めたあたりで、今日の課題はつまりそうな予感がしていましたが、案の定つまりました。サービス単体なら、チュートリアルと同じことを書いておけば間違うことは無いですが、サービスを連携させて作るときは、個々のサービスのパラメータを理解する必要があるので、難易度が少し上がります。かといって一つ一つ丁寧にパラメータ見てると日が暮れそうになります。この前SDKの関数を使って、慣れたと思ったんですけど、boto3の方はSDKの倍ぐらいの重みがありますね。進捗悪かったので、次はまた違うやり方でエラーに対処していきます。ではまた。