DynamoDBのモダンウェブアプリケーションを構築するハンズオンでハマった記録
DVAの勉強のために、以下のハンズオンを実施しました。
モダンウェブアプリケーションを構築する
ハンズオンでは基本的にCLIでの操作で構築をしていきますが、いくつかエラーになった箇所があったのでまとめておきます。
注意点
エラーにはAWS CLIのバージョンの差異によるものもあるので、手順通りにCloud9を使用すれば発生しないはずです。
僕はCloud9による課金を抑えたかったので、ローカルで実施しており、ローカルのCLIがv2でした。
それに対して、Cloud9のCLIはv1なので、このバージョンの差異でエラーが発生した箇所がありました。
環境 (2021.9.13時点)
- OS:Windows10 HOME ×64
- VSCode:1.60.6
- AWS CLI:2.2.7 Python/3.8.8
- SAM CLI:1.29.0
- Docker:20.10.7
- pip:21.2.4
- git:2.29.2.windows.2
ローカルからのコマンドは、VSCodeのターミナルでBashを選択して実行しました。
ただし、SAM CLIだけはコマンドプロンプトを選択して実行しました。
ローカル以外ではCloudShellも使用しました。
モジュール 2B: AWS Fargate を使用したサービスのデプロイ
ステップ1:Flaskサービスを作成する
$(aws ecr get-login --no-include-email)
ご存じの方も多いと思いますが、AWS CLI v2では
aws ecr get-login
は使用できません。
代わりに以下のコマンドを使用します。
aws ecr get-login-password | docker login --username AWS --password-stdin MY-REGISTRY-URL
詳細については、以下の記事がわかりやすいです。
[アップデート]AWS CLI v2 で $ aws ecr get-login を使うときの注意点
ステップ3:ロードバランサーを有効にしたFargateサービスを有効にする
aws elbv2 create-target-group
コマンドオプションのうち、以下の箇所でエラーが発生しました。
--health-check-path /
/
をパスとして認識していないようだったので、以下のように/
でエスケープしたところうまくいきました。
--health-check-path //
モジュール 2C: AWS のコードサービスを使用したデプロイの自動化
ステップ2:CI/CDパイプラインをテストする
toomanyrequests
CodeBuildでのビルド時のエラーです。
詳しい理由などは以下の記事がわかりやすいです。
“Too Many Requests.” でビルドが失敗する…。AWS CodeBuild で IP ガチャを回避するために Docker Hub ログインしよう!という話
CodeBuild を非 VPC 環境のプロジェクトとして作成している場合、CodeBuild のグローバル IP は共通アドレスが利用されています。
つまり、自分のビルド環境が 6 時間以内で 1 回目の pull だったとしても、そのときに割り当てられていた CodeBuild のグローバル IP が 6時間以内で 101 回目の pull であった場合、そのリクエストは Too Many Requests. になります。
6時間以内にCodeBuildのあるIPから、Docker Hubへのリクエストが制限を超えた場合に発生するエラーということですね。CodeBuildのIPは選べないので、IPガチャで当たればビルドでき、外れればビルドに失敗するというかんじで、僕はちょうどはずれを引いたため、初回のビルドに失敗しました。
再試行したら2回目はあたりガチャだったので、ビルドが成功しました。
モジュール 3: Mysfit 情報の保存
ステップ 1: Mythical Mysfits に NoSQL データベースを追加する
aws dynamodb batch-write-item
コマンドを実行したところ、could not be decoded
というエラーが発生しました。
解決手順は、ファイルをShift JISで開きなおし、再度コマンドを実行という流れでした。
解決には下記の記事を参考にしました。
Unable to load file:// with non-English char in UTF-8 encoding on Windows
CloudFormationでUnable to load paramfileエラー
モジュール 4: ユーザー登録の設定
ステップ 2: 新しい REST API と Amazon API Gateway を追加する
aws apigateway import-rest-api
コマンドを実行したところ、Invalid base64
というエラーが発生しました。
file://
をfileb://
に変更したらうまくいきました。
詳細は以下の記事がわかりやすいです。
AWSCLI v2のblobタイプの引数についてハマったお話
・file://〜 - ファイルの内容をbase64エンコードされたテキストとして扱う
・fileb://〜 - ファイルの内容をエンコードされていないバイナリとして扱う
モジュール 5: ユーザー行動の把握
ステップ 2: Lambda 関数のパッケージとコードを更新する
pip install requests -t .
コマンドを実行したところ、以下のエラーが発生しました。
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
awsebcli 3.20.1 requires urllib3<1.26,>=1.25.4, but you have urllib3 1.26.6 which is incompatible.
日本語訳
エラー:pipの依存関係リゾルバーは、現在、インストールされているすべてのパッケージを考慮していません。 この動作は、次の依存関係の競合の原因です。
awsebcli3.20.1にはurllib3 <1.26、> = 1.25.4が必要ですが、互換性のないurllib31.26.6があります。
EB(Elastic Beanstalk) CLIの問題だったようで、EB CLIをアップグレードしたら解消しました。
pip install awsebcli --upgrade --user
以下の記事が参考になりました。
Aws cli ebcliでエラー、動かない時にはまずpipパッケージのバージョンを確認しよう
まとめ
今回は、DynamoDBのモダンウェブアプリケーションを構築するハンズオンでハマった箇所を、解決方法とともに記録しました。ハンズオンの公開から時間が経つと、CLIのバージョンやコンソールのUIの変更で、手順通りにいかないことがあります。
解決法を探るうちに、いろんな記事を目にするのも勉強になるので、これはこれで良かったと思います。
どなたかの参考になれば幸いです。
Discussion