🐍

【AWS】Elastic Beanstalkを用いて、Docker+Djangoアプリケーションをデプロイする

に公開

AWS Elastic Beanstalkとは

AWSのアカウント作成

https://aws.amazon.com/jp/console/

IAMユーザーの作成

IAMユーザー作成手順


ユーザーの作成をクリック

AWS マネジメントコンソールへのユーザーアクセスを提供する - オプションをクリック

必要なポリシーを選択

ポリシーとは

【基本的なポリシー】

  • AmazonEC2FullAccess:EC2インスタンスの作成、削除、管理が可能。
  • AmazonS3FullAccess:S3バケットの作成、削除、データの読み書きが可能。
  • AmazonRDSFullAccess:データベースの作成、削除、設定変更が可能。
  • CloudWatchFullAccess:ログやメトリクスの監視が可能。
  • AWSCloudFormationFullAccess:インフラのコード化(IaC)を利用する場合。
  • IAMUserChangePassword:パスワード変更を許可(ユーザー自身で管理)。
  • AWSLambda_FullAccess:サーバーレスアプリケーションの開発が必要な場合。


ユーザーの作成をクリック

パスワードをメモしてユーザーリストに戻るをクリック

ログアウトする前にアカウントIDをメモしておく

サインアウトし、先ほどの情報を基にもう一度ログインを行う

新しいパスワードを設定し、パスワード変更の確認をクリック

作成したIAMユーザーでログインできていることを確認

ここまでで、IAMユーザーの作成と権限の付与とIAMユーザーでのログインまでが完了。

多要素認証(MFA)の有効化

多要素認証(MFA)の有効化の手順


セキュリティ認証情報をクリック

多要素認証欄のMFAデバイス割り当てをクリック

デバイス名の入力とデバイスオプションの選択を行う

QRコード表示させる

Google Authenticatorを開き+ボタンからQRコードを読みとり、Google Authenticator側に表示される6ケタの数字をMFAコード1と2に入力

ログアウトしてもう一度ログインしようとするとMFA認証が必要となる

ここまでで、IAMユーザーに対して多要素認証(MFA)の設定を行うまでが完了。

AWS Billing Dashboardの設定

作成中

AWS CLIのインストール

AWS CLIのインストール手順

以下のサイトからインストールする
https://aws.amazon.com/jp/cli/

インストール画面

ターミナルおよびパワーシェルにてインストールされたかを確認
$ aws --version
 aws-cli/2.22.22 Python/3.12.6 Windows/11 exe/AMD64
設定コマンドの実行
aws configure
以下の入力を求めれらるため、手順に沿って入力を行う。
AWS Access Key ID [None]: ➡ IAMユーザーのアクセスキーIDを入力
AWS Secret Access Key [None]: ➡ IAMユーザーのシークレットアクセスキーを入力
Default region name [None]: ➡ AWSリソースを操作する際のデフォルトのリージョンを指定(東京の場合ap-northeast-1)
Default output format [None]: ➡ コマンドの出力形式を指定(json/text/table)

アクセスキーとシークレットアクセスキーの取得手順


IAMユーザーからアクセスキーを作成をクリック

コマンドラインインターフェイス(CLI)を選択し、次へをクリック

タグ名を入力し、アクセスキーを作成をクリック

アクセスキーとシークレットアクセスキーをメモして完了をクリック

Pythonのインストール

Pythonのインストール手順

以下のサイトからインストールする
https://www.python.org/downloads/windows/

埋め込み可能とインストーラとあるが、インストーラを選択してインストール

「Add Python to PATH」のチェックボックスを選択

Pythonとpipがインストールされたかを確認
$ python --version
Python 3.12.8
$ pip --version
pip 24.3.1 from C:~

Elastic Beanstalk CLI (EB CLI) のインストール

EB CLIのインストール手順
pipコマンドでawsebcliをインストールする
pip install awsebcli
awsebcliがインストールされたかを確認
$ eb --version
EB CLI 3.21.0 

Elastic Beanstalkの環境セットアップ1

