Open1

FastAPI + dynamoDB + Docker + EC2

Teru roomTeru room

regular update 通常更新時

git add . && git commit -m "regular update" && git push -u origin main

service execute サービスローカル実行

uvicorn main:app --reload
実行結果
{'job_posting': {'skill': {'technology': {'level': {'scale': {'small': True, 'middle': True, 'proto_rd': True, 'large': True}}, 'set': {'front_end': {'language': {'Java': Decimal('4'), 'Python': Decimal('3')}, 'dev_process': {'waterfall': True, 'agile': True}, 'framework': {'Spring Boot': Decimal('4'), 'Django': Decimal('3')}, 'up_down_process': {'req_def': True, 'base_design': True, 'Installation': True, 'up_down_process': True, 'interface_test': True, 'unit_test': True, 'deploy_release': True, 'system_test': True, 'detail_design': True, 'manage': True}, 'other_tool': Decimal('3'), 'management': {'people_mgmt': True, 'project_mgmt': True, 'project_lead': True}}}}}}, 'id': '000001', 'name': 'ハイパーテック株式会社', 'overview': {'num_of_emp': Decimal('25'), 'mis_vis_val': 'UPDATE JAPAN 情報技術のチカラで、日本をもっと便利に。世界で一番、便利な国へ。', 'capital': Decimal('220000000'), 'rep_name': '配牌 手久吉', 'biz_details': '異次元のIT領域のハイパーテクノロジーを構築・展開', 'house_number': '1-20-2 南青山ハイパービル10階', 'establish_yyyy-mm-dd': '2019-04-01', 'zip_code': '107-0062', 'pref_name': '東京都', 'city_name': '港区', 'town_name': '南青山', 'hp_url': 'http://www.hyper-tech.co.jp/', 'tel': '042-403-9166'}}

AWS CLI 環境表示

cat ~/.aws/config
実行結果
[default]
region = us-east-1
aws_access_key_id = XXXXXXXXXXXXXXXX
aws_secret_access_key = aaaaaaaaaaaaaaaaaaaaaaaaaaaa

[profile myapp]
region = us-east-1
aws_access_key_id = XXXXXXXXXXXXXXXX
aws_secret_access_key = aaaaaaaaaaaaaaaaaaaaaaaaaaaa

[profile usprod]
region = us-east-1
aws_access_key_id = XXXXXXXXXXXXXXXX
aws_secret_access_key = aaaaaaaaaaaaaaaaaaaaaaaaaaaa

[profile prod]
region = us-east-1
aws_access_key_id = XXXXXXXXXXXXXXXX 
aws_secret_access_key = aaaaaaaaaaaaaaaaaaaaaaaaaaaa

[profile dev]
region = us-east-1
aws_access_key_id = YYYYYYYYYYYYYYYYY
aws_secret_access_key = bbbbbbbbbbbbbbbbbbbbbbbbbbb

