AWS Book - izudon/izudon.github.io GitHub Wiki

2.5 各リソースの削除

イメージ

EC2 スナップショット

$ aws ec2 delete-snapshot ¥
  --snapshot-id ${SNAPSHOTID}

AMI

$ aws ec2 deregister-image ¥
  --image-id ${AMIID}

IAM

IAM ロール

$ aws iam delete-role ¥
  --role-name aws-loadmap-ec2-role

IAM ロール と IAM ポリシ の 関連付け

$ aws iam detach-role-policy ¥
  --role-name aws-loadmap-ec2-role ¥
  --policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore

インスタンスプロファイル

$ aws iam delete-instance-profile ¥
  --instance-profile-name aws-loadmap-ec2-instance-profile

インスタンスプロファイルと IAM ロールの関連付け

$ aws iam remove-role-from-instance-profile ¥
  --instance-profile-name aws-loadmap-ec2-instance-profile

ネットワーク

VPC

$ aws ec2 delete-vpc ¥
  --vpc-id ${VPCID}

ルートテーブル

$ aws ec2 delete-route-table ¥
  --route table-id ${ROUTETBLID}

サブネット

$ aws ec2 delete-subnet ¥
  --subnet-id ${PUBSUBID1A}
$ aws ec2 delete-subnet ¥
  --subnet-id ${PUBSUBID1C}
$ aws ec2 delete-subnet ¥
  --subnet-id ${PRVSUBID1A}
$ aws ec2 delete-subnet ¥
  --subnet-id ${PRVSUBID1A}

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

削除

$ aws ec2 delete-internet-gateway ¥
  --internet-gateway-id ${GTWYID}

VPC から デタッチ

$ aws ec2 detach-internet-gateway ¥
  --internet-gateway-id ${GTWYID}
  --vpc-id ${VPCID}
  • detach で合っている( detouch ではない )

セキュリティグループ

ALB で 使用分

$ aws ec2 delete-security-group ¥
  --group-id ${SGID}

EC2 で 使用分

$ aws ec2 delete-security-group ¥
  --group-id ${SGID}

RDS で 使用分

$ aws ec2 delete-security-group ¥
  --group-id ${SGID}

Auto Scaling

起動テンプレート

$ aws ec2 delete-launch-template ¥
  --launch-template-id ${対象起動テンプレートID}

Auto Scaling グループ

$ aws autoscaling delete-auto-scaling-group ¥
  --auto-scaling-group-name aws-loadmap-asg

EC2

EIP

$ aws ec2 releace-address ¥
  --allocation-id ${EIP割り当てID}
$ aws ec2 releace-address ¥
  --allocation-id ${EIP割り当てID}

インスタンス

$ aws ec2 dterminate-instances ¥
  --instance-ids ${INSTANCEID1} ${INSTANCEID2}

ALB

ターゲットグループ

$ aws elbv2 delete-target-group ¥
  --target-group-arn ${TGTGRPID}

ALB

$ aws elbv2 delete-load-balancer ¥
  --load-balancer-arn ${ELBID}

DB

DBサブネットグループ

$ aws rds delete-db-subnet-group ¥
  --db-subnet-group-name aws-loadmap-rds-subnet-group

DBクラスタ

$ aws rds delete-db-cluster ¥
  --db-cluster-identifier aws-loadmap-aurora-cluster ¥
  --skip-final-snapshot

DBインスタンス

$ aws rds delete-db-instance ¥
  --sb-instance-identifier aws-loadmap-aurora-instance-1
$ aws rds delete-db-instance ¥
  --sb-instance-identifier aws-loadmap-aurora-instance-2

2.4 データベースの構築

5. MySQL のインストールと起動

$ sudo yum install -y mysql

4. インスタンス

接続

$ aws ssm start-session ¥
  --target ${INSTANCEID}

確認

$ aws rds describe-db-instances ¥
  --db-instance-identifier aws-loadmap-aurora-instance-1
$ aws rds describe-db-instances ¥
  --db-instance-identifier aws-loadmap-aurora-instance-2
  • DBInstanceStatusavailable になるまで待つ。