Elastic Beanstalkの環境セットアップ手順
プロジェクトフォルダのルートディレクトリにて実行し、プロジェクトの初期化を行う
eb init
リージョンの選択にて9(Tokyo)を選択する
$ eb init

Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-south-1 : Asia Pacific (Mumbai)
7) ap-southeast-1 : Asia Pacific (Singapore)
8) ap-southeast-2 : Asia Pacific (Sydney)
9) ap-northeast-1 : Asia Pacific (Tokyo)10) ap-northeast-2 : Asia Pacific (Seoul)
11) sa-east-1 : South America (Sao Paulo)
12) cn-north-1 : China (Beijing)
13) cn-northwest-1 : China (Ningxia)
14) us-east-2 : US East (Ohio)
15) ca-central-1 : Canada (Central)
16) eu-west-2 : EU (London)
17) eu-west-3 : EU (Paris)
18) eu-north-1 : EU (Stockholm)
19) eu-south-1 : EU (Milano)
20) ap-east-1 : Asia Pacific (Hong Kong)
21) me-south-1 : Middle East (Bahrain)
22) af-south-1 : Africa (Cape Town)
23) ap-southeast-3 : Asia Pacific (Jakarta)
24) ap-northeast-3 : Asia Pacific (Osaka)
Application Nameの設定(任意の名前を設定する)
Enter Application Name
(default is "practice"): practice
Application practice has been created.
dockerの使用の有無とどのプラットフォームを使用するかを選択する
It appears you are using Docker. Is this correct?
(Y/n): Y
Select a platform branch.
1) Docker running on 64bit Amazon Linux 2023(Amazon Linux 2023 上で Docker を実行する環境)
2) ECS running on 64bit Amazon Linux 2023(Amazon ECS上で Docker を実行する環境)
3) Docker running on 64bit Amazon Linux 2(Amazon Linux 2 上で Docker を実行する環境)
4) ECS running on 64bit Amazon Linux 2(Amazon ECS 上で Docker を実行する環境)
(default is 1): 3
SSH設定を行うか否かを選択するが基本的に(Y)で任意の名前を選択肢、passphraseは一旦空でEnterを押す
Cannot setup CodeCommit because there is no Source Control setup, continuing with initialization
$ Do you want to set up SSH for your instances?
(Y/n): Y
$ Type a keypair name.
(Default is aws-eb): aws-eb-practice
Generating public/private ed25519 key pair.
$ Enter passphrase (empty for no passphrase):
$ Enter same passphrase again:


C:user/.sshの中に安全に通信を行うためのSSHキーファイルが作成される

設定が完了するとconfig.ymlファイルが作成される

Elastic Beanstalkの環境セットアップ2

.ebignoreの作成と設定
.ebignoreの作成
New-Item .ebignore
node_modules/フォルダがあると[WinError 1920]が出現する可能性があるため、以下を追加
node_modules/
**/node_modules/
.git
.env
.elasticbeanstalkフォルダのconfig.ymlファイルの作成と設定
config.ymlの中身
branch-defaults:
  default:
    environment: practice-env
global:
  application_name: practice
  default_platform: Docker running on 64bit Amazon Linux 2
  default_region: ap-northeast-1
  include_git_submodules: true
  workspace_type: Application
option_settings:
  aws:autoscaling:asg:
    MaxSize: '4'
    MinSize: '1'
  aws:ec2:instances:
    InstanceTypes: t2.micro
  aws:elasticbeanstalk:environment:
    LoadBalancerType: application
    ServiceRole: aws-elasticbeanstalk-service-role

.ebextensionsフォルダとconfigファイルの作成と設定
.ebextensionsフォルダとconfigファイルの作成
mkdir .ebextensions
New-Item custom-settings.config (作成した.ebextensionsフォルダ配下で実行)
custom-settings.config
option_settings:
  aws:autoscaling:launchconfiguration:
    DisableIMDSv1: true
  aws:elasticbeanstalk:application:environment:
    DJANGO_SETTINGS_MODULE: "<アプリケーション名>.settings"
Resources:
  AWSEBV2LoadBalancerTargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      HealthCheckPath: /
      HealthCheckPort: 80

