はじめに
前回、Fargateでスタンドアロンタスクを、コンソールから動かしました。
今回はClouFormationで作って、CLIで動かしてみます。
概要
前回と同じ部分は以下です。
- 文字列をPrintするだけのタスクを動かします
- CloudWatch Logsに出力されます
- Dockerコンテナを作り、ECRにPUSHして、それを実行します
- 使うベースのイメージはUbuntu
- Pythonをインストールするところからです
- 使うベースのイメージはUbuntu
以下から、前回と異なります。
- ECSリソースをCFnで作ります
- ECSクラスター
- IAMロール
- CloudWatchロググループ
- ECSタスク定義
- 実行用のVPCも作ります。パブリックサブネットで動かします
- ECSタスク実行はAWS CLI
やってみた
環境~コンテナをECRにPUSH まで
前回とまるまる同じです。
VPC作成
前回はデフォルトVPCを使いましたが、今回はVPCを作ってみます。
サービスエンドポイントに接続できる必要があるため、パブリックサブネットにしました。
プライベートサブネットの場合は以下の記事が参考になりそうです。
https://dev.classmethod.jp/articles/vpc-endpoints-for-ecs-2022/
以前の記事を参考に、VPC用のCFnテンプレートを作ります。
後続で使う、サブネットIDとセキュリティグループIDを出力しておきます。
touch createVpc.yaml
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
VpcName:
Type: String
Default: forFargateTask
Description: Name of the VPC
VpcCIDR:
Type: String
Default: 10.70.0.0/16
Description: CIDR block for the VPC
Resources:
VPC:
Type: 'AWS::EC2::VPC'
Properties:
CidrBlock: !Ref VpcCIDR
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: !Ref VpcName
InternetGateway:
Type: 'AWS::EC2::InternetGateway'
Properties:
Tags:
- Key: Name
Value: !Sub ${VpcName}-igw
VPCGatewayAttachment:
Type: 'AWS::EC2::VPCGatewayAttachment'
Properties:
VpcId: !Ref VPC
InternetGatewayId: !Ref InternetGateway
PublicSubnet:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId: !Ref VPC
CidrBlock: !Select [ 0, !Cidr [ !Ref VpcCIDR, 24, 8 ] ]
MapPublicIpOnLaunch: true
Tags:
- Key: Name
Value: !Sub ${VpcName}-subnet
PublicRouteTable:
Type: 'AWS::EC2::RouteTable'
Properties:
VpcId: !Ref VPC
Tags:
- Key: Name
Value: !Sub ${VpcName}-rtb-public
PublicRoute:
Type: 'AWS::EC2::Route'
DependsOn: VPCGatewayAttachment
Properties:
RouteTableId: !Ref PublicRouteTable
DestinationCidrBlock: '0.0.0.0/0'
GatewayId: !Ref InternetGateway
SubnetRouteTableAssociation:
Type: 'AWS::EC2::SubnetRouteTableAssociation'
Properties:
SubnetId: !Ref PublicSubnet
RouteTableId: !Ref PublicRouteTable
SecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
VpcId: !Ref VPC
GroupDescription: "for Fargate Task"
Outputs:
SubnetForFargateTask:
Value: !Ref PublicSubnet
SgForFargateTask:
Value: !Ref SecurityGroup
# VPC作成
VPCSTACKNAME="create-vpc-fargatetask"
VPCNAME="forFargateTask"
VPCCIDR="10.70.0.0/16"
aws cloudformation create-stack --stack-name ${VPCSTACKNAME} \
--template-body file://createVpc.yaml \
--region ${REGION} \
--parameters \
ParameterKey=VpcName,ParameterValue=${VPCNAME} \
ParameterKey=VpcCIDR,ParameterValue=${VPCCIDR}
ECSリソース作成
使用するECSなどに関連するリソースをまとめて作ります。
- ECSクラスター
- タスク実行ロール
- CloudWatchロググループ
- ECSタスク
touch createStandaloneEcs.yaml
AWSTemplateFormatVersion: "2010-09-09"
Parameters:
ClusterName:
Type: String
Default: clusterForStandalone
TaskName:
Type: String
Default: taskForStandalone
ImageUri:
Type: String
Resources:
########################################################
### Ecs Cluster
########################################################
EcsCluster:
Type: 'AWS::ECS::Cluster'
Properties:
ClusterName: !Ref ClusterName
CapacityProviders:
- FARGATE
- FARGATE_SPOT
ClusterSettings:
-
Name: containerInsights
Value: disabled
DefaultCapacityProviderStrategy:
- CapacityProvider: FARGATE
Weight: 1
- CapacityProvider: FARGATE_SPOT
Weight: 1
Configuration:
ExecuteCommandConfiguration:
Logging: DEFAULT
ServiceConnectDefaults:
Namespace: !Ref ClusterName
########################################################
### IAM Role
########################################################
TaskExecutionRole:
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
########################################################
### Log Group
########################################################
TaskLogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: !Sub "/ecs/${TaskName}"
RetentionInDays: 3653
########################################################
### Ecs Task
########################################################
EcsTask:
Type: AWS::ECS::TaskDefinition
Properties:
ExecutionRoleArn: !GetAtt TaskExecutionRole.Arn
RequiresCompatibilities:
- FARGATE
NetworkMode: awsvpc
Cpu: 256
Memory: 512
ContainerDefinitions:
-
Name: !Ref TaskName
Image: !Ref ImageUri
LogConfiguration:
LogDriver: awslogs
Options:
awslogs-group: !Ref TaskLogGroup
awslogs-region: !Ref AWS::Region
awslogs-stream-prefix: ecs
Outputs:
EcsClusterArnForFargateTask:
Value: !GetAtt EcsCluster.Arn
EcsTaskDefArnForFargateTask:
Value: !GetAtt EcsTask.TaskDefinitionArn
# 作成
ECSSTACKNAME="create-ecs-standalone"
CLUSTERNAME="clusterForStandalone"
TASKNAME="taskForStandalone"
IMAGEURI=`aws cloudformation describe-stacks --stack-name ${REPSTACKNAME} --query "Stacks[].Outputs[?OutputKey=='Task1RepositoryUri'].[OutputValue]" --output text`:latest
aws cloudformation create-stack --stack-name ${ECSSTACKNAME} \
--template-body file://createStandaloneEcs.yaml \
--region ${REGION} \
--parameters \
ParameterKey=ClusterName,ParameterValue=${CLUSTERNAME} \
ParameterKey=TaskName,ParameterValue=${TASKNAME} \
ParameterKey=ImageUri,ParameterValue=${IMAGEURI} \
--capabilities CAPABILITY_NAMED_IAM
ECSタスク実行
以下のページを参考に、AWS CLIから実行します。
# ECSの情報
ECSCLUSTER_ARN=`aws cloudformation describe-stacks --stack-name ${ECSSTACKNAME} --query "Stacks[].Outputs[?OutputKey=='EcsClusterArnForFargateTask'].[OutputValue]" --output text`
ECSTASKDEF_ARN=`aws cloudformation describe-stacks --stack-name ${ECSSTACKNAME} --query "Stacks[].Outputs[?OutputKey=='EcsTaskDefArnForFargateTask'].[OutputValue]" --output text`
# VPCの情報
SUBNET_ID=`aws cloudformation describe-stacks --stack-name ${VPCSTACKNAME} --query "Stacks[].Outputs[?OutputKey=='SubnetForFargateTask'].[OutputValue]" --output text`
SG_ID=`aws cloudformation describe-stacks --stack-name ${VPCSTACKNAME} --query "Stacks[].Outputs[?OutputKey=='SgForFargateTask'].[OutputValue]" --output text`
NETWORK_CONFIG="awsvpcConfiguration={subnets=[${SUBNET_ID}],securityGroups=[${SG_ID}],assignPublicIp=ENABLED}"
aws ecs run-task \
--cluster ${ECSCLUSTER_ARN} \
--task-definition ${ECSTASKDEF_ARN} \
--network-configuration "${NETWORK_CONFIG}" \
--launch-type FARGATE
作成したクラスターのタスク情報を、コンソールから見てみると、ちゃんと実行されていました。
おわりに
サクッと動かすのであればコンソールを使うのが便利ですが、何度も動かしたり実行時の設定値を見直す場合はコード化しておくと大変便利です。必要に応じて使い分けたいと思います。
この記事がどなたかのお役に立てれば幸いです。