0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CloudShellからECSを利用してとりあえずhelloworldする

Last updated at Posted at 2024-10-23

1.事前準備

export ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)

AWSアカウントIDを環境変数に保存します。


2.IAMロールの作成

IAMロールは、ECSタスクやCloudWatchとの連携に必要です。

cat << EOF > trust-policy.json
{
"Version": "2012-10-17",
"Statement": [
  {
 "Effect": "Allow",
 "Principal": {
   "Service": "ecs-tasks.amazonaws.com"
 },
 "Action": "sts:AssumeRole"
  }
]
}
EOF
aws iam create-role --role-name hello-world-ecs-task-execution-role --assume-role-policy-document file://trust-policy.json
aws iam attach-role-policy --role-name hello-world-ecs-task-execution-role --policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy

3.ECRリポジトリの作成

aws ecr create-repository --repository-name hello-world-ecs-repo

4.Dockerイメージのビルドとプッシュ(ローカル)

export ACCOUNT_ID=<aws_account_id>
docker buildx build --platform linux/amd64 -t hello-world-ecs:latest .
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin ${ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com
docker tag hello-world-ecs:latest ${ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/hello-world-ecs-repo:latest
docker push ${ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/hello-world-ecs-repo:latest

5.ネットワーク構成の設定

VPCとサブネット、ルートテーブルを設定します。

aws ec2 create-vpc --cidr-block 10.0.0.0/16 --tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=hello-world-ecs-vpc}]'
export VPC_ID=$(aws ec2 describe-vpcs --filters "Name=tag:Name,Values=hello-world-ecs-vpc" --query "Vpcs[0].VpcId" --output text)
aws ec2 create-subnet --vpc-id $VPC_ID --cidr-block 10.0.1.0/24 --availability-zone ap-northeast-1a \
  --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=hello-world-ecs-public-subnet-1}]'
aws ec2 create-subnet --vpc-id $VPC_ID --cidr-block 10.0.2.0/24 --availability-zone ap-northeast-1c \
  --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=hello-world-ecs-public-subnet-2}]'
SUBNET_ID_1=$(aws ec2 describe-subnets --filters "Name=tag:Name,Values=hello-world-ecs-public-subnet-1" --query "Subnets[0].SubnetId" --output text)
SUBNET_ID_2=$(aws ec2 describe-subnets --filters "Name=tag:Name,Values=hello-world-ecs-public-subnet-2" --query "Subnets[0].SubnetId" --output text)
aws ec2 modify-subnet-attribute --subnet-id ${SUBNET_ID_1} --map-public-ip-on-launch
aws ec2 modify-subnet-attribute --subnet-id ${SUBNET_ID_2} --map-public-ip-on-launch

6.インターネットゲートウェイの作成とアタッチ

aws ec2 create-internet-gateway --tag-specifications 'ResourceType=internet-gateway,Tags=[{Key=Name,Value=hello-world-ecs-igw}]'
IGW_ID=$(aws ec2 describe-internet-gateways --filters "Name=tag:Name,Values=hello-world-ecs-igw" --query "InternetGateways[0].InternetGatewayId" --output text)
aws ec2 attach-internet-gateway --vpc-id $VPC_ID --internet-gateway-id $IGW_ID

7.ルートテーブルの作成

aws ec2 create-route-table --vpc-id $VPC_ID --tag-specifications 'ResourceType=route-table,Tags=[{Key=Name,Value=hello-world-ecs-route-table}]'
ROUTE_TABLE_ID=$(aws ec2 describe-route-tables --filters "Name=tag:Name,Values=hello-world-ecs-route-table" --query "RouteTables[0].RouteTableId" --output text)
aws ec2 create-route --route-table-id $ROUTE_TABLE_ID --destination-cidr-block 0.0.0.0/0 --gateway-id $IGW_ID
aws ec2 associate-route-table --route-table-id $ROUTE_TABLE_ID --subnet-id $SUBNET_ID_1
aws ec2 associate-route-table --route-table-id $ROUTE_TABLE_ID --subnet-id $SUBNET_ID_2

---

