🍣
Matsuri-tech Backend Weekly 2023-05-25

myuon

myuon

2023年5月25日
MBW

社内向けに、バックエンド関連のニュースや業務で発生したQ&A、利用しているライブラリなどの情報を定期的に書いています。

# Q&A: デプロイしたらS3に画像がアップロードできなくなりました

業務で発生したQ&Aです。 プロダクトをデプロイしたら、画像のアップロードAPIを叩いた際にAPIサーバーで「403 Access Denied」のエラーが出るようになりましたという報告があり、調査を手伝いました。

開発チーム曰くアプリケーションコードには手を加えていないのでインフラの設定関連だと思うとのことだったことと、aws-cdkのバージョンが上がっていたのが怪しそうだったのでcdkの差分を見てもらうことにしました。

問題の現象が起きる前のcommitに巻き戻してローカルでcdk diffを叩いてみると、IAMポリシーに差分がありました。(以下はdiffの出力の抜粋)

            [-]   "s3:PutObject",
            [-]   "s3:PutObjectLegalHold",
            [-]   "s3:PutObjectRetention",
            [-]   "s3:PutObjectTagging",
            [-]   "s3:PutObjectVersionTagging",
            [+]   "s3:PutObject*",

ここでは [+] が以前の出力で [-] が新しいcdkのバージョンによる出力です。

IAMポリシーの差分とS3アクセスで403エラーが発生していることから、Put関連の権限が足りていないのが原因と推測しました。実際に上記の差分では PutObject* が5つの具体的なアクションに展開されていますが、実際にはこの中に含まれないもので PutObject* に含まれていた権限によってエラーが起きているのではないかという推測ができます。

cdkのソースコードには手を加えられていない状態でこれが起きているということはcdkのバージョンアップで何か仕様変更があったのだろうと推測し、aws-cdkのGitHub Issue, PRから関連しそうなものを探してみたところ、以下がヒットしました。

説明によると、 Bucket.grantWrite は元々 s3:PutObjectAcl を付与していたがそれは許可しないことにするという内容の変更のようです。実際にcdkにはgrantWriteの記述があったので、これが原因だとほぼ見当がつきました。

実際に問題となったAPIのコードを探すとObjectAclをPublicにしてファイルをアップロードしている箇所があったので、ここでPutObjectAclが許可されなくなったことによるエラーであることが明らかになりました。

開発メンバーには上記のことを伝えた上で以下の2つの対応を提案し、2つ目を採用してもらって解決しました。

  • 1: PutObjectAclをIAM Policyに明示的に追加する。ただしこれは多くのBucketのgrantWriteの箇所をチェックする必要があるのであまり良い方法ではないかも
  • 2: ACLを使うのをやめ、BucketレベルでのPublic Access機能を用いる。実際に今回のケースでは元々バケット全体がPublic Access可能であり、Aclの設定は古いコードから引き継がれていたために残っていたものであったので、単にAclを設定している箇所を削除するだけで動くと思われる

# Dart3のリリース

Dart 3がリリースされました。大きな変更としてはNull Safetyになったことが挙げられます。

上記のドキュメントにも記載がありますが、元々Dartはあらゆる変数にnullを代入することを許容していたようです。しかしnull safetyとなってそれができなくなった代わりに、nullを代入したい場合は以下のように ? をつけた型を使う必要がある、という仕様変更がなされたようです。

int? aNullableInt = null;

実際のところnull safetyのような後方互換性を破壊する変更は、バージョン間で断絶を生みかねないので往々にして大変ですが、nullを使っていた箇所は ? をつければ良いというのは対処方法として分かりやすいためバージョンアップのしやすさを念頭に設計されてそうで良いなと思いました。

また、3へ上げるためのmigrationコマンドがあり、これによって上記のような書き換えは自動で行えるようなので、その辺りも大変親切です。

# AWS NEWS

# Rekognitionで視線方向を検出できるように

RekognitionのFace APIに、視線方向が検出できる変更が入りました。ドキュメントによると、以下のようにEyeDirectionにピッチとヨーの値が入って帰ってくるようになったようです。

      "EyeDirection": {
        "Yaw": 16.299732,
        "Pitch": -6.407457,
        "Confidence": 99.968704
      }

ニュースでは広告の効果測定や、ドライバーが運転に集中しているかを判定するなどの使い方が想定されており、使い方は限られますが面白い機能だなと思います。

# Rekognitionで顔検出の不正防止を行うAmazon Rekognition Face LivenessがGAに

顔認証を突破するために顔写真など(?)を使う不正を防止するために、Amazon Rekognition Face LivenessというサービスがGAになりました。

最近Rekoginitionのニュースが多いので、開発チームのやる気を感じます。

# RDS for PostgreSQLで、プロシージャをRustで書ける拡張PL/Rustがサポート

こういうのもあるんだなという気持ちです。