🗂

【AI_8日目_2回目】FastAPI_1冊目

2024/09/09に公開

こんにちは投資ロウトです。

背景

AI開発ができるためにwebAPIについて理解を深めていきます。
※Tailwind CSSとkeycloakは現場でピンチになれば再開します。

AWSでリリースをする

今回リリースに利用するのは、下記を使用するとのことでした。

・AWS App Runner
・Amazon ECR
・Amazon RDS

App RunnerとECSはどのように使い分けをすればいいかわからないので、AWSサポートの人に問い合わせをしました。

【回答】
・App Runner・・・アプリケーションを稼働させるための複雑なインフラストラクチャの設定等を行わずに使用できることがメリットとなっているため、作成したコンテナイメージがWebサービスとして機能することを迅速に検証したいような要件では有効。とのこと。

・ECS・・・インフラストラクチャを含め様々な設定を柔軟にカスタマイズすることが可能。

(Azure)
AzureではApp Runnerに近しいサービスとして、Azure App Serviceというものもあるそうです。

またテスト環境であれば、App Runnerでもいんじゃない?みたいな回答もしてくださいました。サポートの方ありがとうございます。

データベースの作成

Cloudformationで作成してみます。
※セキュリティーグループを無くしたので、注意してください。
※RDSでお金がかかると思うので、構築の際は注意してください。

AWSTemplateFormatVersion: "2010-09-09"
Description: Create VPC, Subnet, and RDS instance in Tokyo region

Resources:
  # VPCの作成
  DoshiVPC:
    Type: "AWS::EC2::VPC"
    Properties:
      CidrBlock: "10.0.0.0/16"
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: "Name"
          Value: "DoshiVPC"

  # サブネットの作成 (アベイラビリティゾーン1)
  DoshiSubnetA:
    Type: "AWS::EC2::Subnet"
    Properties:
      VpcId: !Ref DoshiVPC
      CidrBlock: "10.0.1.0/24"
      AvailabilityZone: "ap-northeast-1a"
      Tags:
        - Key: "Name"
          Value: "DoshiSubnetA"

  # サブネットの作成 (アベイラビリティゾーン2)
  DoshiSubnetC:
    Type: "AWS::EC2::Subnet"
    Properties:
      VpcId: !Ref DoshiVPC
      CidrBlock: "10.0.2.0/24"
      AvailabilityZone: "ap-northeast-1c"
      Tags:
        - Key: "Name"
          Value: "DoshiSubnetC"

  # DBサブネットグループの作成
  DoshiDBSubnetGroup:
    Type: "AWS::RDS::DBSubnetGroup"
    Properties:
      DBSubnetGroupDescription: "Subnet group for RDS"
      SubnetIds:
        - !Ref DoshiSubnetA
        - !Ref DoshiSubnetC

  # RDSの作成
  DoshiRDSInstance:
    Type: "AWS::RDS::DBInstance"
    Properties:
      DBInstanceIdentifier: "doshiDatabase"
      DBInstanceClass: "db.t3.micro"
      Engine: "MySQL"
      MasterUsername: "admin"
      MasterUserPassword: "パスワードは各々設定"
      AllocatedStorage: "20"
      BackupRetentionPeriod: 7
      DBSubnetGroupName: !Ref DoshiDBSubnetGroup
      MultiAZ: false
      PubliclyAccessible: false
      StorageType: "gp2"

cloudformationにyamlファイルでアップしていきます。

スタック作成成功しました。

ECRを作成

ECRへアクセスします。

プライベートのリポジトリを作成していきます。

プライベートリポジトリが作成されました。

aws-cliを入れている方は、現在の使用しているアカウントについて確認します。
※IAMのロール設定などが変更必要かもしれません。

aws sts get-caller-identity

awsにログイン

aws ecr get-login-password | docker login --username AWS --password-stdin https://{自社のアカウントのID}.dkr.ecr.{対象のリージョン}.amazonaws.com

ログインに成功しました。

