📝

DynamoDBのモダンウェブアプリケーションを構築するハンズオンでハマった記録

2021/09/14に公開

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