Open1
FastAPI + dynamoDB + Docker + EC2
regular update 通常更新時
git add . && git commit -m "regular update" && git push -u origin main
service execute サービスローカル実行
uvicorn main:app --reload
- request URL : http://127.0.0.1:8000/company/000001/ハイパーテック株式会社
- テスト
- コマンド
python test.py 000001 ハイパーテック株式会社
- Uvicorn FastAPI URL : http://127.0.0.1:8000/docs#/
実行結果
{'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 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:/docs
AWS DynamoDB
- DynamoDB → テーブル → テーブルの作成
- https://us-east-1.console.aws.amazon.com/dynamodbv2/home?region=us-east-1#create-table
- テーブル名 : company
- パーティションキー : id (String)
- ソートキー : name (String)
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