Elastic Beanstalkの環境作成

Elastic Beanstalkの環境作成
eb create <name> --platform "Docker running on 64bit Amazon Linux 2" --database.engine <DATABASE_NAME> --database.<USER_NAME> myprojectuser --database.password <PASSWORD>
出力結果
eb createを実行した際の出力結果
$ eb create practice-env    
Creating application version archive "app-241228_205613393339".
Uploading practice/app-241228_205613393339.zip to S3. This may take a while.
Upload Complete.
Environment details for: practice-env
  Application name: practice
  Region: ap-northeast-1
  Deployed Version: app-241228_205613393339
  Environment ID: e-vk9inikeiz
  Platform: arn:aws:elasticbeanstalk:ap-northeast-1::platform/Docker running on 64bit Amazon Linux 2/4.0.5
  Tier: WebServer-Standard-1.0
  CNAME: UNKNOWN
  Updated: 2024-12-28 11:56:20.318000+00:00
Printing Status:
2024-12-28 11:56:18    INFO    createEnvironment is starting.
2024-12-28 11:56:20    INFO    Using elasticbeanstalk-ap-northeast-1-216989139298 as Amazon S3 storage bucket for environment data.
2024-12-28 11:56:43    INFO    Created security group named: sg-021748b6a5edbd1ff
2024-12-28 11:56:59    INFO    Created target group named: arn:aws:elasticloadbalancing:ap-northeast-1:216989139298:targetgroup/awseb-AWSEB-MG296HDNXLBU/ac8fd7e25d417fe9
2024-12-28 11:56:59    INFO    Created security group named: awseb-e-vk9inikeiz-stack-AWSEBSecurityGroup-oYaJosHeU9Ts
2024-12-28 11:57:29    INFO    Created Auto Scaling group named: awseb-e-vk9inikeiz-stack-AWSEBAutoScalingGroup-aDsB2Wmk2dkt
2024-12-28 11:57:30    INFO    Waiting for EC2 instances to launch. This may take a few minutes.
2024-12-28 11:57:45    INFO    Created Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:216989139298:scalingPolicy:dd6bf999-1b8d-48f1-9fc6-5721de25587d:autoScalingGroupName/awseb-e-vk9inikeiz-stack-AWSEBAutoScalingGroup-aDsB2Wmk2dkt:policyName/awseb-e-vk9inikeiz-stack-AWSEBAutoScalingScaleUpPolicy-TsPZW0sfOxBn
2024-12-28 11:57:45    INFO    Created Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:216989139298:scalingPolicy:8b716d21-8e6b-4250-85ba-3ec1f3f0a0e8:autoScalingGroupName/awseb-e-vk9inikeiz-stack-AWSEBAutoScalingGroup-aDsB2Wmk2dkt:policyName/awseb-e-vk9inikeiz-stack-AWSEBAutoScalingScaleDownPolicy-LMenqbLtEHUG
2024-12-28 11:57:45    INFO    Created CloudWatch alarm named: awseb-e-vk9inikeiz-stack-AWSEBCloudwatchAlarmHigh-wYe8nHABb9sL
2024-12-28 11:57:45    INFO    Created CloudWatch alarm named: awseb-e-vk9inikeiz-stack-AWSEBCloudwatchAlarmLow-uvZaa7xlWl39
2024-12-28 11:59:51    INFO    Created load balancer named: arn:aws:elasticloadbalancing:ap-northeast-1:216989139298:loadbalancer/app/awseb--AWSEB-jx4OMs9TDLF0/0b2634c3551b55b0
2024-12-28 11:59:51    INFO    Created Load Balancer listener named: arn:aws:elasticloadbalancing:ap-northeast-1:216989139298:listener/app/awseb--AWSEB-jx4OMs9TDLF0/0b2634c3551b55b0/cd502a5f75845a3a
2024-12-28 12:01:25    INFO    Instance deployment completed successfully.
2024-12-28 12:01:32    INFO    Application available at practice-env.eba-m83cxqsm.ap-northeast-1.elasticbeanstalk.com.
2024-12-28 12:01:33    INFO    Successfully launched environment: practice-env
AWS CLI上で環境が作成されているかを確認する
$ eb list
* practice-env