作成

$ aws rds create-db-instance ¥
  --db-instance-identifier aws-loadmap-aurora-instance-1 ¥
  --db-cluster-identifier aws-loadmap-aurora-cluster ¥
  --engine aurora-mysql ¥
  --db-instance-class db.t4g.medium ¥
  --tags "Key=Name, Value=aws-loadmap-aurora-instance-1"
$ aws rds create-db-instance ¥
  --db-instance-identifier aws-loadmap-aurora-instance-2 ¥
  --db-cluster-identifier aws-loadmap-aurora-cluster ¥
  --engine aurora-mysql ¥
  --db-instance-class db.t4g.medium ¥
  --tags "Key=Name, Value=aws-loadmap-aurora-instance-2"

3. DBクラスタ

確認

$ aws rds describe-db-clusters ¥
  --db-cluster-identifier aws-loadmap-aurora-cluster
  • {
      "DBClusters": [
        :
        "Status": "available",  //<- 確認
          :
          "Endpoint": "aws-loadmap-aurora-cluster.XXX.ap-northeast-1.rds.amazonaws.com",  //<- 確認
          "ReaderEndpoint": "aws-loadmap-aurora-cluster.XXX.ap-northeast-1.rds.amazonaws.com",  //<- 確認
          :
      ]
    }
    

作成

$ aws rds create-db-cluster ¥
  --db-cluster-identifier aws-loadmap-aurora-cluster ¥
  --engine aurora-mysql ¥
  --engine-version 8.0 ¥
  --master-username ${user-name} ¥
  --master-user-password ${password} ¥
  --db-subnet-group-name aws-loadmap-rds-subnet-group ¥
  --vpc-security-group-ids ${DBSGID} ¥
  --tags "Key=Name, Value=aws-loadmap-aurora-cluster"

2. セキュリティグループ

ルールの追加

$ aws ec2 authorize-security-group-ingress ¥
  --group-id ${DBSGID} ¥
  --protocol tcp ¥
  --port 3306 ¥
  --source-group ${EC2SGID}

作成

$ aws ec2 create-security-group ¥
  --description "Security group for aws loadmap aurora" ¥
  --group-name "aws-loadmap-aurora-sg" ¥
  --vpc-id "${VPCID}" ¥
  --tag-specifications "ResourceType=security-group, Tags=[{Key=Name, Value=aws-loadmap-aurora-sg}]"

1. DBサブネットグループ

確認

$ aws rds describe-db-subnet-groups ¥
  --db-subnet-group-name aws-loadmap-rds-subnet-group
  • {
      "DBSubnetGroups": [
        {
          :
          "SubnetGroupStatus": "Complete",	//<- 確認                             
          "Subnets": [
            {
              :
              "SubnetStatus": "Active"  //<- 確認                                   
            },
            {
              :
              "SubnetStatus": "Active"  //<- 確認                                   
            }
          ],
          :
        }
      ]
    }
    

作成

$ aws rds create-db-subnet-group ¥
  --db-subnet-group-name aws-loadmap-rds-subnet-group ¥
  --db-subnet-group-description "Rds subnet group for aws loadmap" ¥
  --subnet-ids '["${PRVSUBID1A}","${PRVSUBID1C}"]'

2.3 サーバの構築

14. Auto Scaling グループ

予定数0にして終了(節約のため)

$ aws autoscaling update-auto-scaling-group ¥
  --auto-scaling-group-name aws-loadmap-asg ¥
  --min-size 0 ¥
  --desired-capacity 0

確認

$ aws ec2 describe-instances ¥
  --query "Reservations[].Instances[].InstanceId" ¥
  --filter "Name=instance-state-code,Values=16"

予定数5に変更

$ aws autoscaling update-auto-scaling-group ¥
  --auto-scaling-group-name aws-loadmap-asg ¥
  --max-size 5 ¥
  --desired-capacity 5

確認

$ aws ec2 describe-instances ¥
  --query "Reservations[].Instances[].InstanceId" ¥
  --filter "Name=instance-state-code,Values=16"

予定数2で起動

