AWS CloudFormation コンソールを使用した Amazon ECS リソースの作成 - Amazon Elastic Container Service

AWS CloudFormation コンソールを使用した Amazon ECS リソースの作成

AWS CloudFormation を用いてAmazon ECS を使用する方法の一つが、AWS Management Console を用いたやり方です。ここでは、タスク定義、クラスター、サービスなどの Amazon ECS コンポーネントの AWS CloudFormation スタックを作成し、コンソールから直接デプロイできます。次のチュートリアルでは、AWS CloudFormation コンソールを使用して Amazon ECS サービス、タスク定義、クラスターを作成する方法を示します。

前提条件

このチュートリアルでは、以下の前提条件をすでに満たしているものとします。

ステップ 1: スタックテンプレートを作成する

次の手順を使用して、Amazon ECS サービスおよびその他の関連リソース向けの AWS CloudFormation スタックテンプレートを作成します。

  1. お好きなテキストエディタを使用して、ecs-tutorial-template.yaml という名前のファイルを作成します。

  2. ecs-tutorial-template.yaml ファイルに次のテンプレートを貼り付けて、変更を保存します。

    AWSTemplateFormatVersion: 2010-09-09 Description: A template that deploys an application that is built on an Apache web server Docker image by creating an Amazon ECS cluster, task definition, and service. The template also creates networking and logging resources, and an Amazon ECS task execution role. Parameters: ClusterName: Type: String Default: CFNCluster Description: Name of the ECS Cluster TaskFamily: Type: String Default: task-definition-cfn Description: Family name for the Task Definition ServiceName: Type: String Default: cfn-service Description: Name of the ECS Service ContainerImage: Type: String Default: public.ecr.aws/docker/library/httpd:2.4 Description: Container image to use for the task TaskCpu: Type: Number Default: 256 AllowedValues: [256, 512, 1024, 2048, 4096] Description: CPU units for the task TaskMemory: Type: Number Default: 512 AllowedValues: [512, 1024, 2048, 4096, 8192, 16384] Description: Memory (in MiB) for the task DesiredCount: Type: Number Default: 1 Description: Desired number of tasks to run LogGroupName: Type: String Default: /ecs/fargate-task-definition Description: CloudWatch Log Group name VpcCidr: Type: String Default: 10.0.0.0/16 Description: CIDR block for the VPC PublicSubnet1Cidr: Type: String Default: 10.0.0.0/24 Description: CIDR block for public subnet 1 PublicSubnet2Cidr: Type: String Default: 10.0.1.0/24 Description: CIDR block for public subnet 2 Resources: # VPC and Networking Resources VPC: Type: AWS::EC2::VPC Properties: CidrBlock: !Ref VpcCidr EnableDnsSupport: true EnableDnsHostnames: true Tags: - Key: Name Value: !Sub ${AWS::StackName}-VPC InternetGateway: Type: AWS::EC2::InternetGateway Properties: Tags: - Key: Name Value: !Sub ${AWS::StackName}-IGW InternetGatewayAttachment: Type: AWS::EC2::VPCGatewayAttachment Properties: InternetGatewayId: !Ref InternetGateway VpcId: !Ref VPC PublicSubnet1: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC AvailabilityZone: !Select [0, !GetAZs ''] CidrBlock: !Ref PublicSubnet1Cidr MapPublicIpOnLaunch: true Tags: - Key: Name Value: !Sub ${AWS::StackName}-PublicSubnet1 PublicSubnet2: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC AvailabilityZone: !Select [1, !GetAZs ''] CidrBlock: !Ref PublicSubnet2Cidr MapPublicIpOnLaunch: true Tags: - Key: Name Value: !Sub ${AWS::StackName}-PublicSubnet2 PublicRouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref VPC Tags: - Key: Name Value: !Sub ${AWS::StackName}-PublicRouteTable DefaultPublicRoute: Type: AWS::EC2::Route DependsOn: InternetGatewayAttachment Properties: RouteTableId: !Ref PublicRouteTable DestinationCidrBlock: 0.0.0.0/0 GatewayId: !Ref InternetGateway PublicSubnet1RouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: RouteTableId: !Ref PublicRouteTable SubnetId: !Ref PublicSubnet1 PublicSubnet2RouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: RouteTableId: !Ref PublicRouteTable SubnetId: !Ref PublicSubnet2 # Security Group ECSSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Security group for ECS tasks VpcId: !Ref VPC SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 0.0.0.0/0 - IpProtocol: tcp FromPort: 443 ToPort: 443 CidrIp: 0.0.0.0/0 # IAM Roles ECSTaskExecutionRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: ecs-tasks.amazonaws.com Action: sts:AssumeRole ManagedPolicyArns: - arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy # CloudWatch Logs TaskLogGroup: Type: AWS::Logs::LogGroup DeletionPolicy: Retain UpdateReplacePolicy: Retain Properties: LogGroupName: !Ref LogGroupName RetentionInDays: 30 # ECS Resources ECSCluster: Type: AWS::ECS::Cluster Properties: ClusterName: !Ref ClusterName ECSTaskDefinition: Type: AWS::ECS::TaskDefinition Properties: ContainerDefinitions: - Command: - >- /bin/sh -c "echo '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p> </div></body></html>' > /usr/local/apache2/htdocs/index.html && httpd-foreground"s EntryPoint: - sh - '-c' Essential: true Image: !Ref ContainerImage LogConfiguration: LogDriver: awslogs Options: mode: non-blocking max-buffer-size: 25m awslogs-create-group: 'true' awslogs-group: !Ref LogGroupName awslogs-region: !Ref 'AWS::Region' awslogs-stream-prefix: ecs Name: sample-fargate-app PortMappings: - ContainerPort: 80 HostPort: 80 Protocol: tcp Cpu: !Ref TaskCpu ExecutionRoleArn: !GetAtt ECSTaskExecutionRole.Arn Family: !Ref TaskFamily Memory: !Ref TaskMemory NetworkMode: awsvpc RequiresCompatibilities: - FARGATE RuntimePlatform: OperatingSystemFamily: LINUX ECSService: Type: AWS::ECS::Service DependsOn: - PublicSubnet1RouteTableAssociation - PublicSubnet2RouteTableAssociation Properties: ServiceName: !Ref ServiceName Cluster: !Ref ECSCluster DesiredCount: !Ref DesiredCount LaunchType: FARGATE NetworkConfiguration: AwsvpcConfiguration: AssignPublicIp: ENABLED SecurityGroups: - !Ref ECSSecurityGroup Subnets: - !Ref PublicSubnet1 - !Ref PublicSubnet2 TaskDefinition: !Ref ECSTaskDefinition Outputs: ClusterName: Description: The name of the ECS cluster Value: !Ref ECSCluster TaskDefinitionArn: Description: The ARN of the task definition Value: !Ref ECSTaskDefinition ServiceName: Description: The name of the ECS service Value: !Ref ECSService VpcId: Description: The ID of the VPC Value: !Ref VPC PublicSubnet1: Description: The ID of public subnet 1 Value: !Ref PublicSubnet1 PublicSubnet2: Description: The ID of public subnet 2 Value: !Ref PublicSubnet2 SecurityGroup: Description: The ID of the security group Value: !Ref ECSSecurityGroup ExecutionRoleArn: Description: The ARN of the task execution role Value: !GetAtt ECSTaskExecutionRole.Arn