AWSのコンソール画面でも作成されている

環境削除コマンド
terminateコマンドを実行
eb terminate <name> 

デプロイ

ローカルで作成したアプリケーションフォルダをElasticbeanstalkへデプロイ
eb deploy <name>
出力結果
$ eb deploy
Creating application version archive "app-241228_212140503858".
Uploading practice/app-241228_212140503858.zip to S3. This may take a while.
Upload Complete.
2024-12-28 12:21:45    INFO    Environment update is starting.      
2024-12-28 12:21:49    INFO    Deploying new version to instance(s).
2024-12-28 12:22:23    INFO    Instance deployment completed successfully.
2024-12-28 12:22:29    INFO    New application version was deployed to running EC2 instances.
2024-12-28 12:22:29    INFO    Environment update completed successfully.

EC2インスタンスへSSH接続

SSHアクセスするためのキーを選択
eb ssh --setup practice-env --timeout 10
出力結果
eb ssh --setup practice-env --timeout 10 
WARNING: You are about to setup SSH for environment "practice-env". If you continue, your existing instances will have to be **terminated** and new instances will be created. The environment will be temporarily unavailable.
To confirm, type the environment name: practice-env

Select a keypair.
1) aws-eb-practice
2) [ Create new KeyPair ]
(default is 1): 1

Printing Status:
2024-12-29 05:11:42    INFO    Environment update is starting.      
2024-12-29 05:11:52    INFO    Updating environment practice-env's configuration settings.
2024-12-29 05:12:08    INFO    Auto Scaling group update progress: Rolling update initiated. Terminating 1 obsolete instance(s) in batches of 1, while keeping at least 1 instance(s) in service. Waiting on resource signals with a timeout of PT30M when new instances are added to the autoscaling group.
2024-12-29 05:12:08    INFO    Auto Scaling group update progress: Temporarily setting autoscaling group MinSize and DesiredCapacity to 2.  
2024-12-29 05:12:40    INFO    Auto Scaling group update progress: New instance(s) added to autoscaling group - Waiting on 1 resource signal(s) with a timeout of PT30M.
2024-12-29 05:17:03    INFO    Still waiting for the following 1 instances to become healthy: [i-0dfda254b57db3cdb].

ERROR: TimeoutError - The EB CLI timed out after 10 minute(s). The operation might still be running. To keep viewing events, run 'eb events -f'. To set timeout duration, use '--timeout MINUTES'.
SSH接続
eb ssh practice-env
出力結果
SSH接続を実施
$ eb ssh practice-env

Select an instance to ssh into
1) i-0d1b637bb424c9d35
2) i-0a9e095b5fa856dbb
(default is 1): 2

