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

## 1.事前準備
```bash
export ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
```
AWSアカウントIDを環境変数に保存します。

---

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

```bash
cat << EOF > trust-policy.json
{
"Version": "2012-10-17",
"Statement": [
  {
 "Effect": "Allow",
 "Principal": {
   "Service": "ecs-tasks.amazonaws.com"
 },
 "Action": "sts:AssumeRole"
  }
]
}
EOF
```

```bash
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リポジトリの作成
```bash
aws ecr create-repository --repository-name hello-world-ecs-repo
```

---

## 4.Dockerイメージのビルドとプッシュ（ローカル）
```bash
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とサブネット、ルートテーブルを設定します。

```bash
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ロググループの作成
```bash
aws logs create-log-group --log-group-name /ecs/hello-world-ecs-task --region ap-northeast-1
```

---

## 10.ECSクラスターの作成
```bash
aws ecs create-cluster --cluster-name hello-world-ecs-cluster
```

---

## 11.ECSタスク定義の作成
```bash
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サービスの作成
```bash
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.ログの確認
```bash
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更新手順
```bash
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
```