$ aws autoscaling create-auto-scaling-group ¥
  --launch-template LaunchTemplateId=${LTMPLTID},Version='$Latest' ¥
  --auto-scaling-group-name aws-loadmap-asg ¥
  --min-size 1 ¥
  --desired-capacity 2 ¥
  --max-size 2 ¥
  --vpc-zone-identifier "${PUBSUBID1A}, ${PUBSUBID1C}"

13. 起動テンプレート

ID の 確認

$ aws ec2 describe-launch-templates ¥
  --launch-template-names aws-loadmap-template ¥
  --query "LaunchTemplates[].LaunchTemplateId"
  • [
      "lt-xxxxxxxxxxxxx"
    ]
    

作成

$ aws ec2 create-launch-template ¥
  --launch-template-name aws-loadmap-template ¥
  --launch-template-data file://launch-template.json

設定ファイル

launch-template.json

{
  "IamInstanceProfile": {
    "Name": "ami-loadmap-ec2-instance-profile"
  },
  "ImageId": "ami-0e3861265a3a335cc",
  "InstanceType": "t3.micro",
  "BlockDeviceMappings": [
    {
      "DeviceName": "/dev/xvda",
      "Ebs": {
        "VolumeSize": 8,
        "DeleteOnTermination": true,
        "VolumeType": "gp3"
      }
    }
  ],
  "SecurityGroupIds": [
    "${SGRPID}"
  ],
  "TagSpecifications": [
    {
      "ResourceType": "instance",
      "Tags": [
        {
          "Key": "Name",
          "Value": "aws-loadmap-asg-instance"
        }
      ]
    }
  ]
}

12. EIP

EIP を EC2 インスタンスに関連付け

$ aws ec2 associate-address ¥
  --instance-id ${ec2-1 のインスタンスID} ¥
  --allocation-id ${eip-1 の AllocationId}
$ aws ec2 associate-address ¥
  --instance-id ${ec2-2 のインスタンスID} ¥
  --allocation-id ${eip-2 の AllocationId}

EIP を AWSアカウントに 割当

$ aws ec2 allocate-address ¥
  --tag-specifications "ResourceType=elastic-ip, Tags=[{Key=Name, Value=aws-loadmap-eip-1}]"
$ aws ec2 allocate-address ¥
  --tag-specifications "ResourceType=elastic-ip, Tags=[{Key=Name, Value=aws-loadmap-eip-2}]"
  • PublicIp, AllocationId の値をメモ。

10. ALB >> ブラウザから確認

ブラウザから確認

http://aws-loadmap-alb-123456789.ap-notheast-1.elb.amazon.aws.com

DNS名の確認

$ aws slbv2 describe-load-balancers ¥
  --names aws-loadmap-alb ¥
  --query LoadBalancers[].DNSName

9. ALB >> ターゲットグループ

ヘルスチェック

$ aws slbv2 describe-target-health ¥
  --target-group-arn ${TGARN}

リスナの作成

  • リスナ=どのような通信をターゲットグループに転送するのかの設定
$ aws elbv2 create-listener ¥
  --load-balancer-arn ${ALBARN} ¥
  --protocol HTTP ¥
  --port 80 ¥
  --default-actions Type=forward,TargetGroupArn=${TGARN}

インスタンス2台の登録

$ aws elbv2 register-targets ¥
  --target-group-arn ${TGARN} ¥
  --targets Id=${INSTANCEID1} Id=${INSTANCEID2}

確認(ターゲットグループID)

$ aws elbv2 describe-target-groups ¥
  --names aws-loadmap-alb-tg ¥
  --query TargetGroups[].TargetGroupArn

作成

$ aws elbv2 create-target-group ¥
  --name aws-loadmap-alb-tg ¥
  --protocol HTTP ¥
  --port 80
  --vpc-id "${VPCID}" ¥
  --health-check-interval-seconds 10 ¥
  --health-check-timeout-seconds 3 ¥
  --healty-threshold-count 2 ¥
  --tags Key=Name,Value=aws-loadmap-alb-sg

8. ALB

確認

$ aws slbv2 describe-load-balancers ¥
  --names aws-loadmap-alb ¥
  --query "LoadBalancers[].[LoadBalancerArn,State]"