INFO: Running ssh -i C:\Users\.ssh\aws-eb-practice -o IdentitiesOnly yes ec2-user@54.178.88.166
The authenticity of host '54.178.88.166 (54.178.88.166)' can't be established.
ED25519 key fingerprint is SHA256:vBOk0X4E1lAmfASn+uDn4TP9x5+nSFcZhdRCFg8Pf8Y.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '54.178.88.166' (ED25519) to the list of known hosts.
  _____ _           _   _      ____                       _        _ _
 | ____| | __   ___| |_(_) ___| __ )  ___  __ _ _ __  ___| |_ __ _| | | __
 |  _| | |/ _ \/ __| __| |/ __|  _ \ / _ \/ _\ | '_ \/ __| __/ _\ | | |/ /
 | |___| | (_| \__ \ |_| | (__| |_) |  __/ (_| | | | \__ \ || (_| | |   <
 |_____|_|\__,_|___/\__|_|\___|____/ \___|\__,_|_| |_|___/\__\__,_|_|_|\_\

 Amazon Linux 2 AMI

 This EC2 instance is managed by AWS Elastic Beanstalk. Changes made via SSH
 WILL BE LOST if the instance is replaced by auto-scaling. For more information
 on customizing your Elastic Beanstalk environment, see our documentation here:
 http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html
環境の状態を確認したい場合
環境の状態を確認、URIの確認
eb status <name>
出力結果
$ eb status
Environment details for: practice-env
  Application name: practice
  Region: ap-northeast-1
  Deployed Version: app-241228_212140503858
  Environment ID: e-vk9inikeiz
  Platform: arn:aws:elasticbeanstalk:ap-northeast-1::platform/Docker running on 64bit Amazon Linux 2/4.0.5
  Tier: WebServer-Standard-1.0
  CNAME: practice-env.eba-m83cxqsm.ap-northeast-1.elasticbeanstalk.com
  Updated: 2024-12-28 12:22:29.419000+00:00
  Status: Ready
  Health: Red
logの確認
eb logs <name>
出力結果
$ eb logs
Retrieving logs...
============= i-0bd0b3e0441c90c53 ==============
----------------------------------------
/var/log/docker
----------------------------------------
Dec 28 11:57:39 ip-172-31-35-56 docker: time="2024-12-28T11:57:39.959741114Z" level=info msg="Starting up"
Dec 28 11:57:40 ip-172-31-35-56 docker: time="2024-12-28T11:57:40.222770101Z" level=info msg="Loading containers: start."
Dec 28 11:57:40 ip-172-31-35-56 docker: time="2024-12-28T11:57:40.473880616Z" level=info msg="Loading containers: done."
Dec 28 11:57:40 ip-172-31-35-56 docker: time="2024-12-28T11:57:40.501795114Z" level=info msg="Docker daemon" commit=b08a51f containerd-snapshotter=false storage-driver=overlay2 version=25.0.6
Dec 28 11:57:40 ip-172-31-35-56 docker: time="2024-12-28T11:57:40.502818896Z" level=info msg="Daemon has completed initialization"
Dec 28 11:57:40 ip-172-31-35-56 docker: time="2024-12-28T11:57:40.552188504Z" level=info msg="API listen on /run/docker.sock"

EC2インスタンス内でコンテナ起動

デプロイしたファイルがあるディレクトリへ移動する
sudo mkdir -p /var/app/current
sudo chown -R ec2-user:ec2-user /var/app/current
cd /var/app/current
出力結果
接続成功すれば、以下のように表示がされる
[ec2-user@ip-172-31-14-196 current]$ 
コンテナの起動状況を確認する
sudo docker ps
出力結果
docker-compose.ymlで定義したコンテナが起動しているかを確認する
[ec2-user@ip-172-31-34-118 current]$ sudo docker ps
CONTAINER ID   IMAGE         COMMAND                  CREATED         STATUS         PORTS                                       NAMES
d5a28f5f4be3   current-web   "python manage.py ru…"   3 minutes ago   Up 3 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp           web2
db9cf3c7d6e4   postgres:15   "docker-entrypoint.s…"   3 minutes ago   Up 3 minutes   0.0.0.0:5432->5432/tcp, :::5432->5432/tcp   db2
[ec2-user@ip-172-31-34-118 current]$ docker-compose exec web python manag

コンテナ内でマイグレーションの実行

sudo docker-compose exec web python manage.py migrate
sudo docker-compose exec web python manage.py collectstatic

ブラウザに表示

ebコマンド
eb open <name>


ドメインをクリック

その他

EC2インスタンス内へのインストールコマンド一覧
Python
sudo yum install python3 -y
Docker
sudo yum install -y docker
Docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/${VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose)
ローカルでの接続状況の確認
Windows
Invoke-WebRequest -Uri http://127.0.0.1:<ポート番号> -Verbose
Linux
curl -vvv http://127.0.0.1:<ポート番号>
RDSのエンドポイント取得
RDSのエンドポイント取得
aws rds describe-db-instances --query "DBInstances[*].Endpoint.Address"
現状の環境を確認したい場合(★)
eb 環境内の環境設定を確認したい場合(コンテナに入った状態で)
env

参考

https://awstut.com/2023/10/01/introduction-to-elastic-beanstalk-with-cloudformation/

Discussion