Dockerのイメージのビルドとアップロードを行う

docker build -t {会社のアカウントID}.dkr.ecr.{対象のリージョン}.amazonaws.com/アプリ名:latest --platform linux/amd64 -f Dockerfile .

-t ECRのリポジトリ名:タグ名
とのことです。よくmysql等のコンテナ等のイメージにlatestがついているのは、タグ名だったんですね。

またAWS App Runnerがlinux/amd64を対応しているからこちらを選んでいるとのことです。

またECRと疎通確認をするために、以下のコマンドを実施するといいとのことです。

aws ecr list-images --repository-name=demo-app

リポジトリにDockerイメージをpushします。

docker push {会社のアカウントのID}.dkr.ecr.{リージョン名}.amazonaws.com/アプリ名:タグ名

リポジトリの中にイメージが追加されました。

AWS App Runnerを使用。

サービスを作成していきます。

先ほど作成したECRのイメージを入力していきます。

次にサービス等を入力していきます。

環境変数はDBと接続するため下記を入力するそうです。
・DB_USER
・DB_PASSWORD
・DB_HOST

またVPCコネクタを追加しないと、RDSに接続するために必要とのことでした。

間違えて、VPCコネクタを追加せずに起動してしまったため、App Runnerの起動に失敗しました。

 [AppRunner] Deployment with ID : ID started. Triggering event : SERVICE_CREATE
 [AppRunner] Deployment Artifact: [Repo Type: ECR], [Image URL: 会社のID.dkr.ecr.リージョン.amazonaws.com/アプリ名], [Image Tag: latest]
 [AppRunner] Pulling image 会社のID.dkr.ecr.リージョン名.amazonaws.com/アプリ名 from ECR repository.
 [AppRunner] Successfully pulled your application image from ECR.
 [AppRunner] Provisioning instances and deploying image for publicly accessible service.
 PM [AppRunner] Performing health check on protocol `TCP` [Port: '起動想定のポート番号'].
 [AppRunner] Health check failed on protocol `TCP` [Port: '起動想定のポート番号']. Check your configured port number. For more information, see the application logs.
 [AppRunner] Deployment with ID : ID failed. Failure reason : Health check failed.

おそらくMySQLと接続できず、サーバーが起動できなかったため、ヘルスチェックが失敗したのだと思われます。

 File "<frozen importlib._bootstrap>", line 1126, in _find_and_load_unlocked
 File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
 File "<frozen importlib._bootstrap>", line 1204, in _gcd_import
 File "<frozen importlib._bootstrap>", line 1176, in _find_and_load
 File "<frozen importlib._bootstrap>", line 1140, in _find_and_load_unlocked
 ModuleNotFoundError: No module named 'api'

Docker定義ファイルを修正。

FROM python:3.11-buster
ENV PYTHONNUMBUFFERED=1

# WORKDIRをルートディレクトリに設定
WORKDIR /

RUN pip install poetry

# pyproject.tomlとpoetry.lockをコピー
COPY pyproject.toml* poetry.lock* ./

# Poetryの設定とインストール
RUN poetry config virtualenvs.in-project true
RUN if [ -f pyproject.toml ]; then poetry install --no-root; fi

# apiディレクトリをルートディレクトリにコピー
COPY ./api ./api

# ENTRYPOINTでapi.main:appを指定
ENTRYPOINT [ "poetry", "run", "uvicorn", "api.main:app", "--host", "0.0.0.0", "--reload"]

上記に修正すると、App Runnerの起動が成功し、立ち上がりました。

と一旦以上でFastAPIの学習を終えたいと思います。ECRやApp Runnerなど新しく使ったサービスもあり、色々動かせたことで見えてきたものもあるかなと思います。ただAIとFastAPIが近しいかと言われるとそうでもないので、その辺も踏まえながら自分のペースで一歩ずつ進んでいきたいと思います。ご精読頂きましてありがとうございました。一歩ずついきます。

Discussion