## 8.セキュリティグループの作成
```bash
aws ec2 create-security-group --group-name hello-world-ecs-task-sg --description "ECS task security group" --vpc-id $VPC_ID
export ECS_TASK_SG_ID=$(aws ec2 describe-security-groups --filters "Name=group-name,Values=hello-world-ecs-task-sg" --query "SecurityGroups[0].GroupId" --output text)
aws ec2 authorize-security-group-ingress --group-id $ECS_TASK_SG_ID --protocol tcp --port 80 --cidr 0.0.0.0/0

9.CloudWatchロググループの作成

aws logs create-log-group --log-group-name /ecs/hello-world-ecs-task --region ap-northeast-1

10.ECSクラスターの作成

aws ecs create-cluster --cluster-name hello-world-ecs-cluster

11.ECSタスク定義の作成

aws ecs register-task-definition --family hello-world-ecs-task --network-mode awsvpc --requires-compatibilities FARGATE \
--execution-role-arn arn:aws:iam::$ACCOUNT_ID:role/hello-world-ecs-task-execution-role \
--container-definitions '[{"name":"hello-world-ecs-container","image":"'$ACCOUNT_ID'.dkr.ecr.ap-northeast-1.amazonaws.com/hello-world-ecs-repo:latest","portMappings":[{"containerPort":80,"protocol":"tcp"}]}]' \
--cpu "256" --memory "512"

12.ECSサービスの作成

aws ecs create-service --cluster hello-world-ecs-cluster --service-name hello-world-ecs-service \
  --task-definition hello-world-ecs-task --desired-count 1 --launch-type FARGATE \
  --network-configuration "awsvpcConfiguration={subnets=['$SUBNET_ID_1','$SUBNET_ID_2'],securityGroups=['$ECS_TASK_SG_ID'],assignPublicIp='ENABLED'}"

13.ログの確認

aws logs describe-log-streams --log-group-name /ecs/hello-world-ecs-task
aws logs get-log-events --log-group-name /ecs/hello-world-ecs-task --log-stream-name $LOG_STREAM_NAME --limit 50

14.ECS更新手順

docker buildx build --platform linux/amd64 -t hello-world-ecs:latest .
docker tag hello-world-ecs:latest $ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/hello-world-ecs-repo:latest
docker push $ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/hello-world-ecs-repo:latest
aws ecs update-service --cluster hello-world-ecs-cluster --service hello-world-ecs-service --task-definition hello-world-ecs-task

15.全部削除する

1.ECSサービスの停止と削除

ECSサービスを停止して削除します。

サービスID取得

export SERVICE_NAME="hello-world-ecs-service"
aws ecs update-service --cluster hello-world-ecs-cluster \
  --service $SERVICE_NAME --desired-count 0

サービスの削除

aws ecs delete-service --cluster hello-world-ecs-cluster \
  --service $SERVICE_NAME --force

2.ECSクラスターの削除

クラスターを削除します。

クラスタ削除

aws ecs delete-cluster --cluster hello-world-ecs-cluster

3.CloudWatchロググループの削除

CloudWatchロググループを削除します。

aws logs delete-log-group --log-group-name /ecs/hello-world-ecs-task

4.ECRリポジトリの削除

ECRにプッシュしたDockerイメージを含むリポジトリを削除します。

リポジトリ削除

aws ecr delete-repository --repository-name hello-world-ecs-repo --force

5.IAMロールの削除

IAMロールにアタッチされたポリシーをデタッチし、ロールを削除します。

ポリシーのデタッチ

aws iam detach-role-policy --role-name hello-world-ecs-task-execution-role \
  --policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy

ロール削除

aws iam delete-role --role-name hello-world-ecs-task-execution-role

6.セキュリティグループの削除

セキュリティグループを削除します。

セキュリティグループID取得

export ECS_TASK_SG_ID=$(aws ec2 describe-security-groups --filters "Name=group-name,Values=hello-world-ecs-task-sg" --query "SecurityGroups[0].GroupId" --output text)

セキュリティグループ削除

aws ec2 delete-security-group --group-id $ECS_TASK_SG_ID

7.ルートテーブルの削除

ルートテーブルを削除します。

ルートテーブルID取得

export ROUTE_TABLE_ID=$(aws ec2 describe-route-tables --filters "Name=tag:Name,Values=hello-world-ecs-route-table" --query "RouteTables[0].RouteTableId" --output text)

サブネットからルートテーブルの関連を解除

aws ec2 disassociate-route-table --association-id $(aws ec2 describe-route-tables --route-table-id $ROUTE_TABLE_ID --query "Associations[0].RouteTableAssociationId" --output text)

ルートテーブル削除

aws ec2 delete-route-table --route-table-id $ROUTE_TABLE_ID

8.インターネットゲートウェイの削除

インターネットゲートウェイを削除します。

インターネットゲートウェイID取得

export IGW_ID=$(aws ec2 describe-internet-gateways --filters "Name=attachment.vpc-id,Values=$VPC_ID" --query "InternetGateways[0].InternetGatewayId" --output text)

インターネットゲートウェイのデタッチ

aws ec2 detach-internet-gateway --internet-gateway-id $IGW_ID --vpc-id $VPC_ID

インターネットゲートウェイ削除

aws ec2 delete-internet-gateway --internet-gateway-id $IGW_ID

9.サブネットの削除

サブネットを削除します。

サブネットIDを配列に格納

export SUBNET_IDS=($(aws ec2 describe-subnets --filters "Name=vpc-id,Values=$VPC_ID" --query "Subnets[*].SubnetId" --output text))

各サブネットを削除

for SUBNET_ID in "${SUBNET_IDS[@]}"; do
  aws ec2 delete-subnet --subnet-id $SUBNET_ID
done

10.VPCの削除

最後にVPCを削除します。

VPC削除

aws ec2 delete-vpc --vpc-id $VPC_ID
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?