0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

FastAPIでのAPIをAWSの色々なサービスと連携させて動かす

Posted at

これは?

pythonのFastAPIで作成したAPIをAWSの色々なサービスと連携させて動かしてみるよ。
流れは以下。

  1. FastAPI + dockerでAPIを作る。
  2. 1をECR/ECSで動かす。
  3. 2をLambdaで動かす。
  4. 1をDynamoDBとの連携にする。
  5. 4をLambda Web Adapterで動かす。

1. FastAPI + dockerでAPIを作る。

作成するAPIは、簡単な利用者登録機能。以下、2つの機能を持つ。

  • 指名と年齢をリクエストして登録できる。(post)
  • 登録されている全員の情報を取得できる。(get)

DBはまずは使わず、data.csvに吐き出して使う。

作成したコード

できること

POSTでユーザー追加

$ curl -X 'POST' 'http://127.0.0.1:8000/save_person' \
  -H 'accept: application/json' -H \
  'Content-Type: application/json' \
  -d '{"name": "kaede", "age": 21}' 
> "save success name:kaede age:21"%

GETでユーザー情報取得
スクリーンショット 2024-01-07 10.05.17.png

FastAPIやdockerの利用方法は、色んな記事があるので割愛。

2. 1をECR/ECSで動かす。

1はあくまでローカルで動くものなので、これをAWSのECR/ECSで動くようにする。

2-1. ECRの用意

マネージメントコンソールからElastic Container Registryを選択。

スクリーンショット 2024-01-07 11.58.30.png

画面左のpublic repositoryから、リポジトリの作成を選択

スクリーンショット 2024-01-07 12.00.34.png

リポジトリ名を「ecr_work」にして作成。
これで、以下のようにECRのリポジトリが出来上がる。

スクリーンショット 2024-01-07 12.03.18.png

2-2. ECRにdockerイメージをpush

ECRのリポジトリをクリックして右上に出てくる「プッシュコマンドの表示」を参考にする。

スクリーンショット 2024-01-07 12.04.37.png

スクリーンショット 2024-01-07 12.05.48.png

上記そのままだが、awscliをインストールしておく必要がある。
awscliは、pipでインストールしておく。

$ pip install awscli

その後、以下のコマンドを実行する。

$ aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9x9g6a9
> Login Succeeded

※ このコマンドの実行前に、aws configureで、Acess Key IDとSecret Access Keyをセットする必要があった気がする。Access Key IDとSecret Access Keyは、コンソールのログイン名の「セキュリティ認証情報」から取得できる。

スクリーンショット 2024-01-07 12.11.45.png

スクリーンショット 2024-01-07 12.12.36.png

次に、docker buildでdocker imageを作成する。

$ docker build -t ecr_work .

$ docker images
> REPOSITORY                             TAG       IMAGE ID       CREATED       SIZE
> ecr_work                               latest    792e0636c9fa   2 hours ago   1.28GB

そして、docker imageにtag名をつける。

$ docker tag ecr_work:latest public.ecr.aws/q9x9g6a9/ecr_work:latest

$ docker images
> REPOSITORY                             TAG       IMAGE ID       CREATED       SIZE
> public.ecr.aws/q9x9g6a9/ecr_work       latest    792e0636c9fa   2 hours ago   1.28GB
> ecr_work                               latest    792e0636c9fa   2 hours ago   1.28GB

最後にtagを付与したdocker imageをECRにpushする。

$ docker push public.ecr.aws/q9x9g6a9/ecr_work:latest

pushが成功すると、ECRの画面で以下のように、pushされたイメージが確認できる。
スクリーンショット 2024-01-07 12.19.05.png

これで、ECRへのdocker imageのpushは完了。

2-3. ECSで動かす

ECRにpushしたdockerイメージを動作させるためにECSに登録する。

まず、ESCにアクセスし、「クラスター」を選択する。

スクリーンショット 2024-01-07 12.26.02.png

クラスタ名を指定し、インフラストラクチャにFargateを指定する。
スクリーンショット 2024-01-07 12.27.17.png

次に、タスク定義を作成する。「新しいタスク定義の作成」をクリックし、新しいタスク定義の作成を選択する。

スクリーンショット 2024-01-07 12.30.38.png

タスク定義名を指定し、

スクリーンショット 2024-01-07 12.32.03.png

インフラストラクチャの要件は、fargeteを指定。タスクロールに、ecsTaskExecutionRoleを指定。

スクリーンショット 2024-01-07 12.32.44.png

コンテナの箇所には、名前は任意に指定。
イメージURIは、ECRのURIをセットする。
コンテナポートとポート名の箇所は、FastAPIを8000ポートで扱っているため、8000を8000にフォワードするように指定しておく。(不要かも??80ポートアクセスを8000に変えるためとかでこう言うのはセットする気がする。)

スクリーンショット 2024-01-07 12.34.55.png

ログ収集の設定も以下のように入れておく。
デフォルトでセットされているため、そのままでOK。

スクリーンショット 2024-01-07 12.37.47.png

ストレージの量の箇所は、最小の21を指定しておく。
スクリーンショット 2024-01-07 12.38.58.png

ECRのURIの確認場所
スクリーンショット 2024-01-07 12.35.56.png

タスク定義が作成できたら、再度クラスターに戻り、今度はサービスを追加する。
クラスターでクラスタ名をクリックした後の画面から以下を表示させ、下のサービスの「作成」をクリックする。

スクリーンショット 2024-01-07 12.40.37.png

コンピューティングオプションは起動タイプを選択。
スクリーンショット 2024-01-07 12.42.25.png

デプロイ設定は、アプリケーションタイプにタスクを選択し、ファミリーに先ほど作成したタスク定義名を指定する。
スクリーンショット 2024-01-07 12.43.14.png

ネットワーキングは、セキュリティグループに8000ポートのアクセスを許可するセキュリティグループを指定する。
スクリーンショット 2024-01-07 12.48.35.png

※ セキュリティグループの作成は、マネコンから「セキュリティグループ」で検索して作成していく。
スクリーンショット 2024-01-07 12.46.00.png

今回はガバガバだけど、全てのIPからの:8000ポート接続を許可する。
スクリーンショット 2024-01-07 12.48.06.png

これでECSの設定は完了。
タスクにて、以下のようにステータスが実行中になれば準備完了。

スクリーンショット 2024-01-07 13.31.07.png

2-4. ECSでの動作確認

ECRのタスクをクリックすると、詳細情報が確認できる。

スクリーンショット 2024-01-07 13.32.00.png

ここで、パブリックIPを確認して動作確認をする。

ブラウザで8000ポートでアクセスすると、以下の結果を得て動作が確認できる。
スクリーンショット 2024-01-07 13.32.45.png

また登録と、全員の情報を取得する動作も確認する。

スクリーンショット 2024-01-07 13.34.02.png

登録

$ curl -X 'POST' 'http://3.112.235.11:8000/save_person' \
  -H 'accept: application/json' -H \
  'Content-Type: application/json' \
  -d '{"name": "tumikick", "age": 44}'
> "save success name:tumikick age:44"%

スクリーンショット 2024-01-07 13.35.20.png

登録後、再度全員の情報を取得すると、tumikickがちゃんといる。

cloudwatchのログも確認しておく。

スクリーンショット 2024-01-07 13.36.40.png

ちゃんと、標準出力がログとして残っている。

コード

shell配下に、ecrへのpushを追加している。

2をLambdaで動かす。

動かそうとしたけど、動かなかった・・・。
logを吐き出そうとしてエラーになってて、/tmp/配下に出すようにしないといけないっぽい?
後日やってみようと思う

参考

awscliのインストール

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?