🍔

ChatGPT-4にamplify overrideの使い方を聞いたらバグっていたので、この記事を読んで学習しろ

2023/03/31に公開

amplify override storage について書いた後に、ChatGPTに触れます。

AmplifyのOverride機能を使って、S3にバージョニングとライフサイクルポリシーを設定する方法

実行したいこと

Amplifyが作ったS3バケットに対して、以下の設定をしたいと考えました。

  • バージョニングをONにする
  • ライフサイクルポリシーを設定して
    • 最新のオブジェクト以外を30日で削除する
    • 最新のオブジェクト以外を10世代で削除する

これを、AmplifyのOverrideを使って実現してみました。

AmplifyのOverride機能とは

https://aws.amazon.com/jp/blogs/news/override-amplify-generated-backend-resources-using-cdk/

Amplifyが生成したAWSのリソースをカスタマイズする機能になります。
AmplifyはWebサービスに必要なリソースを簡単にデプロイできる非常に便利なサービスですが、簡単な故にリソースの様々な設定が自動で行われます。スモールスタートには良いのですが、サービスが大きくなってくると設定をカスタマイズしたくなります。
そうした時に細かい設定をカスタマイズできるのがOverride機能です。
今回はstorage(S3)をOverrideしますが、auth(Cognito)やapi(Api Gateway / AppSync)に対しても可能です。

実際にやってみる

前提

前提として、Amplifyのプロジェクトを作成済みで、storageを追加済の状態とします。

amplify init
amplify add storage
amplify push

storageのOverride機能を有効化します

下記のコマンドを実行してstorageのOverride機能を有効化してください。

amplify override storage 

しばらく待つと処理が完了して、amplify/backend/storage/<リソース名>/override.tsが作られます。

override.tsを編集する

override.tsを次のように編集して保存します。
言語はTypeScriptになります。

import { AmplifyS3ResourceTemplate } from '@aws-amplify/cli-extensibility-helper';

export function override(resource: AmplifyS3ResourceTemplate): void {
  // バージョニングを有効にします。
  resource.s3Bucket.versioningConfiguration = {
    status: 'Enabled',
  };

  // ライフサイクルポリシーを設定します。
  resource.s3Bucket.lifecycleConfiguration = {
    rules: [
      {
        // 最新のオブジェクト以外を 30 日で削除する
        // 最新のオブジェクト以外を 10 世代で削除する
        status: 'Enabled',
        noncurrentVersionExpiration: {
          noncurrentDays: 30,
          newerNoncurrentVersions: 10,
        },
      },
    ],
  };
}

適用する

AWSに適用します。

amplify push

しばらく待ってからAWSコンソールでS3バケットを確認したら、適用されていました。

amplify overrideについての話は、ここまでです。

ChatGPTについて

さて、今回の件、やり方をChatGPTに聞こうとしました。
その際に、最適な方法を提示してくれなかったり、教えてくれたコードがバグっていたりしたので、それについて少し書きます。

  • 世の中で情報が少ない機能は、こちらから提示しないと使おうとしない
  • バグってても自信満々で勧めてくる
  • 非推奨の機能でも気にせず勧めてくる
  • でも、大体あってる

世の中で情報が少ない機能は、こちらから提示しないと使おうとしない

結論から書いておくと、やりたいことだけ伝えても、amplify overrideを名指しで指定するまで、全く使おうとしませんでした。なので、ChatGPTに聞く場合でも最低限どういうサービスを使うと実現できそうかは調べておく必要があると感じました。

新しい機能や世の中の事例が少ない機能は、積極的には採用したがらないという印象を受けました。最新技術のくせに保守的ですね。人間でも結構そういう人いますよね。

経緯

まず最初に次のような質問をしました。

Amplifyで作ったS3にバージョニングとライフサイクルポリシーを設定する方法を教えて下さい。

回答の冒頭部分です。

AWS Amplify で作成された S3 バケットにバージョニングとライフサイクルポリシーを設定する方法を説明します。これには、AWS Management Console と AWS CLI の両方の方法を示します。

確かにで出来ますが手動ですね。つらいので、次のように質問してみます。

手動で実施するのはつらいので、コードで管理する方法はありますか?

はい、AWS CloudFormation や AWS CDK (AWS Cloud Development Kit) を使って、S3 バケットのバージョニングとライフサイクルポリシーをコードで管理することができます。この方法は、インフラストラクチャをコードで管理するために推奨される方法です。

これは間違いです。CFnやCDKではAmplifyとは関係ない新規S3バケットが作られてしまうので、やりたいことは達成できません。

ということで指摘します。

CFnやCDKでは、新規にS3バケットが作られてしまいませんか?Amplifyで作成されたS3バケットを対象に実施したいのですが、設定することは可能でしょうか?

すみません、認識が不足していました。Amplify で作成された既存の S3 バケットに対してバージョニングとライフサイクルポリシーを設定する場合、AWS CloudFormation や AWS CDK を直接使用することはできません。
ただし、AWS SDK を使用して、プログラムで設定を変更することは可能です。

可能だけど面倒くさいです!!

という感じで、amplify overrideは使ってくれませんでした。
ですが、全く知らないわけではなく、名指しで聞くと教えてくれました。

AWS SDKを使うよりも、Amplify overrideを使ったほうが簡単ではないですか?

おっしゃる通りです。Amplify の override 機能を使用すると、Amplify で作成された S3 バケットの設定を変更することができます。これにより、バージョニングとライフサイクルポリシーをより簡単に設定できます。以下に手順を示します。

バグっていても、自信満々で勧めてくる

具体的に使い方を聞いたらソースも教えてくれました。でも、大体あっているけど微妙にバグっていました。
いくつかバグはありましたが、AWSリソースのTypescriptの型が全て微妙に違うことが気になりました。
より具体的には、ローワーキャメルケースが正しいのに、アッパーキャメルケースなっていました。
(例えばversioningConfigurationが正解なのに、VersioningConfigurationになっているなど)

何故こんな微妙なバグが発生したのか気になったのでAWSのドキュメントを確認してみました。AmplifyのOverride機能のドキュメントからリンクをたどると、AWSリソースの型はこちらのページにたどり着きます。
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html
こちらのページはTypeScriptではなくて、CFnのJSONとYAMLになっていて、アッパーキャメルケースなんですよね。一方でTypeScriptではローワーキャメルケースで定義されているのですが、具体的な定義はドキュメントに書いてないし、サンプルが少しはあるけど数が少ないです。

こんなもん普通に間違うと思います。というか、この情報からTSのコード書けるの凄いわ、、、

テストしないで思い込みで作るとこのバグは普通に発生しそうだと思いました。人間でも結構そういうプログラマーいますよね。

非推奨の機能でも、気にせず勧めてくる

今回S3のオブジェクトを削除するのに、NoncurrentVersionExpirationInDaysを設定を提示されたのですが、この項目は非推奨とドキュメントに書いてあります
NoncurrentVersionExpirationを使うのが推奨されています。

動けばヨシ!って感じなんですかね。人間でも結構そういうプログラマーいますよね。

でも、大体あってる

いろいろと微妙な点を書いたのですが、手順とかコードの流れは大体あっていました。ですので、最初から最後まで全部自力で調べて書くのと比較してかなり楽が出来ました。
全てAIに任せるのは難しいけど、上流はある程度自分で考えて、コーディングや実作業をAIに任せて、結果をレビューするのが良さそうだと思いました。

NCDCエンジニアブログ

Discussion