【AWS】Elastic Beanstalkを用いて、Docker+Djangoアプリケーションをデプロイする
AWS Elastic Beanstalkとは
AWSのアカウント作成
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のインストール手順
以下のサイトからインストールする
インストール画面
$ 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のインストール手順
以下のサイトからインストールする
埋め込み可能とインストーラとあるが、インストーラを選択してインストール
「Add Python to PATH」のチェックボックスを選択
$ python --version
Python 3.12.8
$ pip --version
pip 24.3.1 from C:~
Elastic Beanstalk CLI (EB CLI) のインストール
EB CLIのインストール手順
pip install awsebcli
$ eb --version
EB CLI 3.21.0
Elastic Beanstalk
の環境セットアップ1
Elastic Beanstalkの環境セットアップ手順
eb init
$ 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)
Enter Application Name
(default is "practice"): practice
Application practice has been created.
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
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の作成と設定
New-Item .ebignore
node_modules/
**/node_modules/
.git
.env
.elasticbeanstalkフォルダの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ファイルの作成と設定
mkdir .ebextensions
New-Item custom-settings.config (作成した.ebextensionsフォルダ配下で実行)
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
の環境作成
eb create <name> --platform "Docker running on 64bit Amazon Linux 2" --database.engine <DATABASE_NAME> --database.<USER_NAME> myprojectuser --database.password <PASSWORD>
出力結果
$ 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
$ eb list
* practice-env
AWSのコンソール画面でも作成されている
環境削除コマンド
eb terminate <name>
デプロイ
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接続
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'.
eb ssh practice-env
出力結果
$ 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
環境の状態を確認したい場合
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
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
出力結果
[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 open <name>
ドメインをクリック
その他
EC2インスタンス内へのインストールコマンド一覧
sudo yum install python3 -y
sudo yum install -y docker
sudo curl -L "https://github.com/docker/compose/releases/download/${VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose)
ローカルでの接続状況の確認
Invoke-WebRequest -Uri http://127.0.0.1:<ポート番号> -Verbose
curl -vvv http://127.0.0.1:<ポート番号>
RDSのエンドポイント取得
aws rds describe-db-instances --query "DBInstances[*].Endpoint.Address"
現状の環境を確認したい場合(★)
env
参考
Discussion