作成

$ aws elbv2 create-load-balancer ¥
  --name aws-loadmap-alb ¥
  --subnets ${PUBSUBID1A} ${PUBSUBID1C} ¥
  --security-groups ${ALBSGID} ¥
  --tags Key=Name,Value=aws-loadmap-alb
  • 10分ほどかかる。

7. ALB >> セキュリティグループ

設定(ALB -> EC2 接続を許可(セキュリティグループで))

$ aws ec2 authorize-security-group-ingress ¥
  --group-id ${SGRPID} ¥
  --protocol tcp ¥
  --port 80 ¥
  --source-group ${ALBSGID}

設定(読者 -> ALB 接続を許可(IPアドレスで))

$ aws ec2 authorize-security-group-ingress ¥
  --group-id ${ALBSGID} ¥
  --protocol tcp ¥
  --port 80 ¥
  --cidr ${読者のパブリックIP}/32

作成

$ aws ec2 create-security-group ¥
  --description "Security group for aws loadmap alb" ¥
  --group-name "aws-loadmap-alb-sg" ¥
  --vpc-id "${VPCID}" ¥
  --tag-specifications "ResourceType=security-group, Tags=[{Key=Name, Value=aws-loadmap-alb-sg}]"

6. イメージ(AMI)

接続[2台目]

$ aws ssm start-session ¥
  --target ${INSTANCEID}

確認(インスタンスID)[2台目]

$ aws ec2 describe-instances ¥
  --filters "Name=tag:Name, Values=aws-loadmap-ec2-1" ¥
  --query "Reservations[].Instances[].InstanceId"
[
  "i-xxxxxxxxxxxxxx"
]

イメージから起動[2台目]

$ aws ec2 run-instances ¥
  --image-id ${AMIID} ¥
  --count 1 ¥
  --instance-type t3.micro ¥
  --security-group-ids ${SGRPID} ¥
  --subnet-id ${PUBSUBNETID} ¥
  --iam-instance-profile Name=aws-loadmap-ec2-instance-profile ¥
  --block-device-mappings "DeviceName=/dev/xvdz, Ebs={VolumeSize=8, DeleteOnTermination=true, VolumeType=gp3}" ¥
  --tag-specifications "ResourceType=instance, Tags=[{Key=Name, Value=aws-loadmap-ec2-2}]"

確認(イメージID)

$ aws ec2 describe-images ¥
  --filters "Name=tag:Name, Values=aws-loadmap-ec2-ami" ¥
  --query "Images[].ImageId"

確認(状態)

$ aws ec2 describe-images ¥
  --filters "Name=tag:Name, Values=aws-loadmap-ec2-ami" ¥
  --query "Images[].State"

作成

$ aws ec2 create-image ¥
  --instance-id ${INSTANCEID} ¥
  --name "aws-loadmap-ec2-ami" ¥
  --description "AMI for aws loadmap" ¥
  --tag-specifications "ResourceType=image, Tags=[{Key=Name, Value=aws-loadmap-ec2-ami}]"

5. 接続〜Apacheの起ち上げ

ブラウザから確認

http://x.x.x.x

パブリック IP アドレスの確認

$ aws ec2 describe-instances ¥
  --instance-ids ${INSTANCEID} ¥
  --query "Reservations[].Instances[].PublicIpAddress"

退出

$ exit

Apache の起動

$ sudo systemctl start httpd

Apache の インストール

$ sudo yum install -y httpd
$ sudo yum update -y

IP アドレス(パブリック/プライベート)の確認

$ ip addr show

接続

$ aws ssm start-session ¥
  --target ${INSTANCEID}

4. インスタンス

確認(プライベートIPアドレス)

$ aws ec2 describe-instances ¥
  --instance-ids ${INSTANCEID} ¥
  --query "Reservations[].Instances[].PrivateAddress" ¥
  [ "10.0.x.x" ]

確認(ステータス)

