プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

VSCode の AWS Toolkit でデプロイに失敗

こちらの一連の記事で AWS Toolkit を試した際は、コマンドラインでデプロイしてました。なので、1本目の記事で VSCode でプロファイルを指定したのですが、何に使うのこれ?って感じでした。

アプリケーションの新規作成からデプロイまでの一連の作業は VSCode からでもできるはずです(でないと AWS Toolkit のメリットがいまいちですからね)。で、調べると、下記の記事などが見つかったので、これを参考にして次は VSCode 上でのデプロイを試してみます。

AWS Toolkit for Visual Studio Code試す #AWS - Qiita

新規アプリケーション作成

まず、新規にアプリケーションを作成するところからやってみます。VSCode を開いて、サイドパネルから aws タブを選んで、

Explorer の3点メニューから『Create Lambda SAM Application』を選択します。

すると『Select a SAM Application Runtime』としてランタイムを効かれるので、今回も Python 3.13 を選びます。次に、

のようにテンプレートの選択になります。この選択肢が、コマンドラインの sam init に比べて少ないんですね。今回はここでも、 Hello World を選びます。

次は、『Select the folder for your new SAM application』となり、作成するアプリケーションを保存するフォルダの選択を行います。この時表示されている sam_samples というのは、いま VSCode で開いているフォルダなので、ここをそのまま選びます。

フォルダを選択すると、アプリケーション名の入力になるので、適当な名前を入れます。

アプリケーション名(ここでは『third-sample』としました)入力後、 Enter キーを押すと、アプリケーションが作成されます。

こんな感じに、さきほど指定したフォルダの配下に、アプリケーション名のフォルダを作成し、その内部にファイル一式が作られます。

デバッグ

デバッグもこのままできます。既に、アプリケーション名のフォルダの上に .vscode フォルダと内部に launch.json が作られています。中身をみると、

{
    "configurations": [
        {
            "type": "aws-sam",
            "request": "direct-invoke",
            "name": "third-sample:HelloWorldFunction (python3.13)",
            "invokeTarget": {
                "target": "template",
                "templatePath": "${workspaceFolder}/third-sample/template.yaml",
                "logicalId": "HelloWorldFunction"
            },
            "lambda": {
                "payload": {},
                "environmentVariables": {},
                "runtime": "python3.13"
            }
        },
        {
            "type": "aws-sam",
            "request": "direct-invoke",
            "name": "API third-sample:HelloWorldFunction (python3.13)",
            "invokeTarget": {
                "target": "api",
                "templatePath": "${workspaceFolder}/third-sample/template.yaml",
                "logicalId": "HelloWorldFunction"
            },
            "api": {
                "path": "/hello",
                "httpMethod": "get",
                "payload": {
                    "json": {}
                }
            },
            "lambda": {
                "runtime": "python3.13"
            }
        }
    ]
}

のように、以前やったときと同様のデバッグ構成が記入済みになっています。

実際にブレークポイントを設定して実行すると問題なく動きました。

デプロイ

サイドパネルの aws タブの『Application Builder』を開きます。

いま VSCode で開いているフォルダに複数のアプリケーションがある場合は、アプリケーション名が並んでいるので、今回作成したアプリケーションを選択します。一番右の雲のアイコン、『Deploy SAM Application』アイコンをクリックします。なお、コマンドパレットを開いて、コマンドパレットから、 AWS: Deploy SAM Applocation を選択しても呼び出すことができます。

最初のデプロイコマンドの選択では『Deploy』を選択します。すると、いくつかパラメータの入力を求められます。

まずは入力したパラメータを保存したいので『Specify required parameters and save as defaults』を選択します。次に、

一覧よりデプロイするリージョンを選択します。

その次に、 CloudFormation スタックの一覧が表示されるので、既存のものを選択するか

新規に作成する場合は、入力します(ここでは、『third-sample』としました)。

次に、 S3 バケットの選択画面になります。こちらの記事をやったときに S3 バケットは作成済みなので『Specify an S3 bucket』を選択します。

一覧が表示されるので、こちらの記事で作られたバケット(一番下)を選んでおきます。

バケットを選ぶとデプロイが始まります。

が、なんと、ここでエラーがでました。

エラーの部分だけ取り出すと

Error: Cannot use both --resolve-s3 and --s3-bucket parameters in non-guided deployments. Please use only one or use the --guided option for a guided deployment.

ということのようです。どうしよう・・・

エラーへの対応

改めてエラーの内容を読んでみると non-guided では、 --resolve-s3 と --s3-bucket を同時に指定することができなくて一方だけにしろ、ということだとわかります。

コマンドラインでデプロイするときにオプションで付けていた --guided が対話的におこなうやつだったので、 non-guided は非対話的におこなうデプロイ方法なんでしょうね。で、 VSCode からはこっちの non-guided で呼ばれているんでしょうね、きっと。

オプションが書いてあると思われる samconfig.toml を見てみると、

[default.deploy.parameters]
capabilities = ["CAPABILITY_IAM", "CAPABILITY_NAMED_IAM"]
confirm_changeset = false
resolve_s3 = true
s3_bucket = "aws-sam-cli-managed-default-samclisourcebucket-xxxxxxxxxx"

という記述があります。一度 s3_bucket の行を消してやり直しても、やはりエラーになります(ついでに、s3_bucket の行も復活してます)。

どうすればいいんだ?

解決

ふと、 resolve-s3 は自動的にS3のバケットを作成するというオプションなので、ひょっとしたらデプロイ時のS3の選択時のところで、

もう一方の『Create a SAM CLI managed S3 bucket』のほうを選んでみたらいいんじゃないか?

と思って、 samconfig.toml から s3_bucket の記述を削除してから、これで試してみると、あら不思議

ビルドが成功しました。

ということで『Create ~』のほうは、resolve-s3 オプションを指していて、バケットがなければ作るしあればそれを利用するというオプションなんだと思います、きっと。

デプロイ2回目

ちなみに、2回目のデプロイ時は、

のように、『Use default values from samconfig』という、既存の samconfig ファイルを指定できるオプションが増えていました。これを選べば、面倒なパラメータの指定が要らないので、楽ですね。

(参考) samconfig.toml の違い

コマンドラインからデプロイしたときと VSCode からデプロイしたときで、保存された samconfig.toml は若干違っているようです。

左がコマンドライン時のもの、右が VSCode のものになります。

VSCode だと別途プロファイルを指定して接続しているので、 profile の記述がいらないなどあるんでしょうね。

あと、VSCode でデプロイした場合、 S3 のバケット内にスタック名のフォルダが作られず、バケット直下にファイルが作られていました。それもこの s3_prefix の有無と関係がありそうですね。

大きくは異ならないようですが、一応こんな違いがありました。ま、このあたりは SAM 使いながら理解していきましょう。

所感

ということで、コマンドラインでのデプロイに加えて、 VSCode からのデプロイも試してみました。どちらでも操作できるのいいですね。