内容
◉趣旨目標
◉前回の記事からの続き。
◉現状の構成
◉作りたい構成
◉作りたい構成の細部
・VPCの作成
・セキュリティグループの設定
・ECRにイメージをプッシュ。
・ECS(クラスター)作成
・タスク定義
・サービスの作成
・【参考】タスクの実行
趣旨目標
前回の記事のアップデート。WindowsでDockerを構築し、MySQLを連携させてデータベースにレコードを追加することができたので、今回は、コンテナをAWS上のEC2,ECSを使用し、コンテナを設置、データベースにレコードを追加するところまで行う。
前回の記事からの続き。
前回の記事:
https://qiita.com/nikorasu277/items/18faba6be13a92628644
現状の構成
作りたい構成
作りたい構成の細部
VPCの作成
EC2インズタンス上でタスクを実行させるために先んじてVPCを作成。
今回はFargateではなく、EC2を使用する。
・作成するリソース「VPCなど。」
・名前タグ「keiji」
・IPv4 CIDR ブロック10.0.0.0/16
・マルチAZ
・パブリックサブネットを2つ。
・プラベートサブネットはなし。
・DNS解決を有効化(独自DNSを使用していない。)
セキュリティグループの設定
作成したVPCのセキュリティグループを設定する。
・インバウンド80番を解放
ECRにイメージをプッシュ。
ECRのリポジトリ作成
・可視性設定「プライベート」
・ローカルのDockerコンテナイメージのプッシュ。
AWS CLIがインストールされているか確認
aws --version
インストールされていない場合、AWS CLIをインストール。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html
AWS CLIのインストールが初回で、かつLinuxの場合
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
あとは、赤枠内をクリックし、指示に従って表示されているコマンドを素直にAWS CLIにそのままコピペする。
ここで初めてAWS CLIを使用する場合、次のエラーが返されます。
エラーで示されたとおり、AWS CLIで次のコマンドを実行して、アクセスキーとシークレットキーを入力してセットアップする必要があります。
【参考】アクセスキーとシークレットキーの作成方法:
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_CreateAccessKey_CLIAPI
※キーの作成はIAMのマネジメントコンソールからでも作成可能です。
aws configure
このコマンドを実行したら、順次キーを入力しましょう。
以下は私の場合です。
ローカルからAWS CLIによってログインするコマンド。
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 851725271515.dkr.ecr.us-east-1.amazonaws.com
ローカルにあるdockerfileに任意のタグ名を付けて、イメージをビルド。
※必ずdockerfileが存在するディレクトリで実行します。
find / -name Dockerfile
このコマンドを実行し、見つかった時点でコマンドの実行を停めてあげましょう。
docker build -t keiji-ecr .
ローカルで作成したイメージに名前付け。
docker tag keiji-ecr:latest 851725271515.dkr.ecr.us-east-1.amazonaws.com/keiji-ecr:latest
ローカルで作成したイメージをプッシュします。
docker push 851725271515.dkr.ecr.us-east-1.amazonaws.com/keiji-ecr:latest
こんな感じで流れます。
ECRのコンソールでアクションから、「イメージ」がプッシュできたか再確認できます。
ECS(クラスター)作成
タスク定義
・80番ポート開放
・起動タイプEC2を選択
・先程作成したイメージURIでコンテナ設定
・コンテナポート80番解放
・ネットワークモード awsvpc
・タスクロール、実行ロール ecsTaskExecutionRole
・ログ収集 チェックを外す。
サービスの作成
・先程作成したクラスターを選択
・ALBを選択
・必要なタスク「1」
・サービスタイプ「レプリカ」
・デプロイサーキットブレーカー 無効
【参考】タスクの実行
aws ecs run-task --cluster <クラスター名> --task-definition <タスク名> --network-configuration "awsvpcConfiguration={subnets=[subnet-1234567890,subnet-0987654321],securityGroups=[sg-1234567890],assignPublicIp=ENABLED}"
そもそも単発でのタスク実行はECSではなくAWS Lambdaと組み合わせて構成するのが最適なのかなと考えました。また、EC2かFargateの選択も要件に合わせて構成ですね。あと今回の場合DBへのレコード追加を手動でPythonコードを実行するコードなので、CI/CDと組み合わせてもっとアップグレードできそうですね!簡単にはできませんが(^^;勉強になりました。
では!