Dockerイメージをビルドする

  • Dockerfile
    FROM --platform=linux/amd64 tiangolo/uvicorn-gunicorn-fastapi:python3.11
    #FROM --platform=linux/amd64 python:3.11.4-slim-buster
    
    # 作業ディレクトリを設定する
    WORKDIR /app
    
    # 既存のディレクトリを削除
    RUN rm -rf /app/*
    
    # 必要なパッケージをインストールする
    RUN apt-get update && apt-get install -y git
    ADD "https://www.random.org/cgi-bin/randbyte?nbytes=10&format=h" /dev/null
    RUN git clone https://ghp_XXXXXXXXXXXXXXXX@github.com/foobaa/mongodb.git .
    RUN pip install --upgrade pip
    RUN pip3 install -r requirements.txt
    RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt
    
    # アプリケーションを実行する
    ENV AWS_DEFAULT_REGION=us-east-1
    ENV AWS_ACCESS_KEY_ID=AAAAAAAAAAAAAAAAAAAA
    ENV AWS_SECRET_ACCESS_KEY=YYYYYYYYYYYYYYYYYYYYYYYYYYY
    CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]
    
  • ビルドコマンド
    docker build -t company-fastapi-app .
    

コンテナを実行する

  • 実行コマンド
    docker run --platform linux/amd64 -d -p 80:80 --name company-fastapi-container company-fastapi-app
    

CI/CD用シェルスクリプトファイルを作る

  • シェルスクリプトファイルcicd.sh
    git add . && git commit -m "regular update" && git push -u origin main
    echo 'docker stop $(docker ps -a -q --filter ancestor=company-fastapi-app --format="{{.ID}}")
    docker rm $(docker ps -a -q --filter ancestor=company-fastapi-app --format="{{.ID}}")
    docker rmi $(docker images company-fastapi-app --format "{{.ID}}")
    docker rmi -f $(docker images -q)
    docker ps -a && docker images
    cd ~/aws/mongodb/
    docker build -t registlogin .
    docker run --platform linux/amd64 -d -p 80:80 --name company-fastapi-container company-fastapi-app' > cicd.sh
    chmod +x cicd.sh 
    
  • 実行する
    ./cicd.sh
    

FastAPIサービスを参照する

http://localhost:80/docs

AWS DynamoDB

create new repository

git init
git add .
git commit -m "first commit"
git branch -M main
git remote add origin https://ghp_BBBBBBBBBBBBBBBBBBBBBBB@github.com/foobaa/mongodb.git
git push -u origin main

create python venv

python3 -m venv venv
cat venv/pyvenv.cfg 
source venv/bin/activate
pip install --upgrade pip
touch requirements.txt;vim requirements.txt
pip install -r requirements.txt
  • requirements.txt
fastapi
uvicorn
typing
boto3
  • confirm python env
cat venv/pyvenv.cfg 
which python
  • result
home = /opt/homebrew/opt/python@3.11/bin
include-system-site-packages = false
version = 3.11.6
executable = /opt/homebrew/Cellar/python@3.11/3.11.6_1/Frameworks/Python.framework/Versions/3.11/bin/python3.11
command = /opt/homebrew/opt/python@3.11/bin/python3.11 -m venv /Users/sharl/aws/mongodb/venv
/Users/sharl/aws/mongodb/venv/bin/python

AWS Command set up

  • refer to config
cat ~/.aws/config
grep '\[profile' ~/.aws/config | cut -d ' ' -f2 | tr -d ']'
  • result
[default]
region = us-east-1

[profile dev]
region = us-east-1
aws_access_key_id = UUUUUUUUUUUUUUU
aws_secret_access_key = ssssssssssssssssssssssssss

[profile prod]
region = us-east-1
aws_access_key_id = XXXXXXXXXXXXXXXX 
aws_secret_access_key = aaaaaaaaaaaaaaaaaaaaaaaaaaaa
dev
prod
  • set AWS config to prod
export AWS_PROFILE=prod
  • refer current config
aws configure list
  • result
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                     prod              env    ['AWS_PROFILE', 'AWS_DEFAULT_PROFILE']
access_key     ****************LL6D      config-file    
secret_key     ****************fMv7      config-file    
    region           us-east-1     config-file    ~/.aws/config

create table

company table

  • put item from json file
aws dynamodb put-item --table-name company --item file://company/000001.json --profile prod  --region us-east-1
aws dynamodb put-item --table-name company --item file://company/000002.json --profile prod  --region us-east-1
aws dynamodb put-item --table-name company --item file://company/000003.json --profile prod  --region us-east-1
aws dynamodb put-item --table-name company --item file://company/000004.json --profile prod  --region us-east-1
aws dynamodb put-item --table-name company --item file://company/000005.json --profile prod  --region us-east-1
aws dynamodb put-item --table-name company --item file://company/000006.json --profile prod  --region us-east-1
  • get item
aws dynamodb get-item --table-name company --key '{"id": {"S": "000001"}, "name": {"S": "ハイパーテック株式会社"}}' --profile prod
aws dynamodb get-item --table-name company --key '{"id": {"S": "000002"}, "name": {"S": "株式会社サンカク"}}' --profile prod
aws dynamodb get-item --table-name company --key '{"id": {"S": "000003"}, "name": {"S": "ループテック株式会社"}}' --profile prod
aws dynamodb get-item --table-name company --key '{"id": {"S": "000004"}, "name": {"S": "株式会社ドルファクトリー"}}' --profile prod
aws dynamodb get-item --table-name company --key '{"id": {"S": "000005"}, "name": {"S": "株式会社アクストリーム"}}' --profile prod
aws dynamodb get-item --table-name company --key '{"id": {"S": "000006"}, "name": {"S": "株式会社システムノーツ"}}' --profile prod

job_description table

  • put item from json file
aws dynamodb put-item --table-name job_description --item file://job_description/B00004.json --profile myapp  --region us-east-1
aws dynamodb put-item --table-name job_description --item file://job_description/B00005.json --profile myapp  --region us-east-1
  • get item
aws dynamodb get-item --table-name job_description --key '{"company_ID": {"S": "B00004"}, "JD_Number": {"S": "01"}}'  --profile myapp  --region us-east-1
  • delete item
    aws dynamodb delete-itemコマンドを使用してレコードを削除できます。以下に例を示します。

以下の例では、job_descriptionテーブルのレコードを削除します。

aws dynamodb delete-item \
    --table-name job_description \
    --key '{"company_ID": {"S": "B00004"}, "JD_Number": {"S": "01"}}' \
    --profile myapp \
    --region us-east-1

パラメータの説明

  • --table-name: テーブル名を指定します。
  • --key: 削除するアイテムのキーを指定します。
  • --profile: 使用するAWSプロファイルを指定します。
  • --region: 使用するAWSリージョンを指定します。
    aws dynamodb delete-item \
      --table-name job_description \
      --key '{"company_ID": {"S": "B00004"}, "JD_Number": {"S": "01"}}' \
      --profile myapp \
      --region us-east-1
    
  • update item
    • --table-name: テーブル名を指定します。
    • --key: 更新するアイテムのキーを指定します。
    • --update-expression: 更新する内容を指定します。ここでは、attribute_nameをnew_valueに設定しています。
    • --expression-attribute-names: 属性名のプレースホルダーを指定します。ここでは、#attrNameがattribute_nameを指します。
    • --expression-attribute-values: 属性値のプレースホルダーを指定します。ここでは、:attrValueがnew_valueを指します。
    • --profile: 使用するAWSプロファイルを指定します。
    • --region: 使用するAWSリージョンを指定します。
    aws dynamodb update-item \
        --table-name job_description \
        --key '{"company_ID": {"S": "B00004"}, "JD_Number": {"S": "01"}}' \
        --update-expression "SET #attrName = :attrValue" \
        --expression-attribute-names '{"#attrName": "attribute_name"}' \
        --expression-attribute-values '{":attrValue": {"S": "new_value"}}' \
        --profile myapp \
        --region us-east-1