【JAWS-UG 名古屋】 AWS ECSハンズオン

## ◆Agenda  
**１．ハンズオン概要**
**２．ハンズオンを始める前に・・・**  
**３．ハンズオン環境準備**  
**４．ECSクラスター設定**  
**５．ECSタスク設定**  
**６．ECSサービス設定**  
**７．ALBエンドポイントへの接続**    
**８．WordPressの設定**  

- - -

# １．ハンズオン概要

- - -

## ◆概要  
* このECSハンズオンは、Dockerの公式ドキュメントで紹介している「クイックスタート：ComposeとWordPress」の構成について、ECSとRDSを使用して構築する内容になっています。

https://docs.docker.jp/compose/wordpress.html

:::note warn
基礎知識としてのDockerについては触れません。  
:::
<details><summary>参考：Dockerについて知りたい方</summary>
<strong>Dockerについて知りたい方は、下記リンクを参照してみてください。</strong>

[【図解】Dockerの全体像を理解する -前編-](https://qiita.com/etaroid/items/b1024c7d200a75b992fc)
[【図解】Dockerの全体像を理解する -中編-](https://qiita.com/etaroid/items/88ec3a0e2d80d7cdf87a)
[【図解】Dockerの全体像を理解する -後編-](https://qiita.com/etaroid/items/40106f13d47bfcbc2572)  

</details>

- - -

# ２．ハンズオンを始める前に・・・

- - -

## 確認事項①

* 会場設置のWi-Fiへ接続願います。
　　※インターネットへの接続を前提としています。  

* AWSアカウントの準備はお済みですか？
　　※ハンズオン開始前までに準備願います。  
　　　作成手順：https://aws.amazon.com/jp/register-flow/  

- - -

## 確認事項②

* AWSマネジメントコンソールにログインして、東京リージョンになっている事を確認してください。

<img width="400" alt="image.png" src="https://jawsug-iwata.s3.ap-northeast-1.amazonaws.com/2022_05/image/ecs-hands-on-step01.png">

- - -

## 確認事項③

* ハンズオン終了後の操作について

:::note warn
※使用したEC2・ALB・RDS・ECSは、AWSの課金対象になります。
必要ない場合は、削除してください。  
　[[ECSクラスター（クラシックコンソール）削除方法]](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/delete_cluster.html)  
　[[ECSクラスター（新しいコンソール）削除方法]](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/stop-task-console-v2.html)  
　[[ECSタスク定義の登録解除方法]](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/deregister-task-definition.html)  
　[[Cloudformation削除方法]](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/cfn-console-delete-stack.html)  

:::

- - -

# ３．ハンズオン環境の準備

- - -

## 【ハンズオンの構成図】  
<img width="600" alt="構成図.PNG" src="https://jawsug-iwata.s3.ap-northeast-1.amazonaws.com/2022_05/image/ecs-hands-on-1.png">

- - -

## ３－１．ECSハンズオン環境構築のCloudFormationの実行  
* 下記リンクをクリックします。  
<p><a href="https://ap-northeast-1.console.aws.amazon.com/cloudformation/home?region=ap-northeast-1#/stacks/quickcreate?stackName=jawsug-nagoya-20220527&amp;templateURL=https://jawsug-iwata.s3.ap-northeast-1.amazonaws.com/2022_05/cloudformation.yaml"><img alt="Launch Stack" src="https://s3.amazonaws.com/cloudformation-examples/cloudformation-launch-stack.png" /></a></p>

<details><summary>参考：CloudFormationテンプレート内容</summary>

このブログにあるテンプレートからカスタマイズしました。
https://aws.amazon.com/jp/blogs/news/running-wordpress-amazon-ecs-fargate-ecs/

``` yaml
---
  #*******************************************************************************
  #* 【テンプレート名】：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"
```
</details>

- - -

## ３－２．スタックのクイック作成  
* リンクをクリックすると、ブラウザーにスタックのクイック作成ページが表示されるので、各項目が下記のようになっている事を確認し、右下の「スタックの作成」をクリックします。  
* スタックの実行は数分かかります。

<img width="500" alt="image.png" src="https://jawsug-iwata.s3.ap-northeast-1.amazonaws.com/2022_05/image/ecs-hands-on-step03.png">

- - -

## 数分後、スタックの情報からステータスを確認してください。  

<img width="800" alt="image.png" src="https://jawsug-iwata.s3.ap-northeast-1.amazonaws.com/2022_05/image/ecs-hands-on-step04.png">

- - -

:::note info
※正常に終了すると、下記の構成が出来ています。
<img width="500" alt="image.png" src="https://jawsug-iwata.s3.ap-northeast-1.amazonaws.com/2022_05/image/ecs-hands-on-step02.png">
:::

**※環境構築完了後、次の手順に進んでください。**  

- - -

# ４．ECSクラスター設定

- - -

## ４－１．ECSサービスへの移動  
* マネージメントコンソールの検索から「ECS」と入力するとサービスにElastic Container Serviceが表示されるので、リンクをクリックします。
* 上記操作で表示出来ない場合は、こちらの [[リンク]](https://ap-northeast-1.console.aws.amazon.com/ecs/home?region=ap-northeast-1#/getStarted) をクリックしてください。
:::note warn
画面左上の新しい ECS エクスペリエンスがONになっている場合は、OFFにしてください。  
<img width="250" alt="image.png" src="https://jawsug-iwata.s3.ap-northeast-1.amazonaws.com/2022_05/image/ecs-hands-on-step05.png">
※上記のようになっていますか？
:::

- - -

## ４－２．ECSクラスター作成手順を参照して、クラスターを作成してください。
[[ECSクラスター作成手順]](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/create_cluster.html)

**【設定情報】**  
|使用テンプレート|クラスター名|
|---------------|-----------|
|ネットワーキングのみ|ecs-cluster |

- - -
 
# ５．ECSタスク設定

- - -

## ５－１．ECSタスク定義作成手順を参照して、タスクを作成してください。
[[ECSタスク定義作成手順]](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/create-task-definition.html)

**【設定情報】（1/2）**  
|起動タイプの<br>互換性の選択|タスク定義名|オペレーティング<br>システムファミリー|タスクメモリ|タスク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<br>|
|WORDPRESS_DB_USER|admin|
|WORDPRESS_DB_PASSWORD|password|

:::note warn
※**XXXXXXX**は、各自のRDSのエンドポイントアドレスを参照してください。  
:::

- - -

# ６．ECSサービス設定

- - -

## ６－１．ECSサービス作成手順を参照して、タスクを作成してください。
[[ECSサービス作成手順]](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/create-service.html)

**【設定情報】（1/2）**  
|起動タイプ|サービス名 |タスクの数|
|:--------|:----------|:---------|
|FARGATE  |ecs-service|1         |

|クラスターVPC|サブネット|セキュリティグループ|パブリック IP の<br>自動割り当て|
|:------------|:---------|:-------------------|:-------------------|
|ECS-hands-on|ECS-hands-on-private-a,<br>ECS-hands-on-private-c|Wordpress-Demo-Fargate-SG|DISABLED|

- - -

**【設定情報】（2/2）**  
|ロードバランサー名|プロダクション<br>リスナーポート|ターゲットグループ名|
|:-----------------|:---------------------------|:-------------------|
|wp-load-balancer|80 : HTTP            |WordPressTargetGroup|

- - -

# ７．ALBエンドポイントへの接続

- - -

## ７－１．ブラウザーで、ALBのDNSアドレスを入力し接続します。

<img width="900" alt="image.png" src="https://jawsug-iwata.s3.ap-northeast-1.amazonaws.com/2022_05/image/ecs-hands-on-step11.png">

- - -

# ８．WordPressの設定

- - -

## ８－１．表示言語の選択  
<img width="350" alt="image.png" src="https://jawsug-iwata.s3.ap-northeast-1.amazonaws.com/2022_05/image/ecs-hands-on-step06.png">  

- - -

## ８－２．下記の内容で、WordPressの初期設定を実施します。
#### 【設定情報】  
|設定項目        |設定内容    |
|----------------|------------|
|サイトのタイトル|ecs-hands-on|
|ユーザー名      |wp_admin    |
|パスワード      |**任意の値**|
|メールアドレス  |**各自のメールアドレス入力**|

:::note warn
※入力したパスワードはメモしてください。  
:::

<!--
<img width="300" alt="image.png" src="https://jawsug-iwata.s3.ap-northeast-1.amazonaws.com/2022_05/image/ecs-hands-on-step07.png">
-->

- - -

:::note info
※設定完了後、下記画面が表示されます。
<img width="500" alt="image.png" src="https://jawsug-iwata.s3.ap-northeast-1.amazonaws.com/2022_05/image/ecs-hands-on-step08.png">
:::

- - -

## ８－３．下記画面からログインします。
<img width="300" alt="image.png" src="https://jawsug-iwata.s3.ap-northeast-1.amazonaws.com/2022_05/image/ecs-hands-on-step09.png">

- - -

:::note info
※正常にログインすると、下記画面が表示されます。
<img width="800" alt="image.png" src="https://jawsug-iwata.s3.ap-northeast-1.amazonaws.com/2022_05/image/ecs-hands-on-step10.png">
:::