◆Agenda
1.ハンズオン概要
2.ハンズオンを始める前に・・・
3.ハンズオン環境準備
4.ECSクラスター設定
5.ECSタスク設定
6.ECSサービス設定
7.ALBエンドポイントへの接続
8.WordPressの設定
1.ハンズオン概要
◆概要
- このECSハンズオンは、Dockerの公式ドキュメントで紹介している「クイックスタート:ComposeとWordPress」の構成について、ECSとRDSを使用して構築する内容になっています。
基礎知識としてのDockerについては触れません。
参考:Dockerについて知りたい方
Dockerについて知りたい方は、下記リンクを参照してみてください。【図解】Dockerの全体像を理解する -前編-
【図解】Dockerの全体像を理解する -中編-
【図解】Dockerの全体像を理解する -後編-
2.ハンズオンを始める前に・・・
確認事項①
-
会場設置のWi-Fiへ接続願います。
※インターネットへの接続を前提としています。 -
AWSアカウントの準備はお済みですか?
※ハンズオン開始前までに準備願います。
作成手順:https://aws.amazon.com/jp/register-flow/
確認事項②
- AWSマネジメントコンソールにログインして、東京リージョンになっている事を確認してください。
確認事項③
- ハンズオン終了後の操作について
※使用したEC2・ALB・RDS・ECSは、AWSの課金対象になります。
必要ない場合は、削除してください。
[ECSクラスター(クラシックコンソール)削除方法]
[ECSクラスター(新しいコンソール)削除方法]
[ECSタスク定義の登録解除方法]
[Cloudformation削除方法]
3.ハンズオン環境の準備
【ハンズオンの構成図】
3-1.ECSハンズオン環境構築のCloudFormationの実行
- 下記リンクをクリックします。
参考:CloudFormationテンプレート内容
このブログにあるテンプレートからカスタマイズしました。
https://aws.amazon.com/jp/blogs/news/running-wordpress-amazon-ecs-fargate-ecs/
---
#*******************************************************************************
#* 【テンプレート名】:ECS hands on
#* 【作成者】 :JAWS-UG NAGOYA
#* 【作成日】 :2022/05/22
#*******************************************************************************
AWSTemplateFormatVersion: "2010-09-09"
Description: "VPC, NAT Gateway, RDS for MySQL, ALB Create 2022-05-27"
Parameters:
VPCName:
Description: The name of the VPC being created.
Type: String
Default: "ECS-hands-on"
RDSMasterUserName:
Description: The name of the RDS Master User created.
Type: String
Default: "admin"
RDSMasterUserPassword:
Description: The password of the RDS Master User created.
Type: String
Default: "password"
#*******************************************************************************
#* マッピング定義
#* テンプレートの各種設定値を定義する。
#* VPC CIDR :VPC のIPアドレス空間を定義
#* Public0 :Public subnet 0 のIPアドレス空間を定義
#* Public1 :Public subnet 1 のIPアドレス空間を定義
#* Private0 :Private subnet 0 のIPアドレス空間を定義
#* Private1 :Private subnet 1 のIPアドレス空間を定義
#* AZRegions:各リージョンのアベイラビリティゾーンを定義
#* - 東京リージョン ap-northeast-1a, ap-northeast-1c
#* - 大阪リージョン ap-northeast-3a, ap-northeast-3b
#* - バージニア北部リージョン us-east-1a, us-east-1c
#*******************************************************************************
Mappings:
SubnetConfig:
VPC:
CIDR: "10.0.0.0/16"
Public0:
CIDR: "10.0.0.0/24"
Public1:
CIDR: "10.0.1.0/24"
Private0:
CIDR: "10.0.2.0/24"
Private1:
CIDR: "10.0.3.0/24"
# This mapping accounts for the scenario when certain AZs
# are not available to use (this differs on a per account
# per customer basis). E.g., if the 'b' AZ is not available
# in a specific region in one's account then updating the
# list contained in the mapping below here will allow a
# different AZ to be chosen.
AZRegions:
ap-northeast-1:
AZs: ["a", "c"]
ap-northeast-3:
AZs: ["a", "b"]
us-east-1:
AZs: ["a", "b"]
#*******************************************************************************
#* リソース設定
#*******************************************************************************
Resources:
# 仮想プライベートネットワーク設定
VPC:
Type: "AWS::EC2::VPC"
Properties:
EnableDnsSupport: "true"
EnableDnsHostnames: "true"
CidrBlock:
Fn::FindInMap:
- "SubnetConfig"
- "VPC"
- "CIDR"
Tags:
-
Key: "Application"
Value:
Ref: "AWS::StackName"
-
Key: "Network"
Value: "Public"
-
Key: "Name"
Value: !Ref 'VPCName'
# パブリックサブネットワーク設定(インターネット公開用)
PublicSubnet0:
Type: "AWS::EC2::Subnet"
Properties:
VpcId:
Ref: "VPC"
AvailabilityZone:
Fn::Sub:
- "${AWS::Region}${AZ}"
- AZ: !Select [ 0, !FindInMap [ "AZRegions", !Ref "AWS::Region", "AZs" ] ]
CidrBlock:
Fn::FindInMap:
- "SubnetConfig"
- "Public0"
- "CIDR"
MapPublicIpOnLaunch: "true"
Tags:
-
Key: "Application"
Value:
Ref: "AWS::StackName"
-
Key: "Network"
Value: "Public"
-
Key: "Name"
Value: !Join
- ''
- - !Ref "VPCName"
- '-public-'
- !Select [ 0, !FindInMap [ "AZRegions", !Ref "AWS::Region", "AZs" ] ]
PublicSubnet1:
Type: "AWS::EC2::Subnet"
Properties:
VpcId:
Ref: "VPC"
AvailabilityZone:
Fn::Sub:
- "${AWS::Region}${AZ}"
- AZ: !Select [ 1, !FindInMap [ "AZRegions", !Ref "AWS::Region", "AZs" ] ]
CidrBlock:
Fn::FindInMap:
- "SubnetConfig"
- "Public1"
- "CIDR"
MapPublicIpOnLaunch: "true"
Tags:
-
Key: "Application"
Value:
Ref: "AWS::StackName"
-
Key: "Network"
Value: "Public"
-
Key: "Name"
Value: !Join
- ''
- - !Ref "VPCName"
- '-public-'
- !Select [ 1, !FindInMap [ "AZRegions", !Ref "AWS::Region", "AZs" ] ]
# プライベートサブネットワーク設定(インターネット非公開用)
PrivateSubnet0:
Type: "AWS::EC2::Subnet"
Properties:
VpcId:
Ref: "VPC"
AvailabilityZone:
Fn::Sub:
- "${AWS::Region}${AZ}"
- AZ: !Select [ 0, !FindInMap [ "AZRegions", !Ref "AWS::Region", "AZs" ] ]
CidrBlock:
Fn::FindInMap:
- "SubnetConfig"
- "Private0"
- "CIDR"
Tags:
-
Key: "Application"
Value:
Ref: "AWS::StackName"
-
Key: "Network"
Value: "Private"
-
Key: "Name"
Value: !Join
- ''
- - !Ref "VPCName"
- '-private-'
- !Select [ 0, !FindInMap [ "AZRegions", !Ref "AWS::Region", "AZs" ] ]
PrivateSubnet1:
Type: "AWS::EC2::Subnet"
Properties:
VpcId:
Ref: "VPC"
AvailabilityZone:
Fn::Sub:
- "${AWS::Region}${AZ}"
- AZ: !Select [ 1, !FindInMap [ "AZRegions", !Ref "AWS::Region", "AZs" ] ]
CidrBlock:
Fn::FindInMap:
- "SubnetConfig"
- "Private1"
- "CIDR"
Tags:
-
Key: "Application"
Value:
Ref: "AWS::StackName"
-
Key: "Network"
Value: "Private"
-
Key: "Name"
Value: !Join
- ''
- - !Ref "VPCName"
- '-private-'
- !Select [ 1, !FindInMap [ "AZRegions", !Ref "AWS::Region", "AZs" ] ]
# インターネットゲートウェイ設定
InternetGateway:
Type: "AWS::EC2::InternetGateway"
Properties:
Tags:
-
Key: "Application"
Value:
Ref: "AWS::StackName"
-
Key: "Network"
Value: "Public"
-
Key: "Name"
Value: !Join
- ''
- - !Ref "VPCName"
- '-IGW'
# インターネットゲートウェイをVPCに割り当て
GatewayToInternet:
Type: "AWS::EC2::VPCGatewayAttachment"
Properties:
VpcId:
Ref: "VPC"
InternetGatewayId:
Ref: "InternetGateway"
# パブリックサブネット用ルーティングテーブル設定
PublicRouteTable:
Type: "AWS::EC2::RouteTable"
Properties:
VpcId:
Ref: "VPC"
Tags:
-
Key: "Application"
Value:
Ref: "AWS::StackName"
-
Key: "Network"
Value: "Public"
-
Key: "Name"
Value: !Join
- ''
- - !Ref "VPCName"
- '-public-route-table'
PublicRoute:
Type: "AWS::EC2::Route"
DependsOn: "GatewayToInternet"
Properties:
RouteTableId:
Ref: "PublicRouteTable"
DestinationCidrBlock: "0.0.0.0/0"
GatewayId:
Ref: "InternetGateway"
# ルートテーブルをパブリックサブネットに割り当て
PublicSubnetRouteTableAssociation0:
Type: "AWS::EC2::SubnetRouteTableAssociation"
Properties:
SubnetId:
Ref: "PublicSubnet0"
RouteTableId:
Ref: "PublicRouteTable"
PublicSubnetRouteTableAssociation1:
Type: "AWS::EC2::SubnetRouteTableAssociation"
Properties:
SubnetId:
Ref: "PublicSubnet1"
RouteTableId:
Ref: "PublicRouteTable"
# パブリックサブネット用ネットワークACL設定
PublicNetworkAcl:
Type: "AWS::EC2::NetworkAcl"
Properties:
VpcId:
Ref: "VPC"
Tags:
-
Key: "Application"
Value:
Ref: "AWS::StackName"
-
Key: "Network"
Value: "Public"
-
Key: "Name"
Value: !Join
- ''
- - !Ref "VPCName"
- '-public-nacl'
InboundHTTPPublicNetworkAclEntry:
Type: "AWS::EC2::NetworkAclEntry"
Properties:
NetworkAclId:
Ref: "PublicNetworkAcl"
RuleNumber: "100"
Protocol: "-1"
RuleAction: "allow"
Egress: "false"
CidrBlock: "0.0.0.0/0"
PortRange:
From: "0"
To: "65535"
OutboundPublicNetworkAclEntry:
Type: "AWS::EC2::NetworkAclEntry"
Properties:
NetworkAclId:
Ref: "PublicNetworkAcl"
RuleNumber: "100"
Protocol: "-1"
RuleAction: "allow"
Egress: "true"
CidrBlock: "0.0.0.0/0"
PortRange:
From: "0"
To: "65535"
# ネットワークACLをパブリックサブネットに割り当て
PublicSubnetNetworkAclAssociation0:
Type: "AWS::EC2::SubnetNetworkAclAssociation"
Properties:
SubnetId:
Ref: "PublicSubnet0"
NetworkAclId:
Ref: "PublicNetworkAcl"
PublicSubnetNetworkAclAssociation1:
Type: "AWS::EC2::SubnetNetworkAclAssociation"
Properties:
SubnetId:
Ref: "PublicSubnet1"
NetworkAclId:
Ref: "PublicNetworkAcl"
# プライベートサブネット用NAT Gateway設定
ElasticIP0:
Type: "AWS::EC2::EIP"
Properties:
Domain: "vpc"
NATGateway0:
Type: "AWS::EC2::NatGateway"
Properties:
AllocationId:
Fn::GetAtt:
- "ElasticIP0"
- "AllocationId"
SubnetId:
Ref: "PublicSubnet0"
# NAT Gatewayを冗長化する場合は、以下のコメントを外してください。
# ElasticIP1:
# Type: "AWS::EC2::EIP"
# Properties:
# Domain: "vpc"
# NATGateway1:
# Type: "AWS::EC2::NatGateway"
# Properties:
# AllocationId:
# Fn::GetAtt:
# - "ElasticIP1"
# - "AllocationId"
# SubnetId:
# Ref: "PublicSubnet1"
# プライベートネットワーク用ルーティングテーブル設定
PrivateRouteTable0:
Type: "AWS::EC2::RouteTable"
Properties:
VpcId:
Ref: "VPC"
Tags:
-
Key: "Name"
Value: !Join
- ''
- - !Ref "VPCName"
- '-private-route-table-0'
PrivateRouteTable1:
Type: "AWS::EC2::RouteTable"
Properties:
VpcId:
Ref: "VPC"
Tags:
-
Key: "Name"
Value: !Join
- ''
- - !Ref "VPCName"
- '-private-route-table-1'
PrivateRouteToInternet0:
Type: "AWS::EC2::Route"
Properties:
RouteTableId:
Ref: "PrivateRouteTable0"
DestinationCidrBlock: "0.0.0.0/0"
NatGatewayId:
Ref: "NATGateway0"
# NAT Gatewayを冗長化する場合は、NatGatewayIDの設定を
# NATGateway0 => NATGateway1 に修正してください。
PrivateRouteToInternet1:
Type: "AWS::EC2::Route"
Properties:
RouteTableId:
Ref: "PrivateRouteTable1"
DestinationCidrBlock: "0.0.0.0/0"
NatGatewayId:
Ref: "NATGateway0"
# ルートテーブルをプライベートサブネットに割り当て
PrivateSubnetRouteTableAssociation0:
Type: "AWS::EC2::SubnetRouteTableAssociation"
Properties:
SubnetId:
Ref: "PrivateSubnet0"
RouteTableId:
Ref: "PrivateRouteTable0"
PrivateSubnetRouteTableAssociation1:
Type: "AWS::EC2::SubnetRouteTableAssociation"
Properties:
SubnetId:
Ref: "PrivateSubnet1"
RouteTableId:
Ref: "PrivateRouteTable1"
# EFSを使用する場合は、以下のコメントを外してください。
# FileSystem:
# Type: AWS::EFS::FileSystem
# Properties:
# Encrypted: true
# FileSystemTags:
# - Key: Name
# Value: Wordpress-demo
# PerformanceMode: generalPurpose
# ThroughputMode: bursting
# MountTargetSecurityGroup:
# Type: AWS::EC2::SecurityGroup
# Properties:
# GroupDescription: FileSystem Security Group
# VpcId: !Ref VPC
# GroupName: Wordpress-Demo-EFS-SG
# SecurityGroupIngress:
# - IpProtocol: "tcp"
# FromPort: 2049
# ToPort: 2049
# CidrIp: 10.0.0.0/16
# MountTarget1:
# Type: AWS::EFS::MountTarget
# Properties:
# FileSystemId: !Ref FileSystem
# SubnetId: !Ref PrivateSubnet0
# SecurityGroups:
# - !Ref MountTargetSecurityGroup
# MountTarget2:
# Type: AWS::EFS::MountTarget
# Properties:
# FileSystemId: !Ref FileSystem
# SubnetId: !Ref PrivateSubnet1
# SecurityGroups:
# - !Ref MountTargetSecurityGroup
# AccessPoint:
# Type: AWS::EFS::AccessPoint
# Properties:
# FileSystemId: !Ref FileSystem
# PosixUser:
# Uid: "1000"
# Gid: "1000"
# RootDirectory:
# CreationInfo:
# OwnerGid: "1000"
# OwnerUid: "1000"
# Permissions: "0777"
# Path: "/bitnami"
# RDS用DBサブネットグループ設定
DBSubnetGroup:
Type: AWS::RDS::DBSubnetGroup
Properties:
DBSubnetGroupName: wp-db-subnet-group
DBSubnetGroupDescription: wp-db-subnet-group
SubnetIds:
- !Ref PrivateSubnet0
- !Ref PrivateSubnet1
# RDS用セキュリティグループ設定
DBSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: RDS Security Group
VpcId: !Ref VPC
GroupName: Wordpress-Demo-RDS-SG
SecurityGroupIngress:
- IpProtocol: "tcp"
FromPort: 3306
ToPort: 3306
CidrIp: !FindInMap [ "SubnetConfig", "VPC", "CIDR" ]
# RDS設定
WordpressDB:
Type: AWS::RDS::DBInstance
Properties:
DBInstanceIdentifier: wp-db1
DBInstanceClass: db.t3.micro
DBName: wordpress
Engine: mysql
MasterUserPassword: !Ref "RDSMasterUserPassword"
MasterUsername: !Ref "RDSMasterUserName"
PubliclyAccessible: false
AllocatedStorage: 20
DBSubnetGroupName: !Ref DBSubnetGroup
VPCSecurityGroups:
- !Ref DBSecurityGroup
# アプリケーションロードバランサー用セキュリティグループ設定
ALBSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: ALB Security Group
VpcId: !Ref VPC
GroupName: Wordpress-Demo-ALB-SG
SecurityGroupIngress:
- IpProtocol: "tcp"
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
# アプリケーションロードバランサー設定
WordPressALB:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties:
Name: wp-load-balancer
SecurityGroups:
- !Ref ALBSecurityGroup
Subnets:
- !Ref PublicSubnet0
- !Ref PublicSubnet1
WordPressTargetGroup:
Type: AWS::ElasticLoadBalancingV2::TargetGroup
Properties:
Name: WordPressTargetGroup
TargetType: ip
Port: 80
Protocol: HTTP
HealthCheckPort: 80
UnhealthyThresholdCount: 5
HealthCheckTimeoutSeconds: 30
HealthCheckIntervalSeconds: 60
VpcId: !Ref VPC
WordPressALBListener:
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
LoadBalancerArn: !Ref WordPressALB
Protocol: "HTTP"
Port: 80
DefaultActions:
- Type: forward
ForwardConfig:
TargetGroups:
- TargetGroupArn: !Ref WordPressTargetGroup
Weight: 1
# ECS Fargate用セキュリティグループ設定
FargateSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Fargate Security Group
VpcId: !Ref VPC
GroupName: Wordpress-Demo-Fargate-SG
SecurityGroupIngress:
- IpProtocol: "tcp"
FromPort: 80
ToPort: 80
CidrIp: !FindInMap [ "SubnetConfig", "VPC", "CIDR" ]
# 各種設定情報を出力
Outputs:
VPCId:
Description: "VPCId of VPC"
Value:
Ref: "VPC"
Export:
Name: !Sub "${AWS::Region}-${AWS::StackName}-VPC"
PublicSubnet0:
Description: "SubnetId of public subnet 0"
Value:
Ref: "PublicSubnet0"
Export:
Name: !Sub "${AWS::Region}-${AWS::StackName}-PublicSubnet0"
PublicSubnet1:
Description: "SubnetId of public subnet 1"
Value:
Ref: "PublicSubnet1"
Export:
Name: !Sub "${AWS::Region}-${AWS::StackName}-PublicSubnet1"
PrivateSubnet0:
Description: "SubnetId of private subnet 0"
Value:
Ref: "PrivateSubnet0"
Export:
Name: !Sub "${AWS::Region}-${AWS::StackName}-PrivateSubnet0"
PrivateSubnet1:
Description: "SubnetId of private subnet 1"
Value:
Ref: "PrivateSubnet1"
Export:
Name: !Sub "${AWS::Region}-${AWS::StackName}-PrivateSubnet1"
DefaultSecurityGroup:
Description: "DefaultSecurityGroup Id"
Value: !GetAtt VPC.DefaultSecurityGroup
Export:
Name: !Sub "${AWS::Region}-${AWS::StackName}-DefaultSecurityGroup"
# EFSFSId:
# Description: "ID of EFS FS"
# Value:
# Ref: "FileSystem"
# Export:
# Name: !Sub "${AWS::Region}-${AWS::StackName}-FileSystem"
# EFSAccessPoint:
# Description: "EFS Access Point ID"
# Value: !GetAtt AccessPoint.AccessPointId
# Export:
# Name: !Sub "${AWS::Region}-${AWS::StackName}-AccessPoint"
RDSEndpointAddress:
Description: "RDS Endpoint Address"
Value: !GetAtt WordpressDB.Endpoint.Address
Export:
Name: !Sub "${AWS::Region}-${AWS::StackName}-WordpressDB"
ALBDNSname:
Description: "ALB DNS Name"
Value: !GetAtt WordPressALB.DNSName
Export:
Name: !Sub "${AWS::Region}-${AWS::StackName}-ALBDNSName"
ALBSecurityGroup:
Description: "ALB Security Group"
Value: !GetAtt ALBSecurityGroup.GroupId
Export:
Name: !Sub "${AWS::Region}-${AWS::StackName}-ALBSecurityGroup"
WordPressTargetGroup:
Description: "ALB Target Group"
Value:
Ref: "WordPressTargetGroup"
Export:
Name: !Sub "${AWS::Region}-${AWS::StackName}-ALBTargetGroup"
FargateSecurityGroup:
Description: "Fargate Security Group"
Value: !GetAtt FargateSecurityGroup.GroupId
Export:
Name: !Sub "${AWS::Region}-${AWS::StackName}-FargateSecurityGroup"
3-2.スタックのクイック作成
- リンクをクリックすると、ブラウザーにスタックのクイック作成ページが表示されるので、各項目が下記のようになっている事を確認し、右下の「スタックの作成」をクリックします。
- スタックの実行は数分かかります。
数分後、スタックの情報からステータスを確認してください。
※環境構築完了後、次の手順に進んでください。
4.ECSクラスター設定
4-1.ECSサービスへの移動
- マネージメントコンソールの検索から「ECS」と入力するとサービスにElastic Container Serviceが表示されるので、リンクをクリックします。
- 上記操作で表示出来ない場合は、こちらの [リンク] をクリックしてください。
4-2.ECSクラスター作成手順を参照して、クラスターを作成してください。
【設定情報】
使用テンプレート | クラスター名 |
---|---|
ネットワーキングのみ | ecs-cluster |
5.ECSタスク設定
5-1.ECSタスク定義作成手順を参照して、タスクを作成してください。
【設定情報】(1/2)
起動タイプの 互換性の選択 |
タスク定義名 | オペレーティング システムファミリー |
タスクメモリ | タスクCPU |
---|---|---|---|---|
FARGATE | ecs-tasks | linux | 0.5GB | 0.25vCPU |
コンテナ名 | イメージ | ポートマッピング |
---|---|---|
wp-container | wordpress:latest | 80 |
【設定情報】(2/2)
環境変数名 | 設定値 |
---|---|
WORDPRESS_DB_HOST | wp-db1.XXXXXXX.ap-northeast-1.rds.amazonaws.com:3306 |
WORDPRESS_DB_USER | admin |
WORDPRESS_DB_PASSWORD | password |
※XXXXXXXは、各自のRDSのエンドポイントアドレスを参照してください。
6.ECSサービス設定
6-1.ECSサービス作成手順を参照して、タスクを作成してください。
【設定情報】(1/2)
起動タイプ | サービス名 | タスクの数 |
---|---|---|
FARGATE | ecs-service | 1 |
クラスターVPC | サブネット | セキュリティグループ | パブリック IP の 自動割り当て |
---|---|---|---|
ECS-hands-on | ECS-hands-on-private-a, ECS-hands-on-private-c |
Wordpress-Demo-Fargate-SG | DISABLED |
【設定情報】(2/2)
ロードバランサー名 | プロダクション リスナーポート |
ターゲットグループ名 |
---|---|---|
wp-load-balancer | 80 : HTTP | WordPressTargetGroup |
7.ALBエンドポイントへの接続
7-1.ブラウザーで、ALBのDNSアドレスを入力し接続します。
8.WordPressの設定
8-1.表示言語の選択
8-2.下記の内容で、WordPressの初期設定を実施します。
【設定情報】
設定項目 | 設定内容 |
---|---|
サイトのタイトル | ecs-hands-on |
ユーザー名 | wp_admin |
パスワード | 任意の値 |
メールアドレス | 各自のメールアドレス入力 |
※入力したパスワードはメモしてください。