ステップ 2: Amazon ECS リソースのスタックを作成する

テンプレートのファイルを作成したら、以下の手順に従って、AWS CloudFormation コンソールを使用してテンプレートでスタックを作成できます。

  1. AWS Management Console にサインインし、AWS CloudFormation コンソール (https://console.aws.amazon.com/cloudformation) を開きます。

  2. [スタック] ページで、右上の [スタックの作成] を選択してから、[新しいリソースを使用 (標準)] を選択します。

  3. [既存のテンプレートを選択する] を選択します。

  4. [テンプレートファイルのアップロード] を選択し、次に [ファイルの選択] を選択して ecs-tutorial-template ファイルを指定します。

    ファイルが Amazon S3 バケットにアップロードされたら、[Infrastructure Composer で表示する] を選択して Infrastructure Composer でテンプレートを可視化できます。AWS CloudFormation テンプレートと Infrastructure Composer の詳細については、「AWS CloudFormation ユーザーガイド」の「Infrastructure Composer を使用してテンプレートを視覚的に作成する」を参照してください。

  5. [次へ] を選択します。

  6. [スタックの詳細を指定] ページの [スタック名] で、次のスタック名を指定します: ecs-tutorial-stack[パラメータ] のすべてのパラメータ値をデフォルトのままにして、[次へ] を選択します。

  7. [スタックオプションの設定] ページの [機能] で、AWS CloudFormation による IAM リソースの作成を承認するチェックボックスをオンにします。この承認は、テンプレートで定義されている Amazon ECS タスク実行ロールの作成に必要となります。他の設定はデフォルトのままにして、[次へ] を選択します。

  8. [レビューと作成] ページでスタックの詳細を確認し、[送信] を選択してスタックの作成を開始します。

ステップ 3: 確認する

提供されたテンプレートを使用して Amazon ECS リソースの作成を確認するには、次の手順に従います。

  1. AWS Management Console にサインインし、AWS CloudFormation コンソール (https://console.aws.amazon.com/cloudformation) を開きます。

  2. [スタック] ページで、[ecs-tutorial-stack] を選択します。

  3. [イベント] タブを選択します。イベントステータスが CREATE_IN_PROGRESS の場合は、作成が完了してステータスが CREATE_COMPLETE に変わるまで待ちます。

  4. イベントステータスが CREATE_COMPLETE に変わったら、[リソース] タブを選択します。論理 ID ECSClusterECSTaskDefinition、および ECSService でリソースが表示されます。

  5. Amazon ECS クラスターの作成を確認するには、ECSCluster に関連付けられた [物理 ID] を選択します。Amazon ECS コンソールにリダイレクトされると、CFNCluster という名前の作成されたクラスターが表示されています。

  6. Amazon ECS サービスの作成を確認するには、ECSService に関連付けられた[物理 ID] を選択します。Amazon ECS コンソールにリダイレクトされると、クラスター cfnCluster で作成された cfn-service という名前のサービスが表示されています。

  7. Amazon ECS タスク定義の作成を確認するには、ECSTaskDefinition に関連付けられた [物理 ID] を選択します。Amazon ECS コンソールにリダイレクトされると、task-definition-cfn という名前のタスク定義リビジョンが表示されています。

ステップ 4: リソースをクリーンアップする

リソースをクリーンアップし、不要なコストがそれ以上発生しないようにするため、次の手順を実行します。

  1. AWS Management Console にサインインし、AWS CloudFormation コンソール (https://console.aws.amazon.com/cloudformation) を開きます。

  2. [スタック] ページで、[ecs-tutorial-stack] を選択します。

  3. [削除] を選択します。

  4. 確認を求めるメッセージが表示されたら、[削除] をもう一度選択してください。

  5. [イベント] タブを選択します。リソースが削除または登録解除された後の、[DELETE_IN_PROGRESS] および [DELETE_COMPLETE] へのecs-tutorial-stack変更のステータス。削除には数分かかります。

  6. [リソース] タブを選択してください。これで、ステータスDELETE_COMPLETE に更新された論理 ID のリストが表示されます。