$ aws ec2 describe-instance-status ¥
  --instance-ids ${INSTANCEID}
{
  "InstanceStatuses": [
    {
      :
      "InstanceState": {
        "Code": 16,
        "Name": "running"
      },
      "InstanceStatus": {
        "Details": [
          {
            "Name": "reachability",
            "Status": "passed"
          }
        ],
        "Status": "ok"
      },
      "SystemStatus": {
        "Details": [
          {
            "Name": "reachability",
            "Status": "passed"
          }
        ],
        "Status": "ok"
      }
    }
  ]
}

確認(インスタンスID)

$ aws ec2 describe-instances ¥
  --filters "Name=tag:Name, Values=aws-loadmap-ec2-1" ¥
  --query "Reservations[].Instances[].InstanceId"
[
  "i-xxxxxxxxxxxxxx"
]

起動

$ aws ec2 run-instances ¥
  --image-id ami-0e3861265a3a335cc ¥
  --count 1
  --instance-type t3.micro ¥
  --security-group-ids ${SGRPID} ¥
  --subnet-id ${PUBSUBNETID} ¥
  --iam-instance-profile Name=aws-loadmap-ec2-instance-profile ¥
  --block-device-mappings "DeviceName=/dev/xvda,Ebs={VolumeSize=8, DeleteOnTermination=true, VolumeType=gp3}" ¥
  --tag-specifications "ResourceType=instance, Tags=[{Key=Name, Value=aws-loadmap-ec2-1}]"

最新の Amazon Linux2 の AMI ID の確認

$ aws ssm get-parameters ¥
  --names /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 ¥
  --query "Parameters[].Value"

3. インスタンスプロファイル

確認

$ aws iam get-instance-profile ¥
  --instance-profile-name aws-loadmap-ec2-instance-profile ¥
  --query "InstanceProfile.Roles[].[RoleName,AssumeRolePolicyDocument]"

IAM ロール の 引渡し

$ aws iam add-role-to-instance-profile ¥
  --instance-profile-name aws-loadmap-ec2-instance-profile ¥
  --role-name aws-loadmap-ec2-role

作成

$ aws iam create-instance-profile ¥
  --instance-profile-name aws-loadmap-ec2-instance-profile

2. IAM ロール

確認

$ aws iam list-attached-role-policies ¥
  --role-name aws-loadmap-ec2-role

IAM ロール に 権限 を 設定

$ aws iam attach-role-policy ¥
  --role-name aws-loadmap-ec2-role ¥
  --policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore

IAM ロール を IAM ポリシー から 作成

$ aws iam create-role ¥
  --role-name aws-loadmap-ec2-role ¥
  --assume-role-policy-document file://ec2-role-trust-policy.json

IAM ポリシー プロファイルの作成

ec2-role-trust-policy.json

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": { "Service": "ec2.amazonaws.com" },
      "Action": "sts:AssumeRole"
    }
  ]
}

1. セキュリティグループ

確認

$ aws ec2 describe-security-groups ¥
  --filters "Name=tag:Name, Values=aws-loadmap-ec2-sg" ¥
  --query "SecurityGroups[].IpPermissions"

設定(80番ポートを許可)

$ aws ec2 authorize-security-group-ingress ¥
  --group-id ${SGRPID} ¥
  --protocol tcp ¥
  --port 80 ¥
  --cidr ${読者のパブリックIP}/32

作成

$ aws ec2 create-security-group ¥
  --description "Security group for aws loadmap ec2" ¥
  --group-name "aws-loadmap-ec2-sg" ¥
  --vpc-id "${VPCID}" ¥
  --tag-specifications "ResourceType=security-group, Tags=[{Key=Name, Value=aws-loadmap-ec2-sg}]"

2.2 ネットワークの構築

5. パブリックサブネットへの設定

EC2 起動時にパブリックIPアドレスを拾うよう設定

$ aws ec2 modify-subnet-attribute ¥
  --subnet-id ${PUBSUBID1A} ¥
  --map-public-ip-on-launch
$ aws ec2 modify-subnet-attribute ¥
  --subnet-id ${PUBSUBID1C} ¥
  --map-public-ip-on-launch

パブリックサブネットへルートテーブルをアタッチ

$ aws ec2 associate-route-table ¥
  --subnet-id ${PUBSUBID1A} ¥
  --route-table-id ${ROUTETBLID} ¥
$ aws ec2 associate-route-table ¥
  --subnet-id ${PUBSUBID1C} ¥
  --route-table-id ${ROUTETBLID} ¥

4. ルートテーブル

確認 - ルート to インターネット

$ aws ec2 describe-route-tables ¥
  --filters "Name=route-table-id, Values=${ROUTETBLID}" ¥
  --query "RouteTables[].Routes" ¥
  --output table

作成 - ルート to インターネット

$ aws ec2 create-route ¥
  --route-table-id ${ROUTETBLID} ¥
  --destination-cidr-block 0.0.0.0/0 ¥
  --gateway-id ${IGWYID}

確認 - ルートテーブル

$ aws ec2 describe-route-tables ¥
  --filters "Name=route-table-id, Values=${ROUTETBLID}" ¥
  --query "RouteTables[].Routes"
  --output table

作成 - ルートテーブル

$ aws ec2 create-route-table ¥
  --vpc-id ${VPCID} ¥
  --tag-specifications 'ResourceType=route-table, Tags=[{Key=Name, value=aws-loadmap-public-route-table}]'

3. インターネットゲートウェイ

VPC に 適用

$ aws ec2 attach-internet-gateway ¥
  --internet-gateway-id ${IGWYID} ¥
  --vpc-id ${VPCID}

作成

$ aws ec2 create-internet-gateway ¥
  --tag-specifications 'ResourceType=internet-gateway, Tags=[{Key=Name, Value=aws-loadmap-igw}]'

2. サブネット

確認

$ aws ec2 describe-subnets ¥
  --filters "Name=vpc-id, Values=${VPCID}" ¥
  --query "Subnets[].[Tags.CidrBlock]"

作成

プライベートサブネット on 1c

$ aws ec2 create-subnet ¥
  --vpc-id ${VPCID} ¥
  --availability-zone ap-northeast-1c 
  --cidr-block 10.0.11.0/24
  --tag-specifications 'ResourceType=subnet, Tags=[{Key=Name, Value=aws-loadmap-private-subnet-c'

プライベートサブネット on 1a

$ aws ec2 create-subnet ¥
  --vpc-id ${VPCID} ¥
  --availability-zone ap-northeast-1a 
  --cidr-block 10.0.10.0/24
  --tag-specifications 'ResourceType=subnet, Tags=[{Key=Name, Value=aws-loadmap-private-subnet-a'

パブリックサブネット on 1c

$ aws ec2 create-subnet ¥
  --vpc-id ${VPCID} ¥
  --availability-zone ap-northeast-1c ¥
  --cidr-block 10.0.1.0/24
  --tag-specifications 'ResourceType=subnet, Tags=[{Key=Name, Value=aws-loadmap-public-subnet-c'

パブリックサブネット on 1a

$ aws ec2 create-subnet ¥
  --vpc-id ${VPCID} ¥
  --availability-zone ap-northeast-1a ¥
  --cidr-block 10.0.0.0/24 ¥
  --tag-specifications 'ResourceType=subnet, Tags=[{Key=Name, Value=aws-loadmap-public-subnet-a}]'

1. VPC

確認

$ aws ec2 describe-vpcs ¥
  --filters "Name=tag:Name,Values=aws-loadmap-vpc" ¥
  --query "Vpcs[].[State,VpcId]"
$ aws ec2 describe-vpcs

作成

$ aws ec2 create-vpc ¥
  --cidr-block 10.0.0.0/16 ¥
  --tag-specifications 'ResourceType=vpc, Tags=[{Key=Name, Value=aws-loadmap-vpc}]'

2.1 構築の基本

エラーメッセージへの対処:

  1. permission denied
    • IAMロールやIAMポリシなどの設定を確認。
  2. usage:
    • スペースの有無やスペルミスなどを確認。
  3. 500
    • 権限の不足、時間経過による権限の揮発などがないか確認。

本書籍チュートリアルにて実施すること:

  1. ネットワークの構築
  2. サーバの構築
  3. データベースの構築