「AWS Hands-on for Beginners 監視編 サーバーのモニタリングの基本を学ぼう 」をAWS CLIでやってみる

https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-monitoring-2022-reg-event.html?trk=aws_introduction_page

上記、「AWS Hands-on for Beginners 監視編 サーバーのモニタリングの基本を学ぼう」 をAWS CLIでやってみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297641/0de51707-3ac5-0625-32ae-ec79e0c8787c.png)
ハンズオンから引用
# 1.CloudFormationでリソースの作成
:::note info
テンプレートファイルはハンズオンページからダウンロードしたものを使用。
:::
:::note warn
インスタンス作成時にエラーになるため、テンプレートファイル内のRDSのインスタンスは**db.t2.micro**から**db.t3.micro**に変更
:::
## 変数設定
```bash:コマンド
# スタック名
STACK_NAME="monitoring-1"
echo ${STACK_NAME}

# テンプレートファイル名
TEMPLATE_BODY="monitoring-1.yaml"
echo ${TEMPLATE_BODY}
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ # スタック名
[cloudshell-user@ip-10-132-88-36 ~]$ STACK_NAME="monitoring-1"
[cloudshell-user@ip-10-132-88-36 ~]$ echo ${STACK_NAME}
monitoring-1
[cloudshell-user@ip-10-132-88-36 ~]$ 
[cloudshell-user@ip-10-132-88-36 ~]$ # テンプレートファイル名
[cloudshell-user@ip-10-132-88-36 ~]$ TEMPLATE_BODY="monitoring-1.yaml"
[cloudshell-user@ip-10-132-88-36 ~]$ echo ${TEMPLATE_BODY}
monitoring-1.yaml
```
## スタック作成
```bash:コマンド
aws cloudformation create-stack \
    --stack-name ${STACK_NAME} \
    --template-body file://${TEMPLATE_BODY} \
    --capabilities CAPABILITY_NAMED_IAM
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ aws cloudformation create-stack \
>     --stack-name ${STACK_NAME} \
>     --template-body file://${TEMPLATE_BODY} \
>     --capabilities CAPABILITY_NAMED_IAM
{
    "StackId": "arn:aws:cloudformation:ap-northeast-1:999999999999:stack/monitoring-1/34db9450-30ee-11ef-92cd-0a227c45dc8d"
}
```
## スタックの出力確認
```bash:コマンド
aws cloudformation describe-stacks --stack-name ${STACK_NAME}
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ aws cloudformation describe-stacks --stack-name ${STACK_NAME}
{
    "Stacks": [
        {
            "StackId": "arn:aws:cloudformation:ap-northeast-1:999999999999:stack/monitoring-1/34db9450-30ee-11ef-92cd-0a227c45dc8d",
            "StackName": "monitoring-1",
            "Description": "AWS Hands-on for Beginners monitoing-1 template",
            "Parameters": [
                {
                    "ParameterKey": "RDSInstanceType",
                    "ParameterValue": "db.t3.micro"
                },
                {
                    "ParameterKey": "EC2InstanceType",
                    "ParameterValue": "t2.micro"
                },
                {
                    "ParameterKey": "DBUser",
                    "ParameterValue": "dbmaster"
                },
                {
                    "ParameterKey": "DBPassword",
                    "ParameterValue": "****"
                },
                {
                    "ParameterKey": "EC2AMI",
                    "ParameterValue": "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2",
                    "ResolvedValue": "ami-029dc392355a76964"
                }
            ],
            "CreationTime": "2024-06-22T23:21:52.045000+00:00",
            "RollbackConfiguration": {},
            "StackStatus": "CREATE_COMPLETE",
            "DisableRollback": false,
            "NotificationARNs": [],
            "Capabilities": [
                "CAPABILITY_NAMED_IAM"
            ],
            "Outputs": [
                {
                    "OutputKey": "PrivateSubnet1",
                    "OutputValue": "subnet-04b281a734ba8c075",
                    "Description": "PrivateSubnet 1"
                },
                {
                    "OutputKey": "PrivateSubnet2",
                    "OutputValue": "subnet-06f261f48f7beae0f",
                    "Description": "PrivateSubnet 2"
                },
                {
                    "OutputKey": "EC2WebServer02",
                    "OutputValue": "i-02cee7d18cb05c8e9"
                },
                {
                    "OutputKey": "EC2WebServer01",
                    "OutputValue": "i-0b8d540d2dc6e0497"
                },
                {
                    "OutputKey": "EC2WebServer02DNS",
                    "OutputValue": "ec2-54-238-239-91.ap-northeast-1.compute.amazonaws.com"
                },
                {
                    "OutputKey": "VPCID",
                    "OutputValue": "vpc-09fe2194c2d22f586",
                    "Description": "VPC ID"
                },
                {
                    "OutputKey": "EC2WebServer01DNS",
                    "OutputValue": "ec2-52-192-9-168.ap-northeast-1.compute.amazonaws.com"
                },
                {
                    "OutputKey": "FrontLBEndpoint",
                    "OutputValue": "monitoring-1-elb-182076190.ap-northeast-1.elb.amazonaws.com"
                },
                {
                    "OutputKey": "PublicSubnet2",
                    "OutputValue": "subnet-065d757166972e0c9",
                    "Description": "PublicSubnet 2"
                },
                {
                    "OutputKey": "RDSEndpointAddress",
                    "OutputValue": "monitoring-1-rds.clacqicsiqrt.ap-northeast-1.rds.amazonaws.com"
                },
                {
                    "OutputKey": "PublicSubnet1",
                    "OutputValue": "subnet-08cda4950b87852d6",
                    "Description": "PublicSubnet 1"
                }
            ],
            "Tags": [],
            "EnableTerminationProtection": false,
            "DriftInformation": {
                "StackDriftStatus": "NOT_CHECKED"
            }
        }
    ]
}
```
## リソース物理IDの確認
```bash:コマンド
aws cloudformation describe-stack-resources --stack-name ${STACK_NAME}
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ aws cloudformation describe-stack-resources --stack-name ${STACK_NAME}
{
    "StackResources": [
        {
            "StackName": "monitoring-1",
            "StackId": "arn:aws:cloudformation:ap-northeast-1:999999999999:stack/monitoring-1/34db9450-30ee-11ef-92cd-0a227c45dc8d",
            "LogicalResourceId": "CFnVPC",
            "PhysicalResourceId": "vpc-09fe2194c2d22f586",
            "ResourceType": "AWS::EC2::VPC",
            "Timestamp": "2024-06-22T23:22:07.508000+00:00",
            "ResourceStatus": "CREATE_COMPLETE",
            "DriftInformation": {
                "StackResourceDriftStatus": "NOT_CHECKED"
            }
        },
        {
            "StackName": "monitoring-1",
            "StackId": "arn:aws:cloudformation:ap-northeast-1:999999999999:stack/monitoring-1/34db9450-30ee-11ef-92cd-0a227c45dc8d",
            "LogicalResourceId": "CFnVPCIGW",
            "PhysicalResourceId": "igw-05d3adcc9cd9d9759",
            "ResourceType": "AWS::EC2::InternetGateway",
            "Timestamp": "2024-06-22T23:22:11.878000+00:00",
            "ResourceStatus": "CREATE_COMPLETE",
            "DriftInformation": {
                "StackResourceDriftStatus": "NOT_CHECKED"
            }
        },
        {
            "StackName": "monitoring-1",
            "StackId": "arn:aws:cloudformation:ap-northeast-1:999999999999:stack/monitoring-1/34db9450-30ee-11ef-92cd-0a227c45dc8d",
            "LogicalResourceId": "CFnVPCIGWAttach",
            "PhysicalResourceId": "IGW|vpc-09fe2194c2d22f586",
            "ResourceType": "AWS::EC2::VPCGatewayAttachment",
            "Timestamp": "2024-06-22T23:22:10.755000+00:00",
            "ResourceStatus": "CREATE_COMPLETE",
            "DriftInformation": {
                "StackResourceDriftStatus": "NOT_CHECKED"
            }
        },
        {
            "StackName": "monitoring-1",
            "StackId": "arn:aws:cloudformation:ap-northeast-1:999999999999:stack/monitoring-1/34db9450-30ee-11ef-92cd-0a227c45dc8d",
            "LogicalResourceId": "DBInstance",
            "PhysicalResourceId": "monitoring-1-rds",
            "ResourceType": "AWS::RDS::DBInstance",
            "Timestamp": "2024-06-22T23:34:59.512000+00:00",
            "ResourceStatus": "CREATE_COMPLETE",
            "DriftInformation": {
                "StackResourceDriftStatus": "NOT_CHECKED"
            }
        },
        {
            "StackName": "monitoring-1",
            "StackId": "arn:aws:cloudformation:ap-northeast-1:999999999999:stack/monitoring-1/34db9450-30ee-11ef-92cd-0a227c45dc8d",
            "LogicalResourceId": "DBSubnetGroup",
            "PhysicalResourceId": "monitoring-1-dbsubnetgroup-f2xnw5qizmae",
            "ResourceType": "AWS::RDS::DBSubnetGroup",
            "Timestamp": "2024-06-22T23:22:13.573000+00:00",
            "ResourceStatus": "CREATE_COMPLETE",
            "DriftInformation": {
                "StackResourceDriftStatus": "NOT_CHECKED"
            }
        },
        {
            "StackName": "monitoring-1",
            "StackId": "arn:aws:cloudformation:ap-northeast-1:999999999999:stack/monitoring-1/34db9450-30ee-11ef-92cd-0a227c45dc8d",
            "LogicalResourceId": "EC2WebServer01",
            "PhysicalResourceId": "i-0b8d540d2dc6e0497",
            "ResourceType": "AWS::EC2::Instance",
            "Timestamp": "2024-06-22T23:25:00.719000+00:00",
            "ResourceStatus": "CREATE_COMPLETE",
            "DriftInformation": {
                "StackResourceDriftStatus": "NOT_CHECKED"
            }
        },
        {
            "StackName": "monitoring-1",
            "StackId": "arn:aws:cloudformation:ap-northeast-1:999999999999:stack/monitoring-1/34db9450-30ee-11ef-92cd-0a227c45dc8d",
            "LogicalResourceId": "EC2WebServer02",
            "PhysicalResourceId": "i-02cee7d18cb05c8e9",
            "ResourceType": "AWS::EC2::Instance",
            "Timestamp": "2024-06-22T23:24:50.409000+00:00",
            "ResourceStatus": "CREATE_COMPLETE",
            "DriftInformation": {
                "StackResourceDriftStatus": "NOT_CHECKED"
            }
        },
        {
            "StackName": "monitoring-1",
            "StackId": "arn:aws:cloudformation:ap-northeast-1:999999999999:stack/monitoring-1/34db9450-30ee-11ef-92cd-0a227c45dc8d",
            "LogicalResourceId": "FrontLB",
            "PhysicalResourceId": "arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:loadbalancer/app/monitoring-1-elb/c147aef4db266283",
            "ResourceType": "AWS::ElasticLoadBalancingV2::LoadBalancer",
            "Timestamp": "2024-06-22T23:24:49.195000+00:00",
            "ResourceStatus": "CREATE_COMPLETE",
            "DriftInformation": {
                "StackResourceDriftStatus": "NOT_CHECKED"
            }
        },
        {
            "StackName": "monitoring-1",
            "StackId": "arn:aws:cloudformation:ap-northeast-1:999999999999:stack/monitoring-1/34db9450-30ee-11ef-92cd-0a227c45dc8d",
            "LogicalResourceId": "FrontLBListener",
            "PhysicalResourceId": "arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:listener/app/monitoring-1-elb/c147aef4db266283/f8e0379a181bee32",
            "ResourceType": "AWS::ElasticLoadBalancingV2::Listener",
            "Timestamp": "2024-06-22T23:25:10.177000+00:00",
            "ResourceStatus": "CREATE_COMPLETE",
            "DriftInformation": {
                "StackResourceDriftStatus": "NOT_CHECKED"
            }
        },
        {
            "StackName": "monitoring-1",
            "StackId": "arn:aws:cloudformation:ap-northeast-1:999999999999:stack/monitoring-1/34db9450-30ee-11ef-92cd-0a227c45dc8d",
            "LogicalResourceId": "FrontLBTargetGroup",
            "PhysicalResourceId": "arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/monitoring-1-tg/0726cfe1b71c5746",
            "ResourceType": "AWS::ElasticLoadBalancingV2::TargetGroup",
            "Timestamp": "2024-06-22T23:25:08.271000+00:00",
            "ResourceStatus": "CREATE_COMPLETE",
            "DriftInformation": {
                "StackResourceDriftStatus": "NOT_CHECKED"
            }
        },
        {
            "StackName": "monitoring-1",
            "StackId": "arn:aws:cloudformation:ap-northeast-1:999999999999:stack/monitoring-1/34db9450-30ee-11ef-92cd-0a227c45dc8d",
            "LogicalResourceId": "IAMInstanceProfile",
            "PhysicalResourceId": "monitoring-1-IAMInstanceProfile-gTiXgLxPzjHq",
            "ResourceType": "AWS::IAM::InstanceProfile",
            "Timestamp": "2024-06-22T23:24:26.474000+00:00",
            "ResourceStatus": "CREATE_COMPLETE",
            "DriftInformation": {
                "StackResourceDriftStatus": "NOT_CHECKED"
            }
        },
        {
            "StackName": "monitoring-1",
            "StackId": "arn:aws:cloudformation:ap-northeast-1:999999999999:stack/monitoring-1/34db9450-30ee-11ef-92cd-0a227c45dc8d",
            "LogicalResourceId": "Monitoring1EC2RoleforSSM",
            "PhysicalResourceId": "Monitoring1EC2RoleforSSM",
            "ResourceType": "AWS::IAM::Role",
            "Timestamp": "2024-06-22T23:22:14.238000+00:00",
            "ResourceStatus": "CREATE_COMPLETE",
            "DriftInformation": {
                "StackResourceDriftStatus": "NOT_CHECKED"
            }
        },
        {
            "StackName": "monitoring-1",
            "StackId": "arn:aws:cloudformation:ap-northeast-1:999999999999:stack/monitoring-1/34db9450-30ee-11ef-92cd-0a227c45dc8d",
            "LogicalResourceId": "PrivateSubnet1",
            "PhysicalResourceId": "subnet-04b281a734ba8c075",
            "ResourceType": "AWS::EC2::Subnet",
            "Timestamp": "2024-06-22T23:22:12.421000+00:00",
            "ResourceStatus": "CREATE_COMPLETE",
            "DriftInformation": {
                "StackResourceDriftStatus": "NOT_CHECKED"
            }
        },
        {
            "StackName": "monitoring-1",
            "StackId": "arn:aws:cloudformation:ap-northeast-1:999999999999:stack/monitoring-1/34db9450-30ee-11ef-92cd-0a227c45dc8d",
            "LogicalResourceId": "PrivateSubnet2",
            "PhysicalResourceId": "subnet-06f261f48f7beae0f",
            "ResourceType": "AWS::EC2::Subnet",
            "Timestamp": "2024-06-22T23:22:12.823000+00:00",
            "ResourceStatus": "CREATE_COMPLETE",
            "DriftInformation": {
                "StackResourceDriftStatus": "NOT_CHECKED"
            }
        },
        {
            "StackName": "monitoring-1",
            "StackId": "arn:aws:cloudformation:ap-northeast-1:999999999999:stack/monitoring-1/34db9450-30ee-11ef-92cd-0a227c45dc8d",
            "LogicalResourceId": "PublicRoute",
            "PhysicalResourceId": "rtb-005ca0ece222251e1|0.0.0.0/0",
            "ResourceType": "AWS::EC2::Route",
            "Timestamp": "2024-06-22T23:22:21.821000+00:00",
            "ResourceStatus": "CREATE_COMPLETE",
            "DriftInformation": {
                "StackResourceDriftStatus": "NOT_CHECKED"
            }
        },
        {
            "StackName": "monitoring-1",
            "StackId": "arn:aws:cloudformation:ap-northeast-1:999999999999:stack/monitoring-1/34db9450-30ee-11ef-92cd-0a227c45dc8d",
            "LogicalResourceId": "PublicRouteTable",
            "PhysicalResourceId": "rtb-005ca0ece222251e1",
            "ResourceType": "AWS::EC2::RouteTable",
            "Timestamp": "2024-06-22T23:22:19.653000+00:00",
            "ResourceStatus": "CREATE_COMPLETE",
            "DriftInformation": {
                "StackResourceDriftStatus": "NOT_CHECKED"
            }
        },
        {
            "StackName": "monitoring-1",
            "StackId": "arn:aws:cloudformation:ap-northeast-1:999999999999:stack/monitoring-1/34db9450-30ee-11ef-92cd-0a227c45dc8d",
            "LogicalResourceId": "PublicSubnet1",
            "PhysicalResourceId": "subnet-08cda4950b87852d6",
            "ResourceType": "AWS::EC2::Subnet",
            "Timestamp": "2024-06-22T23:22:12.842000+00:00",
            "ResourceStatus": "CREATE_COMPLETE",
            "DriftInformation": {
                "StackResourceDriftStatus": "NOT_CHECKED"
            }
        },
        {
            "StackName": "monitoring-1",
            "StackId": "arn:aws:cloudformation:ap-northeast-1:999999999999:stack/monitoring-1/34db9450-30ee-11ef-92cd-0a227c45dc8d",
            "LogicalResourceId": "PublicSubnet1Assoc",
            "PhysicalResourceId": "rtbassoc-0945997393dccb837",
            "ResourceType": "AWS::EC2::SubnetRouteTableAssociation",
            "Timestamp": "2024-06-22T23:22:15.092000+00:00",
            "ResourceStatus": "CREATE_COMPLETE",
            "DriftInformation": {
                "StackResourceDriftStatus": "NOT_CHECKED"
            }
        },
        {
            "StackName": "monitoring-1",
            "StackId": "arn:aws:cloudformation:ap-northeast-1:999999999999:stack/monitoring-1/34db9450-30ee-11ef-92cd-0a227c45dc8d",
            "LogicalResourceId": "PublicSubnet2",
            "PhysicalResourceId": "subnet-065d757166972e0c9",
            "ResourceType": "AWS::EC2::Subnet",
            "Timestamp": "2024-06-22T23:22:12.850000+00:00",
            "ResourceStatus": "CREATE_COMPLETE",
            "DriftInformation": {
                "StackResourceDriftStatus": "NOT_CHECKED"
            }
        },
        {
            "StackName": "monitoring-1",
            "StackId": "arn:aws:cloudformation:ap-northeast-1:999999999999:stack/monitoring-1/34db9450-30ee-11ef-92cd-0a227c45dc8d",
            "LogicalResourceId": "PublicSubnet2Assoc",
            "PhysicalResourceId": "rtbassoc-08ca3a7c0f8be03aa",
            "ResourceType": "AWS::EC2::SubnetRouteTableAssociation",
            "Timestamp": "2024-06-22T23:22:14.832000+00:00",
            "ResourceStatus": "CREATE_COMPLETE",
            "DriftInformation": {
                "StackResourceDriftStatus": "NOT_CHECKED"
            }
        },
        {
            "StackName": "monitoring-1",
            "StackId": "arn:aws:cloudformation:ap-northeast-1:999999999999:stack/monitoring-1/34db9450-30ee-11ef-92cd-0a227c45dc8d",
            "LogicalResourceId": "SecurityGroupDB",
            "PhysicalResourceId": "sg-0b56c8512f3c29157",
            "ResourceType": "AWS::EC2::SecurityGroup",
            "Timestamp": "2024-06-22T23:22:11.752000+00:00",
            "ResourceStatus": "CREATE_COMPLETE",
            "DriftInformation": {
                "StackResourceDriftStatus": "NOT_CHECKED"
            }
        },
        {
            "StackName": "monitoring-1",
            "StackId": "arn:aws:cloudformation:ap-northeast-1:999999999999:stack/monitoring-1/34db9450-30ee-11ef-92cd-0a227c45dc8d",
            "LogicalResourceId": "SecurityGroupLB",
            "PhysicalResourceId": "sg-0c7c991af0197422f",
            "ResourceType": "AWS::EC2::SecurityGroup",
            "Timestamp": "2024-06-22T23:22:11.626000+00:00",
            "ResourceStatus": "CREATE_COMPLETE",
            "DriftInformation": {
                "StackResourceDriftStatus": "NOT_CHECKED"
            }
        },
        {
            "StackName": "monitoring-1",
            "StackId": "arn:aws:cloudformation:ap-northeast-1:999999999999:stack/monitoring-1/34db9450-30ee-11ef-92cd-0a227c45dc8d",
            "LogicalResourceId": "SecurityGroupWebServer",
            "PhysicalResourceId": "sg-0f97e53a072e77388",
            "ResourceType": "AWS::EC2::SecurityGroup",
            "Timestamp": "2024-06-22T23:22:12.372000+00:00",
            "ResourceStatus": "CREATE_COMPLETE",
            "DriftInformation": {
                "StackResourceDriftStatus": "NOT_CHECKED"
            }
        }
    ]
}
```
# 2. WordPressの初期設定
WebUIからの設定のため省略

# 3. CloudWatchメトリクスの確認
## インスタンスIDの取得
```bash:コマンド
# Ec2インスタンス1
OUTPUTKEY='EC2WebServer01'
echo ${OUTPUTKEY}

EC2_INSTANCE_ID_1=$(
    aws cloudformation describe-stacks \
        --stack-name ${STACK_NAME} \
        --query "Stacks[*].Outputs[?OutputKey=='${OUTPUTKEY}'].OutputValue" \
        --output text
) \
&& echo ${EC2_INSTANCE_ID_1}

# Ec2インスタンス2
OUTPUTKEY='EC2WebServer02'
echo ${OUTPUTKEY}

EC2_INSTANCE_ID_2=$(
    aws cloudformation describe-stacks \
        --stack-name ${STACK_NAME} \
        --query "Stacks[*].Outputs[?OutputKey=='${OUTPUTKEY}'].OutputValue" \
        --output text
) \
&& echo ${EC2_INSTANCE_ID_2}

# EC2 AMI
PARAMETERKEY='EC2AMI'
echo ${PARAMETERKEY}

EC2_AMI=$(
    aws cloudformation describe-stacks \
        --stack-name ${STACK_NAME} \
        --query "Stacks[*].Parameters[?ParameterKey=='${PARAMETERKEY}'].ResolvedValue" \
        --output text
) \
&& echo ${EC2_AMI}

# ALB ARN
LOGICALRESOURCEID='FrontLB'
echo ${LOGICALRESOURCEID}

ALB_ARN=$(
    aws cloudformation describe-stack-resources \
        --stack-name ${STACK_NAME} \
        --query "StackResources[?LogicalResourceId=='${LOGICALRESOURCEID}'].PhysicalResourceId" \
        --output text
) \
&& echo ${ALB_ARN}

last_part=$(echo "${ALB_ARN}" | awk -F':' '{print $NF}') \
&& DIMENSIONS_ALB=$(echo ${last_part} | rev | cut -d'/' -f1-3 | rev) \
&& echo ${DIMENSIONS_ALB}

# TARGETGROUP ARN
LOGICALRESOURCEID='FrontLBTargetGroup'
echo ${LOGICALRESOURCEID}

TARGET_GROUP_ARN=$(
    aws cloudformation describe-stack-resources \
        --stack-name ${STACK_NAME} \
        --query "StackResources[?LogicalResourceId=='${LOGICALRESOURCEID}'].PhysicalResourceId" \
        --output text
) \
&& echo ${TARGET_GROUP_ARN}

last_part=$(echo "${TARGET_GROUP_ARN}" | awk -F':' '{print $NF}') \
&& DIMENSIONS_TG=$(echo ${last_part} | rev | cut -d'/' -f1-3 | rev) \
&& echo ${DIMENSIONS_TG}

# RDS
RDS_INSTANCE_ID=$(
    aws cloudformation describe-stack-resources \
        --stack-name ${STACK_NAME} \
        --query "StackResources[?LogicalResourceId=='DBInstance'].PhysicalResourceId" \
        --output text
) \
&& echo ${RDS_INSTANCE_ID}
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ # Ec2インスタンス1
[cloudshell-user@ip-10-132-88-36 ~]$ OUTPUTKEY='EC2WebServer01'
[cloudshell-user@ip-10-132-88-36 ~]$ echo ${OUTPUTKEY}
EC2WebServer01
[cloudshell-user@ip-10-132-88-36 ~]$ 
[cloudshell-user@ip-10-132-88-36 ~]$ EC2_INSTANCE_ID_1=$(
>     aws cloudformation describe-stacks \
>         --stack-name ${STACK_NAME} \
>         --query "Stacks[*].Outputs[?OutputKey=='${OUTPUTKEY}'].OutputValue" \
>         --output text
> ) \
> && echo ${EC2_INSTANCE_ID_1}
i-0b8d540d2dc6e0497
[cloudshell-user@ip-10-132-88-36 ~]$ 
[cloudshell-user@ip-10-132-88-36 ~]$ # Ec2インスタンス2
[cloudshell-user@ip-10-132-88-36 ~]$ OUTPUTKEY='EC2WebServer02'
[cloudshell-user@ip-10-132-88-36 ~]$ echo ${OUTPUTKEY}
EC2WebServer02
[cloudshell-user@ip-10-132-88-36 ~]$ 
[cloudshell-user@ip-10-132-88-36 ~]$ EC2_INSTANCE_ID_2=$(
>     aws cloudformation describe-stacks \
>         --stack-name ${STACK_NAME} \
>         --query "Stacks[*].Outputs[?OutputKey=='${OUTPUTKEY}'].OutputValue" \
>         --output text
> ) \
> && echo ${EC2_INSTANCE_ID_2}
i-02cee7d18cb05c8e9
[cloudshell-user@ip-10-132-88-36 ~]$ 
[cloudshell-user@ip-10-132-88-36 ~]$ # EC2 AMI
[cloudshell-user@ip-10-132-88-36 ~]$ PARAMETERKEY='EC2AMI'
[cloudshell-user@ip-10-132-88-36 ~]$ echo ${PARAMETERKEY}
EC2AMI
[cloudshell-user@ip-10-132-88-36 ~]$ 
[cloudshell-user@ip-10-132-88-36 ~]$ EC2_AMI=$(
>     aws cloudformation describe-stacks \
>         --stack-name ${STACK_NAME} \
>         --query "Stacks[*].Parameters[?ParameterKey=='${PARAMETERKEY}'].ResolvedValue" \
>         --output text
> ) \
> && echo ${EC2_AMI}
ami-029dc392355a76964
[cloudshell-user@ip-10-132-88-36 ~]$ 
[cloudshell-user@ip-10-132-88-36 ~]$ # ALB ARN
[cloudshell-user@ip-10-132-88-36 ~]$ LOGICALRESOURCEID='FrontLB'
[cloudshell-user@ip-10-132-88-36 ~]$ echo ${LOGICALRESOURCEID}
FrontLB
[cloudshell-user@ip-10-132-88-36 ~]$ 
[cloudshell-user@ip-10-132-88-36 ~]$ ALB_ARN=$(
>     aws cloudformation describe-stack-resources \
>         --stack-name ${STACK_NAME} \
>         --query "StackResources[?LogicalResourceId=='${LOGICALRESOURCEID}'].PhysicalResourceId" \
>         --output text
> ) \
> && echo ${ALB_ARN}
arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:loadbalancer/app/monitoring-1-elb/c147aef4db266283
[cloudshell-user@ip-10-132-88-36 ~]$ 
[cloudshell-user@ip-10-132-88-36 ~]$ last_part=$(echo "${ALB_ARN}" | awk -F':' '{print $NF}') \
> && DIMENSIONS_ALB=$(echo ${last_part} | rev | cut -d'/' -f1-3 | rev) \
> && echo ${DIMENSIONS_ALB}
app/monitoring-1-elb/c147aef4db266283
[cloudshell-user@ip-10-132-88-36 ~]$ 
[cloudshell-user@ip-10-132-88-36 ~]$ # TARGETGROUP ARN
[cloudshell-user@ip-10-132-88-36 ~]$ LOGICALRESOURCEID='FrontLBTargetGroup'
[cloudshell-user@ip-10-132-88-36 ~]$ echo ${LOGICALRESOURCEID}
FrontLBTargetGroup
[cloudshell-user@ip-10-132-88-36 ~]$ 
[cloudshell-user@ip-10-132-88-36 ~]$ TARGET_GROUP_ARN=$(
>     aws cloudformation describe-stack-resources \
>         --stack-name ${STACK_NAME} \
>         --query "StackResources[?LogicalResourceId=='${LOGICALRESOURCEID}'].PhysicalResourceId" \
>         --output text
> ) \
> && echo ${TARGET_GROUP_ARN}
arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/monitoring-1-tg/0726cfe1b71c5746
[cloudshell-user@ip-10-132-88-36 ~]$ 
[cloudshell-user@ip-10-132-88-36 ~]$ last_part=$(echo "${TARGET_GROUP_ARN}" | awk -F':' '{print $NF}') \
> && DIMENSIONS_TG=$(echo ${last_part} | rev | cut -d'/' -f1-3 | rev) \
> && echo ${DIMENSIONS_TG}
targetgroup/monitoring-1-tg/0726cfe1b71c5746
[cloudshell-user@ip-10-132-88-36 ~]$ 
[cloudshell-user@ip-10-132-88-36 ~]$ # RDS
[cloudshell-user@ip-10-132-88-36 ~]$ RDS_INSTANCE_ID=$(
>     aws cloudformation describe-stack-resources \
>         --stack-name ${STACK_NAME} \
>         --query "StackResources[?LogicalResourceId=='DBInstance'].PhysicalResourceId" \
>         --output text
> ) \
> && echo ${RDS_INSTANCE_ID}
monitoring-1-rds
```
## 取得期間の指定
```bash:コマンド
# 現在時間のUnixタイムスタンプ
END_TIME=$(date +%s)
echo ${END_TIME}

# 1時間前のUnixタイムスタンプ
START_TIME=$(date -d '-2 hours' +%s)
echo ${START_TIME}
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ # 現在時間のUnixタイムスタンプ
[cloudshell-user@ip-10-132-88-36 ~]$ END_TIME=$(date +%s)
[cloudshell-user@ip-10-132-88-36 ~]$ echo ${END_TIME}
1719100110
[cloudshell-user@ip-10-132-88-36 ~]$ 
[cloudshell-user@ip-10-132-88-36 ~]$ # 1時間前のUnixタイムスタンプ
[cloudshell-user@ip-10-132-88-36 ~]$ START_TIME=$(date -d '-2 hours' +%s)
[cloudshell-user@ip-10-132-88-36 ~]$ echo ${START_TIME}
1719092910
```
## メトリクスの取得
### EC2 CPU使用率（CPUUtilization）
```bash:コマンド
aws cloudwatch get-metric-statistics \
    --metric-name CPUUtilization \
    --start-time $(date -d @$START_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
    --end-time $(date -d @$END_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
    --period 300 \
    --namespace AWS/EC2 \
    --statistics Average \
    --dimensions Name=InstanceId,Value=${EC2_INSTANCE_ID_1}
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ aws cloudwatch get-metric-statistics \
>     --metric-name CPUUtilization \
>     --start-time $(date -d @$START_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
>     --end-time $(date -d @$END_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
>     --period 300 \
>     --namespace AWS/EC2 \
>     --statistics Average \
>     --dimensions Name=InstanceId,Value=${EC2_INSTANCE_ID_1}
{
    "Label": "CPUUtilization",
    "Datapoints": [
        {
            "Timestamp": "2024-06-22T23:23:00+00:00",
            "Average": 19.2,
            "Unit": "Percent"
        },
        {
            "Timestamp": "2024-06-22T23:28:00+00:00",
            "Average": 0.8721499905784793,
            "Unit": "Percent"
        },
        {
            "Timestamp": "2024-06-22T23:33:00+00:00",
            "Average": 0.8632299397630666,
            "Unit": "Percent"
        },
        {
            "Timestamp": "2024-06-22T23:38:00+00:00",
            "Average": 2.629706579187167,
            "Unit": "Percent"
        },
        {
            "Timestamp": "2024-06-22T23:43:00+00:00",
            "Average": 1.4480156859787752,
            "Unit": "Percent"
        }
    ]
}
```
### EC2 ネットワーク入力（NetworkIn）
```bash:コマンド
aws cloudwatch get-metric-statistics \
    --metric-name NetworkIn \
    --start-time $(date -d @$START_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
    --end-time $(date -d @$END_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
    --period 300 \
    --namespace AWS/EC2 \
    --statistics Average \
    --dimensions Name=InstanceId,Value=${EC2_INSTANCE_ID_1}
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ aws cloudwatch get-metric-statistics \
>     --metric-name NetworkIn \
>     --start-time $(date -d @$START_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
>     --end-time $(date -d @$END_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
>     --period 300 \
>     --namespace AWS/EC2 \
>     --statistics Average \
>     --dimensions Name=InstanceId,Value=${EC2_INSTANCE_ID_1}
{
    "Label": "NetworkIn",
    "Datapoints": [
        {
            "Timestamp": "2024-06-22T23:28:00+00:00",
            "Average": 33506.0,
            "Unit": "Bytes"
        },
        {
            "Timestamp": "2024-06-22T23:23:00+00:00",
            "Average": 56110839.4,
            "Unit": "Bytes"
        },
        {
            "Timestamp": "2024-06-22T23:38:00+00:00",
            "Average": 302097.2,
            "Unit": "Bytes"
        },
        {
            "Timestamp": "2024-06-22T23:33:00+00:00",
            "Average": 37111.6,
            "Unit": "Bytes"
        },
        {
            "Timestamp": "2024-06-22T23:43:00+00:00",
            "Average": 116185.0,
            "Unit": "Bytes"
        }
    ]
}
```
### EC2 ネットワーク出力（NetworkOut）
```bash:コマンド
aws cloudwatch get-metric-statistics \
    --metric-name NetworkOut \
    --start-time $(date -d @$START_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
    --end-time $(date -d @$END_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
    --period 300 \
    --namespace AWS/EC2 \
    --statistics Average \
    --dimensions Name=InstanceId,Value=${EC2_INSTANCE_ID_1}
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ aws cloudwatch get-metric-statistics \
>     --metric-name NetworkOut \
>     --start-time $(date -d @$START_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
>     --end-time $(date -d @$END_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
>     --period 300 \
>     --namespace AWS/EC2 \
>     --statistics Average \
>     --dimensions Name=InstanceId,Value=${EC2_INSTANCE_ID_1}
{
    "Label": "NetworkOut",
    "Datapoints": [
        {
            "Timestamp": "2024-06-22T23:28:00+00:00",
            "Average": 22059.0,
            "Unit": "Bytes"
        },
        {
            "Timestamp": "2024-06-22T23:23:00+00:00",
            "Average": 252882.0,
            "Unit": "Bytes"
        },
        {
            "Timestamp": "2024-06-22T23:38:00+00:00",
            "Average": 873908.8,
            "Unit": "Bytes"
        },
        {
            "Timestamp": "2024-06-22T23:33:00+00:00",
            "Average": 22911.4,
            "Unit": "Bytes"
        },
        {
            "Timestamp": "2024-06-22T23:43:00+00:00",
            "Average": 261257.6,
            "Unit": "Bytes"
        }
    ]
}
```
### AppELB 別、TG 別メトリクス (HealthyHostCount)
```bash:コマンド
aws cloudwatch get-metric-statistics \
    --namespace AWS/ApplicationELB \
    --metric-name HealthyHostCount \
    --dimensions Name=TargetGroup,Value=${DIMENSIONS_TG} Name=LoadBalancer,Value=${DIMENSIONS_ALB} \
    --start-time $(date -d @$START_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
    --end-time $(date -d @$END_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
    --period 300 \
    --statistics Average
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ aws cloudwatch get-metric-statistics \
>     --namespace AWS/ApplicationELB \
>     --metric-name HealthyHostCount \
>     --dimensions Name=TargetGroup,Value=${DIMENSIONS_TG} Name=LoadBalancer,Value=${DIMENSIONS_ALB} \
>     --start-time $(date -d @$START_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
>     --end-time $(date -d @$END_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
>     --period 300 \
>     --statistics Average
{
    "Label": "HealthyHostCount",
    "Datapoints": [
        {
            "Timestamp": "2024-06-22T23:33:00+00:00",
            "Average": 2.0,
            "Unit": "Count"
        },
        {
            "Timestamp": "2024-06-22T23:28:00+00:00",
            "Average": 2.0,
            "Unit": "Count"
        },
        {
            "Timestamp": "2024-06-22T23:23:00+00:00",
            "Average": 2.0,
            "Unit": "Count"
        },
        {
            "Timestamp": "2024-06-22T23:43:00+00:00",
            "Average": 2.0,
            "Unit": "Count"
        },
        {
            "Timestamp": "2024-06-22T23:38:00+00:00",
            "Average": 2.0,
            "Unit": "Count"
        }
    ]
}
```
### RDS（WriteIOPS）
```bash:コマンド
aws cloudwatch get-metric-statistics \
    --metric-name WriteIOPS \
    --start-time $(date -d @$START_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
    --end-time $(date -d @$END_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
    --period 300 \
    --namespace AWS/RDS \
    --statistics Average \
    --dimensions Name=DBInstanceIdentifier,Value=${RDS_INSTANCE_ID}
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ aws cloudwatch get-metric-statistics \
>     --metric-name WriteIOPS \
>     --start-time $(date -d @$START_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
>     --end-time $(date -d @$END_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
>     --period 300 \
>     --namespace AWS/RDS \
>     --statistics Average \
>     --dimensions Name=DBInstanceIdentifier,Value=${RDS_INSTANCE_ID}
{
    "Label": "WriteIOPS",
    "Datapoints": [
        {
            "Timestamp": "2024-06-22T23:33:00+00:00",
            "Average": 0.3333804284775603,
            "Unit": "Count/Second"
        },
        {
            "Timestamp": "2024-06-22T23:28:00+00:00",
            "Average": 0.8397166918240048,
            "Unit": "Count/Second"
        },
        {
            "Timestamp": "2024-06-22T23:43:00+00:00",
            "Average": 7.784855338298053,
            "Unit": "Count/Second"
        },
        {
            "Timestamp": "2024-06-22T23:38:00+00:00",
            "Average": 0.126673406820922,
            "Unit": "Count/Second"
        },
        {
            "Timestamp": "2024-06-22T23:23:00+00:00",
            "Average": 129.89268581547697,
            "Unit": "Count/Second"
        }
    ]
}
```
### RDS（ReadIOPS）
```bash:コマンド
aws cloudwatch get-metric-statistics \
    --metric-name ReadIOPS \
    --start-time $(date -d @$START_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
    --end-time $(date -d @$END_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
    --period 300 \
    --namespace AWS/RDS \
    --statistics Average \
    --dimensions Name=DBInstanceIdentifier,Value=${RDS_INSTANCE_ID}
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ aws cloudwatch get-metric-statistics \
>     --metric-name ReadIOPS \
>     --start-time $(date -d @$START_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
>     --end-time $(date -d @$END_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
>     --period 300 \
>     --namespace AWS/RDS \
>     --statistics Average \
>     --dimensions Name=DBInstanceIdentifier,Value=${RDS_INSTANCE_ID}
{
    "Label": "ReadIOPS",
    "Datapoints": [
        {
            "Timestamp": "2024-06-22T23:33:00+00:00",
            "Average": 0.3301217130739428,
            "Unit": "Count/Second"
        },
        {
            "Timestamp": "2024-06-22T23:28:00+00:00",
            "Average": 0.2632421608157417,
            "Unit": "Count/Second"
        },
        {
            "Timestamp": "2024-06-22T23:43:00+00:00",
            "Average": 0.2799391798832384,
            "Unit": "Count/Second"
        },
        {
            "Timestamp": "2024-06-22T23:38:00+00:00",
            "Average": 0.2667908389089163,
            "Unit": "Count/Second"
        },
        {
            "Timestamp": "2024-06-22T23:23:00+00:00",
            "Average": 11.988669499291843,
            "Unit": "Count/Second"
        }
    ]
}
```
### EC2 カスタムメトリクス（disk_used_percent）
```bash:コマンド
aws cloudwatch get-metric-statistics \
    --namespace CWAgent \
    --metric-name disk_used_percent \
    --dimensions Name=InstanceId,Value=${EC2_INSTANCE_ID_1} Name=path,Value="/" Name=ImageId,Value=${EC2_AMI} Name=InstanceType,Value="t2.micro" Name=device,Value="xvda1" Name=fstype,Value="xfs" \
    --start-time $(date -d @$START_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
    --end-time $(date -d @$END_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
    --period 300 \
    --statistics Average
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ aws cloudwatch get-metric-statistics \
>     --namespace CWAgent \
>     --metric-name disk_used_percent \
>     --dimensions Name=InstanceId,Value=${EC2_INSTANCE_ID_1} Name=path,Value="/" Name=ImageId,Value=${EC2_AMI} Name=InstanceType,Value="t2.micro" Name=device,Value="xvda1" Name=fstype,Value="xfs" \
>     --start-time $(date -d @$START_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
>     --end-time $(date -d @$END_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
>     --period 300 \
>     --statistics Average
{
    "Label": "disk_used_percent",
    "Datapoints": [
        {
            "Timestamp": "2024-06-22T23:23:00+00:00",
            "Average": 29.81738953953416,
            "Unit": "Percent"
        },
        {
            "Timestamp": "2024-06-22T23:28:00+00:00",
            "Average": 29.81684992180318,
            "Unit": "Percent"
        },
        {
            "Timestamp": "2024-06-22T23:33:00+00:00",
            "Average": 29.814806059954872,
            "Unit": "Percent"
        },
        {
            "Timestamp": "2024-06-22T23:38:00+00:00",
            "Average": 29.81401334718193,
            "Unit": "Percent"
        },
        {
            "Timestamp": "2024-06-22T23:43:00+00:00",
            "Average": 29.8171173429796,
            "Unit": "Percent"
        }
    ]
}
```
### EC2 カスタムメトリクス（disk_used_percent）
```bash:コマンド
aws cloudwatch get-metric-statistics \
    --namespace CWAgent \
    --metric-name mem_used_percent \
    --dimensions Name=InstanceId,Value=${EC2_INSTANCE_ID_1} Name=ImageId,Value=${EC2_AMI} Name=InstanceType,Value="t2.micro" \
    --start-time $(date -d @$START_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
    --end-time $(date -d @$END_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
    --period 300 \
    --statistics Average
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ aws cloudwatch get-metric-statistics \
>     --namespace CWAgent \
>     --metric-name mem_used_percent \
>     --dimensions Name=InstanceId,Value=${EC2_INSTANCE_ID_1} Name=ImageId,Value=${EC2_AMI} Name=InstanceType,Value="t2.micro" \
>     --start-time $(date -d @$START_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
>     --end-time $(date -d @$END_TIME -u +%Y-%m-%dT%H:%M:%SZ) \
>     --period 300 \
>     --statistics Average
{
    "Label": "mem_used_percent",
    "Datapoints": [
        {
            "Timestamp": "2024-06-22T23:23:00+00:00",
            "Average": 13.611785500034223,
            "Unit": "Percent"
        },
        {
            "Timestamp": "2024-06-22T23:28:00+00:00",
            "Average": 12.778200529043012,
            "Unit": "Percent"
        },
        {
            "Timestamp": "2024-06-22T23:33:00+00:00",
            "Average": 12.724249415194084,
            "Unit": "Percent"
        },
        {
            "Timestamp": "2024-06-22T23:38:00+00:00",
            "Average": 12.720303736718565,
            "Unit": "Percent"
        },
        {
            "Timestamp": "2024-06-22T23:43:00+00:00",
            "Average": 25.773735470441636,
            "Unit": "Percent"
        }
    ]
}
```
# 4. CloudWatch Alarms
## 変数設定
```bash:コマンド
# アラーム名
ALARM_NAME="monitoring-1-alarm" \
&& echo ${ALARM_NAME}

# トピック名
TOPIC_NAME="monitoring-1-topic" \
&& echo ${TOPIC_NAME}

# メールアドレス
EMAIL="username@example.com" \
&& echo ${EMAIL}
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ # アラーム名
[cloudshell-user@ip-10-132-88-36 ~]$ ALARM_NAME="monitoring-1-alarm" \
> && echo ${ALARM_NAME}
monitoring-1-alarm
[cloudshell-user@ip-10-132-88-36 ~]$ 
[cloudshell-user@ip-10-132-88-36 ~]$ # トピック名
[cloudshell-user@ip-10-132-88-36 ~]$ TOPIC_NAME="monitoring-1-topic" \
> && echo ${TOPIC_NAME}
monitoring-1-topic
[cloudshell-user@ip-10-132-88-36 ~]$ 
[cloudshell-user@ip-10-132-88-36 ~]$ # メールアドレス
[cloudshell-user@ip-10-132-88-36 ~]$ EMAIL="username@example.com" \
> && echo ${EMAIL}
username@example.com
```
## トピック作成
```bash:コマンド
aws sns create-topic --name ${TOPIC_NAME}
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ aws sns create-topic --name ${TOPIC_NAME}
{
    "TopicArn": "arn:aws:sns:ap-northeast-1:999999999999:monitoring-1-topic"
}
```
## ARN取得
```bash:コマンド
# トピックのARNを取得
TOPIC_ARN=$(
    aws sns list-topics \
        --query "Topics[?contains(TopicArn, '${TOPIC_NAME}')].TopicArn" \
        --output text
) \
&& echo ${TOPIC_ARN}
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ TOPIC_ARN=$(
>     aws sns list-topics \
>         --query "Topics[?contains(TopicArn, '${TOPIC_NAME}')].TopicArn" \
>         --output text
> ) \
> && echo ${TOPIC_ARN}
arn:aws:sns:ap-northeast-1:999999999999:monitoring-1-topic
```

## サブスクリプションの作成
```bash:コマンド
aws sns subscribe \
    --topic-arn $TOPIC_ARN \
    --protocol email \
    --notification-endpoint ${EMAIL}
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ aws sns subscribe \
>     --topic-arn $TOPIC_ARN \
>     --protocol email \
>     --notification-endpoint ${EMAIL}
{
    "SubscriptionArn": "pending confirmation"
}
```
## CloudWatchアラームの作成
```bash:コマンド
aws cloudwatch put-metric-alarm --alarm-name ${ALARM_NAME} \
    --metric-name "disk_used_percent" \
    --namespace "CWAgent" \
    --statistic "Average" \
    --period 900 \
    --threshold 90 \
    --comparison-operator "GreaterThanOrEqualToThreshold" \
    --dimensions Name=InstanceId,Value=${EC2_INSTANCE_ID_1} Name=path,Value="/" Name=ImageId,Value=${EC2_AMI} Name=InstanceType,Value="t2.micro" Name=device,Value="xvda1" Name=fstype,Value="xfs" \
    --evaluation-periods 1 \
    --alarm-actions ${TOPIC_ARN}
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ aws cloudwatch put-metric-alarm --alarm-name ${ALARM_NAME} \
>     --metric-name "disk_used_percent" \
>     --namespace "CWAgent" \
>     --statistic "Average" \
>     --period 900 \
>     --threshold 90 \
>     --comparison-operator "GreaterThanOrEqualToThreshold" \
>     --dimensions Name=InstanceId,Value=${EC2_INSTANCE_ID_1} Name=path,Value="/" Name=ImageId,Value=${EC2_AMI} Name=InstanceType,Value="t2.micro" Name=device,Value="xvda1" Name=fstype,Value="xfs" \
>     --evaluation-periods 1 \
>     --alarm-actions ${TOPIC_ARN}
```
# CloudWatchログの確認
## 変数設定
```bash:コマンド
LOG_GROUP_NAME='wordpress_access_log' \
&& echo ${LOG_GROUP_NAME}

LOG_ACCESS_NAME='wordpress_access_log' \
&& echo ${LOG_ACCESS_NAME}

LOG_ERROR_NAME='wordpress_error_log' \
&& echo ${LOG_ERROR_NAME}
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ LOG_GROUP_NAME='wordpress_access_log' \
> && echo ${LOG_GROUP_NAME}
wordpress_access_log
[cloudshell-user@ip-10-132-88-36 ~]$ 
[cloudshell-user@ip-10-132-88-36 ~]$ LOG_ACCESS_NAME='wordpress_access_log' \
> && echo ${LOG_ACCESS_NAME}
wordpress_access_log
[cloudshell-user@ip-10-132-88-36 ~]$ 
[cloudshell-user@ip-10-132-88-36 ~]$ LOG_ERROR_NAME='wordpress_error_log' \
> && echo ${LOG_ERROR_NAME}
wordpress_error_log
```
## 最新のログストリーム名を取得
```bash:コマンド
LATEST_LOG_STREAM_NAME=$(
    aws logs describe-log-streams \
        --log-group-name "$LOG_GROUP_NAME" \
        --order-by LastEventTime \
        --descending \
        --limit 1 | jq -r '.logStreams[0].logStreamName'
) \
&& echo ${LATEST_LOG_STREAM_NAME}
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ LATEST_LOG_STREAM_NAME=$(
>     aws logs describe-log-streams \
>     --log-group-name "$LOG_GROUP_NAME" \
>     --order-by LastEventTime \
>     --descending \
>     --limit 1 | jq -r '.logStreams[0].logStreamName'
> ) \
> && echo ${LATEST_LOG_STREAM_NAME}
i-02cee7d18cb05c8e9
```
## ログの確認
```bash:コマンド
aws logs get-log-events \
    --log-group-name ${LOG_GROUP_NAME} \
    --log-stream-name ${LATEST_LOG_STREAM_NAME} \
    --output table
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ aws logs get-log-events \
>     --log-group-name ${LOG_GROUP_NAME} \
>     --log-stream-name ${LATEST_LOG_STREAM_NAME} \
>     --output table
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|                                                                                                                                                                                                                                                                                                        GetLogEvents                                                                                                                                                                                                                                                                                                        |
+----------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|  nextBackwardToken                                                                                                                                 |  b/38337570254780535266769393403704440839829444184946114560/s                                                                                                                                                                                                                                                                                                                                                                                                         |
|  nextForwardToken                                                                                                                                  |  f/38337682176645500392334291047353364048084678697053388801/s                                                                                                                                                                                                                                                                                                                                                                                                         |
+----------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
||                                                                                                                                                                                                                                                                                                          events                                                                                                                                                                                                                                                                                                          ||
|+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------+|
|| ingestionTime |                                                                                                                                                                                                                                                                                         message                                                                                                                                                                                                                                                                                         |   timestamp    ||
|+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------+|
||  1719117011969|  10.0.0.222 - - [23/Jun/2024:04:30:06 +0000] "GET /.check_alive HTTP/1.1" 200 - "-" "ELB-HealthChecker/2.0"                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |  1719117006937 ||
||  1719117011969|  10.0.1.176 - - [23/Jun/2024:04:30:06 +0000] "GET /.check_alive HTTP/1.1" 200 - "-" "ELB-HealthChecker/2.0"                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |  1719117011117 ||
||  1719117042021|  10.0.0.222 - - [23/Jun/2024:04:30:36 +0000] "GET /.check_alive HTTP/1.1" 200 - "-" "ELB-HealthChecker/2.0"                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |  1719117036999 ||
||  1719117042021|  10.0.1.176 - - [23/Jun/2024:04:30:36 +0000] "GET /.check_alive HTTP/1.1" 200 - "-" "ELB-HealthChecker/2.0"                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |  1719117041117 ||
||  1719117072099|  10.0.0.222 - - [23/Jun/2024:04:31:06 +0000] "GET /.check_alive HTTP/1.1" 200 - "-" "ELB-HealthChecker/2.0"                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |  1719117067071 ||
||  1719117072099|  10.0.1.176 - - [23/Jun/2024:04:31:06 +0000] "GET /.check_alive HTTP/1.1" 200 - "-" "ELB-HealthChecker/2.0"                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |  1719117071117 ||
|+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------+|
```
## フィルター
```bash:コマンド
aws logs filter-log-events \
    --log-group-name ${LOG_GROUP_NAME} \
    --filter-pattern "GET" \
    --output table
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ aws logs filter-log-events \
>     --log-group-name ${LOG_GROUP_NAME} \
>     --filter-pattern "GET" \
>     --output table
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|                                                                                                                                                                                                                                                                                                                                                FilterLogEvents                                                                                                                                                                                                                                                                                                                                                |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
||                                                                                                                                                                                                                                                                                                                                                   events                                                                                                                                                                                                                                                                                                                                                    ||
|+----------------------------------------------------------+----------------+----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------+|
||                          eventId                         | ingestionTime  |    logStreamName     |                                                                                                                                                                                                                                                                                         message                                                                                                                                                                                                                                                                                         |   timestamp    ||
|+----------------------------------------------------------+----------------+----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------+|
||  38336162989001542094297206108908958612843111801005670400|  1719053007714 |  i-07ebafd72024ae1a4 |  15.177.2.30 - - [22/Jun/2024:10:42:44 +0000] "GET / HTTP/1.1" 302 - "-" "Amazon-Route53-Health-Check-Service (ref d5fdcdf0-bc0e-4b97-8653-9d8cb3286735; report http://amzn.to/1vsZADi)"                                                                                                                                                                                                                                                                                                                                                                                                |  1719053002387 ||
||  38336162989001542094297206108908958612843111801005670401|  1719053007714 |  i-07ebafd72024ae1a4 |  15.177.14.137 - - [22/Jun/2024:10:42:48 +0000] "GET / HTTP/1.1" 302 - "-" "Amazon-Route53-Health-Check-Service (ref d5fdcdf0-bc0e-4b97-8653-9d8cb3286735; report http://amzn.to/1vsZADi)"                                                                                                                                                                                                                                                                                                                                                                                              |  1719053002387 ||
||  38336162989001542094297206108908958612843111801005670402|  1719053007714 |  i-07ebafd72024ae1a4 |  15.177.18.108 - - [22/Jun/2024:10:42:48 +0000] "GET / HTTP/1.1" 302 - "-" "Amazon-Route53-Health-Check-Service (ref d5fdcdf0-bc0e-4b97-8653-9d8cb3286735; report http://amzn.to/1vsZADi)"                                                                                                                                                                                                                                                                                                                                                                                              |  1719053002387 ||
||  38336162989001542094297206108908958612843111801005670403|  1719053007714 |  i-07ebafd72024ae1a4 |  15.177.30.159 - - [22/Jun/2024:10:42:49 +0000] "GET / HTTP/1.1" 302 - "-" "Amazon-Route53-Health-Check-Service (ref d5fdcdf0-bc0e-4b97-8653-9d8cb3286735; report http://amzn.to/1vsZADi)"                                                                                                                                                                                                                                                                                                                                                                                              |  1719053002387 ||  
|+----------------------------------------------------------+----------------+----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------+|
```
# 5. CloudWatch Logs Insights
## クエリ実行
```bash:コマンド
# クエリIDを変数に保存
QUERY_ID=$(aws logs start-query \
    --log-group-name $LOG_GROUP_NAME \
    --start-time $(date -d @$START_TIME -u +%s) \
    --end-time $(date -d @$END_TIME -u +%s) \
    --query-string "fields @timestamp, @message | sort @timestamp desc | limit 20" \
    --query "queryId" \
    --output text
) \
&& echo ${QUERY_ID}
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ # クエリIDを変数に保存
[cloudshell-user@ip-10-132-88-36 ~]$ QUERY_ID=$(aws logs start-query \
>     --log-group-name $LOG_GROUP_NAME \
>     --start-time $(date -d @$START_TIME -u +%s) \
>     --end-time $(date -d @$END_TIME -u +%s) \
>     --query-string "fields @timestamp, @message | sort @timestamp desc | limit 20" \
>     --query "queryId" \
>     --output text
> ) \
> && echo ${QUERY_ID}
17e92a1b-5d49-4417-a571-96c7f67ab71a
```
## クエリ結果の確認
```bash:コマンド
# クエリ結果を取得
aws logs get-query-results \
    --query-id ${QUERY_ID} \
    --output table
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ # クエリ結果を取得
[cloudshell-user@ip-10-132-88-36 ~]$ aws logs get-query-results \
>     --query-id ${QUERY_ID} \
>     --output table
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|                                                                                   GetQueryResults                                                                                  |
+---------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+
|  status                                                                         |  Complete                                                                                        |
+---------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+
||                                                                                      results                                                                                     ||
|+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+|
||    field   |                                                                                value                                                                                ||
|+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+|
||  @timestamp|  2024-06-22 23:48:29.117                                                                                                                                            ||
||  @message  |  10.0.1.176 - - [22/Jun/2024:23:48:24 +0000] "GET /.check_alive HTTP/1.1" 200 - "-" "ELB-HealthChecker/2.0"                                                         ||
||  @ptr      |  CnIKNQohNDIzNzYxMTc1MTk3OndvcmRwcmVzc19hY2Nlc3NfbG9nEAQiDgiwr7CPhDIQl/HnkoQyEjUaGAIGYhoZ3wAAAAFLOVB2AAZndiggAAAE8iABKJ++55KEMjC94ueShDI4AkCSAkiaB1DJAxgAIAEQARgB   ||
||  @timestamp|  2024-06-22 23:48:29.056                                                                                                                                            ||
||  @message  |  10.0.1.176 - - [22/Jun/2024:23:48:24 +0000] "GET /.check_alive HTTP/1.1" 200 - "-" "ELB-HealthChecker/2.0"                                                         ||
||  @ptr      |  CnIKNQohNDIzNzYxMTc1MTk3OndvcmRwcmVzc19hY2Nlc3NfbG9nEAciDgiwr7CPhDIQl/HnkoQyEjUaGAIGTNfXYwAAAAU1BW6hAAZndiuAAAAFMiABKIy/55KEMjDtzOmShDI4BkC2BkjTCFCABRgAIAEQARgB   ||
||  @timestamp|  2024-06-22 23:48:24.588                                                                                                                                            ||
||  @message  |  10.0.0.222 - - [22/Jun/2024:23:48:23 +0000] "GET /.check_alive HTTP/1.1" 200 - "-" "ELB-HealthChecker/2.0"                                                         ||
||  @ptr      |  CnIKNQohNDIzNzYxMTc1MTk3OndvcmRwcmVzc19hY2Nlc3NfbG9nEAciDgiwr7CPhDIQl/HnkoQyEjUaGAIGTNfXYwAAAAU1BW6hAAZndiuAAAAFMiABKIy/55KEMjDtzOmShDI4BkC2BkjTCFCABRgAIAEQABgB   ||
||  @timestamp|  2024-06-22 23:48:24.479                                                                                                                                            ||
||  @message  |  10.0.0.222 - - [22/Jun/2024:23:48:23 +0000] "GET /.check_alive HTTP/1.1" 200 - "-" "ELB-HealthChecker/2.0"                                                         ||
||  @ptr      |  CnIKNQohNDIzNzYxMTc1MTk3OndvcmRwcmVzc19hY2Nlc3NfbG9nEAQiDgiwr7CPhDIQl/HnkoQyEjUaGAIGYhoZ3wAAAAFLOVB2AAZndiggAAAE8iABKJ++55KEMjC94ueShDI4AkCSAkiaB1DJAxgAIAEQABgB   ||
||  @timestamp|  2024-06-22 23:47:59.116                                                                                                                                            ||
||  @message  |  10.0.1.176 - - [22/Jun/2024:23:47:54 +0000] "GET /.check_alive HTTP/1.1" 200 - "-" "ELB-HealthChecker/2.0"                                                         ||
||  @ptr      |  CnIKNQohNDIzNzYxMTc1MTk3OndvcmRwcmVzc19hY2Nlc3NfbG9nEAciDgiwr7CPhDIQl/HnkoQyEjUaGAIGTNfXYwAAAAU1BJwMAAZndiMgAAAFMiABKKCf3pKEMjCM+OWShDI4EECiH0iqDlDXChgAIAEQDxgB   ||
||  @timestamp|  2024-06-22 23:47:59.057                                                                                                                                            ||
||  @message  |  10.0.1.176 - - [22/Jun/2024:23:47:54 +0000] "GET /.check_alive HTTP/1.1" 200 - "-" "ELB-HealthChecker/2.0"                                                         ||
||  @ptr      |  CnIKNQohNDIzNzYxMTc1MTk3OndvcmRwcmVzc19hY2Nlc3NfbG9nEAMiDgiwr7CPhDIQl/HnkoQyEjUaGAIGVMKtUQAAAANuJbAMAAZndiewAAACEiABKI3U5ZKEMjDR9+WShDI4AkCSAkidB1DMAxgAIAEQARgB   ||
||  @timestamp|  2024-06-22 23:47:54.509                                                                                                                                            ||
||  @message  |  10.0.0.222 - - [22/Jun/2024:23:47:53 +0000] "GET /.check_alive HTTP/1.1" 200 - "-" "ELB-HealthChecker/2.0"                                                         ||
||  @ptr      |  CnIKNQohNDIzNzYxMTc1MTk3OndvcmRwcmVzc19hY2Nlc3NfbG9nEAMiDgiwr7CPhDIQl/HnkoQyEjUaGAIGVMKtUQAAAANuJbAMAAZndiewAAACEiABKI3U5ZKEMjDR9+WShDI4AkCSAkidB1DMAxgAIAEQABgB   ||
||  @timestamp|  2024-06-22 23:47:54.412                                                                                                                                            ||
||  @message  |  10.0.0.222 - - [22/Jun/2024:23:47:53 +0000] "GET /.check_alive HTTP/1.1" 200 - "-" "ELB-HealthChecker/2.0"                                                         ||
||  @ptr      |  CnIKNQohNDIzNzYxMTc1MTk3OndvcmRwcmVzc19hY2Nlc3NfbG9nEAciDgiwr7CPhDIQl/HnkoQyEjUaGAIGTNfXYwAAAAU1BJwMAAZndiMgAAAFMiABKKCf3pKEMjCM+OWShDI4EECiH0iqDlDXChgAIAEQDhgB   ||
||  @timestamp|  2024-06-22 23:47:29.117                                                                                                                                            ||
||  @message  |  10.0.1.176 - - [22/Jun/2024:23:47:24 +0000] "GET /.check_alive HTTP/1.1" 200 - "-" "ELB-HealthChecker/2.0"                                                         ||
||  @ptr      |  CnIKNQohNDIzNzYxMTc1MTk3OndvcmRwcmVzc19hY2Nlc3NfbG9nEAYiDgiwr7CPhDIQl/HnkoQyEjUaGAIGZvZEWwAAAAOKtKPgAAZndiCwAAADsiABKJGV4JKEMjDdjeSShDI4BECkBEiaCFDHBBgAIAEQAxgB   ||
||  @timestamp|  2024-06-22 23:47:29.056                                                                                                                                            ||
||  @message  |  10.0.1.176 - - [22/Jun/2024:23:47:24 +0000] "GET /.check_alive HTTP/1.1" 200 - "-" "ELB-HealthChecker/2.0"                                                         ||
||  @ptr      |  CnIKNQohNDIzNzYxMTc1MTk3OndvcmRwcmVzc19hY2Nlc3NfbG9nEAEiDgiwr7CPhDIQl/HnkoQyEjUaGAIGUyFXogAAAAR3l+31AAZndiNwAAAGIiABKISA4pKEMjCgjeSShDI4BECkBEjeB1CMBBgAIAEQAxgB   ||
||  @timestamp|  2024-06-22 23:47:24.422                                                                                                                                            ||
||  @message  |  10.0.0.222 - - [22/Jun/2024:23:47:23 +0000] "GET /.check_alive HTTP/1.1" 200 - "-" "ELB-HealthChecker/2.0"                                                         ||
||  @ptr      |  CnIKNQohNDIzNzYxMTc1MTk3OndvcmRwcmVzc19hY2Nlc3NfbG9nEAEiDgiwr7CPhDIQl/HnkoQyEjUaGAIGUyFXogAAAAR3l+31AAZndiNwAAAGIiABKISA4pKEMjCgjeSShDI4BECkBEjeB1CMBBgAIAEQAhgB   ||
||  @timestamp|  2024-06-22 23:47:24.335                                                                                                                                            ||
||  @message  |  10.0.0.222 - - [22/Jun/2024:23:47:23 +0000] "GET /.check_alive HTTP/1.1" 200 - "-" "ELB-HealthChecker/2.0"                                                         ||
||  @ptr      |  CnIKNQohNDIzNzYxMTc1MTk3OndvcmRwcmVzc19hY2Nlc3NfbG9nEAYiDgiwr7CPhDIQl/HnkoQyEjUaGAIGZvZEWwAAAAOKtKPgAAZndiCwAAADsiABKJGV4JKEMjDdjeSShDI4BECkBEiaCFDHBBgAIAEQAhgB   ||
||  @timestamp|  2024-06-22 23:46:59.117                                                                                                                                            ||
||  @message  |  10.0.1.176 - - [22/Jun/2024:23:46:54 +0000] "GET /.check_alive HTTP/1.1" 200 - "-" "ELB-HealthChecker/2.0"                                                         ||
||  @ptr      |  CnIKNQohNDIzNzYxMTc1MTk3OndvcmRwcmVzc19hY2Nlc3NfbG9nEAciDgiwr7CPhDIQl/HnkoQyEjUaGAIGTNfXYwAAAAU1BJwMAAZndiMgAAAFMiABKKCf3pKEMjCM+OWShDI4EECiH0iqDlDXChgAIAEQDRgB   ||
||  @timestamp|  2024-06-22 23:46:59.057                                                                                                                                            ||
||  @message  |  10.0.1.176 - - [22/Jun/2024:23:46:54 +0000] "GET /.check_alive HTTP/1.1" 200 - "-" "ELB-HealthChecker/2.0"                                                         ||
||  @ptr      |  CnIKNQohNDIzNzYxMTc1MTk3OndvcmRwcmVzc19hY2Nlc3NfbG9nEAEiDgiwr7CPhDIQl/HnkoQyEjUaGAIGUyFXogAAAAR3l+31AAZndiNwAAAGIiABKISA4pKEMjCgjeSShDI4BECkBEjeB1CMBBgAIAEQARgB   ||
||  @timestamp|  2024-06-22 23:46:54.596                                                                                                                                            ||
||  @message  |  10.0.0.222 - - [22/Jun/2024:23:46:53 +0000] "GET /.check_alive HTTP/1.1" 200 - "-" "ELB-HealthChecker/2.0"                                                         ||
||  @ptr      |  CnIKNQohNDIzNzYxMTc1MTk3OndvcmRwcmVzc19hY2Nlc3NfbG9nEAEiDgiwr7CPhDIQl/HnkoQyEjUaGAIGUyFXogAAAAR3l+31AAZndiNwAAAGIiABKISA4pKEMjCgjeSShDI4BECkBEjeB1CMBBgAIAEQABgB   ||
||  @timestamp|  2024-06-22 23:46:54.509                                                                                                                                            ||
||  @message  |  10.0.0.222 - - [22/Jun/2024:23:46:53 +0000] "GET /.check_alive HTTP/1.1" 200 - "-" "ELB-HealthChecker/2.0"                                                         ||
||  @ptr      |  CnIKNQohNDIzNzYxMTc1MTk3OndvcmRwcmVzc19hY2Nlc3NfbG9nEAciDgiwr7CPhDIQl/HnkoQyEjUaGAIGTNfXYwAAAAU1BJwMAAZndiMgAAAFMiABKKCf3pKEMjCM+OWShDI4EECiH0iqDlDXChgAIAEQDBgB   ||
||  @timestamp|  2024-06-22 23:46:29.117                                                                                                                                            ||
||  @message  |  10.0.1.176 - - [22/Jun/2024:23:46:24 +0000] "GET /.check_alive HTTP/1.1" 200 - "-" "ELB-HealthChecker/2.0"                                                         ||
||  @ptr      |  CnIKNQohNDIzNzYxMTc1MTk3OndvcmRwcmVzc19hY2Nlc3NfbG9nEAQiDgiwr7CPhDIQl/HnkoQyEjUaGAIGYhoZ3wAAAAFLN1c5AAZndh+wAAAE8iABKPje25KEMjD9uOCShDI4C0CfEUi6DFDnCBgAIAEQChgB   ||
||  @timestamp|  2024-06-22 23:46:29.056                                                                                                                                            ||
||  @message  |  10.0.1.176 - - [22/Jun/2024:23:46:24 +0000] "GET /.check_alive HTTP/1.1" 200 - "-" "ELB-HealthChecker/2.0"                                                         ||
||  @ptr      |  CnIKNQohNDIzNzYxMTc1MTk3OndvcmRwcmVzc19hY2Nlc3NfbG9nEAYiDgiwr7CPhDIQl/HnkoQyEjUaGAIGZvZEWwAAAAOKtKPgAAZndiCwAAADsiABKJGV4JKEMjDdjeSShDI4BECkBEiaCFDHBBgAIAEQARgB   ||
||  @timestamp|  2024-06-22 23:46:24.529                                                                                                                                            ||
||  @message  |  10.0.0.222 - - [22/Jun/2024:23:46:23 +0000] "GET /.check_alive HTTP/1.1" 200 - "-" "ELB-HealthChecker/2.0"                                                         ||
||  @ptr      |  CnIKNQohNDIzNzYxMTc1MTk3OndvcmRwcmVzc19hY2Nlc3NfbG9nEAYiDgiwr7CPhDIQl/HnkoQyEjUaGAIGZvZEWwAAAAOKtKPgAAZndiCwAAADsiABKJGV4JKEMjDdjeSShDI4BECkBEiaCFDHBBgAIAEQABgB   ||
||  @timestamp|  2024-06-22 23:46:24.430                                                                                                                                            ||
||  @message  |  10.0.0.222 - - [22/Jun/2024:23:46:23 +0000] "GET /.check_alive HTTP/1.1" 200 - "-" "ELB-HealthChecker/2.0"                                                         ||
||  @ptr      |  CnIKNQohNDIzNzYxMTc1MTk3OndvcmRwcmVzc19hY2Nlc3NfbG9nEAQiDgiwr7CPhDIQl/HnkoQyEjUaGAIGYhoZ3wAAAAFLN1c5AAZndh+wAAAE8iABKPje25KEMjD9uOCShDI4C0CfEUi6DFDnCBgAIAEQCRgB   ||
|+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+|
||                                                                                    statistics                                                                                    ||
|+--------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+|
||  bytesScanned                                                                                                |  72658.0                                                          ||
||  recordsMatched                                                                                              |  325.0                                                            ||
||  recordsScanned                                                                                              |  329.0                                                            ||
|+--------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+|
```
:::note warn
ハンズオン内で指定しているクエリは管理コンソールからだとうまくいくが、CLIからだとうまくいかなかった
:::
# 6. CloudWatch Dashboards
## 変数設定
```bash:コマンド
# ダッシュボード名
DASHBOARD="WordPress_dashboard"
echo ${DASHBOARD}
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ # ダッシュボード名
[cloudshell-user@ip-10-132-88-36 ~]$ DASHBOARD="WordPress_dashboard"
[cloudshell-user@ip-10-132-88-36 ~]$ echo ${DASHBOARD}
WordPress_dashboard
```
## ダッシュボード用JSONファイル作成
```bash:コマンド
cat << EOF > dashboard.json
{
    "widgets": [
        {
            "height": 6,
            "width": 6,
            "y": 0,
            "x": 0,
            "type": "metric",
            "properties": {
                "view": "timeSeries",
                "stacked": false,
                "metrics": [
                    [ "AWS/EC2", "CPUUtilization", "InstanceId", "${EC2_INSTANCE_ID_1}" ],
                    [ "...", "${EC2_INSTANCE_ID_2}" ]
                ],
                "region": "ap-northeast-1"
            }
        },
        {
            "height": 6,
            "width": 6,
            "y": 0,
            "x": 6,
            "type": "text",
            "properties": {
                "markdown": "# WordPress障害時メモ\n非常時は以下のボタンをクリックしてください \n\n [button:primary:非常時ボタン](https://amazon.com) \n "
            }
        },
        {
            "height": 6,
            "width": 24,
            "y": 6,
            "x": 0,
            "type": "log",
            "properties": {
                "query": "SOURCE 'wordpress_access_log' | fields @timestamp, @message, @logStream, @log\n| sort @timestamp desc\n| limit 1000",
                "region": "ap-northeast-1",
                "stacked": false,
                "view": "table"
            }
        }
    ]
}
EOF
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ cat << EOF > dashboard.json
> {
>     "widgets": [
>         {
>             "height": 6,
>             "width": 6,
>             "y": 0,
>             "x": 0,
>             "type": "metric",
>             "properties": {
>                 "view": "timeSeries",
>                 "stacked": false,
>                 "metrics": [
>                     [ "AWS/EC2", "CPUUtilization", "InstanceId", "${EC2_INSTANCE_ID_1}" ],
>                     [ "...", "${EC2_INSTANCE_ID_2}" ]
>                 ],
>                 "region": "ap-northeast-1"
>             }
>         },
>         {
>             "height": 6,
>             "width": 6,
>             "y": 0,
>             "x": 6,
>             "type": "text",
>             "properties": {
>                 "markdown": "# WordPress障害時メモ\n非常時は以下のボタンをクリックしてください \n\n [button:primary:非常時ボタン](https://amazon.com) \n "
>             }
>         },
>         {
>             "height": 6,
>             "width": 24,
>             "y": 6,
>             "x": 0,
>             "type": "log",
>             "properties": {
>                 "query": "SOURCE 'wordpress_access_log' | fields @timestamp, @message, @logStream, @log\n| sort @timestamp desc\n| limit 1000",
>                 "region": "ap-northeast-1",
>                 "stacked": false,
>                 "view": "table"
>             }
>         }
>     ]
> }
> EOF
```
## ダッシュボード作成
```bash:コマンド
aws cloudwatch put-dashboard \
    --dashboard-name ${DASHBOARD} \
    --dashboard-body file://dashboard.json
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ aws cloudwatch put-dashboard \
>     --dashboard-name ${DASHBOARD} \
>     --dashboard-body file://dashboard.json
{
    "DashboardValidationMessages": []
}
```
# 7. CloudWatch Events (Amazon EventBridge)
## 変数設定
```bash:コマンド
# ルール名
EVENT_RULE_NAME="monitoring-1-event-rule" \
&& echo ${EVENT_RULE_NAME}
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ # ルール名
[cloudshell-user@ip-10-132-88-36 ~]$ EVENT_RULE_NAME="monitoring-1-event-rule" \
> && echo ${EVENT_RULE_NAME}
monitoring-1-event-rule
```
## EventBridgeルールの作成
### ルールの作成
```bash:コマンド
aws events put-rule \
    --name ${EVENT_RULE_NAME} \
    --event-pattern \
    '{  "source": ["aws.ec2"], 
      "detail-type": ["EC2 Instance State-change Notification"],
      "detail": {
          "state": ["stopped"]
          }
      }'
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ aws events put-rule \
>     --name ${EVENT_RULE_NAME} \
>     --event-pattern \
>     '{  "source": ["aws.ec2"], 
>       "detail-type": ["EC2 Instance State-change Notification"],
>       "detail": {
>           "state": ["stopped"]
>           }
>       }'
{
    "RuleArn": "arn:aws:events:ap-northeast-1:999999999999:rule/monitoring-1-event-rule"
}
```
### ARNの取得
```bash:コマンド
EVENT_RULE_ARN=$(
    aws events describe-rule \
        --name ${EVENT_RULE_NAME} \
        --query "Arn" \
        --output text
) \
&& echo ${EVENT_RULE_ARN}
```
```bash:出力
[cloudshell-user@ip-10-132-88-36 ~]$ EVENT_RULE_ARN=$(
>     aws events describe-rule \
>         --name ${EVENT_RULE_NAME} \
>         --query "Arn" \
>         --output text
> ) \
> && echo ${EVENT_RULE_ARN}
arn:aws:events:ap-northeast-1:999999999999:rule/monitoring-1-event-rule
```
## EventBridgeターゲットの作成
### JSONファイルの作成
```bash:コマンド
cat << EOF > ${HOME}/${EVENT_RULE_NAME}.json
[
    {
        "Id": "1",
        "Arn": "${TOPIC_ARN}"
    }
]
EOF
```
```bash:出力
[cloudshell-user@ip-10-134-29-105 ~]$ cat << EOF > ${HOME}/${EVENT_RULE_NAME}.json
> [
>     {
>         "Id": "1",
>         "Arn": "${TOPIC_ARN}"
>     }
> ]
> EOF
```
### ターゲットの作成
```bash:コマンド
aws events put-targets \
    --rule ${EVENT_RULE_NAME} \
    --targets file://${HOME}/${EVENT_RULE_NAME}.json
```
```bash:出力
[cloudshell-user@ip-10-134-29-105 ~]$ aws events put-targets \
>     --rule ${EVENT_RULE_NAME} \
>     --targets file://${HOME}/${EVENT_RULE_NAME}.json
{
    "FailedEntryCount": 0,
    "FailedEntries": []
}
```
## SNSトピックにEventBridgeルールからの許可権限追加
```bash:コマンド
# 現在のSNSトピックのポリシーを取得
CURRENT_POLICY=$(
    aws sns get-topic-attributes \
        --topic-arn ${TOPIC_ARN} \
        --query "Attributes.Policy" \
        --output text
) \
&& echo ${CURRENT_POLICY}

# 現在のポリシーをJSON形式に変換
CURRENT_POLICY_JSON=$(echo ${CURRENT_POLICY} | jq .) \
&& echo ${CURRENT_POLICY_JSON}

# 新しいポリシーステートメント
NEW_POLICY_STATEMENT=$(cat <<EOF
{
  "Sid": "${EVENT_RULE_NAME}",
  "Effect": "Allow",
  "Principal": {
    "Service": "events.amazonaws.com"
  },
  "Action": "sns:Publish",
  "Resource": "${TOPIC_ARN}"
}
EOF
) \
&& echo ${NEW_POLICY_STATEMENT}

# ポリシーに新しいステートメントを追加
UPDATED_POLICY=$(echo ${CURRENT_POLICY_JSON} | jq --argjson stmt "${NEW_POLICY_STATEMENT}" '.Statement += [$stmt]') \
&& echo ${UPDATED_POLICY}

# 更新されたポリシーを文字列に変換
UPDATED_POLICY_STR=$(echo ${UPDATED_POLICY} | jq -c .) \
&& echo ${UPDATED_POLICY_STR}

aws sns set-topic-attributes \
    --topic-arn ${TOPIC_ARN} \
    --attribute-name Policy \
    --attribute-value "${UPDATED_POLICY_STR}"
```
```bash:出力
[cloudshell-user@ip-10-130-49-7 ~]$ # 現在のSNSトピックのポリシーを取得
[cloudshell-user@ip-10-130-49-7 ~]$ CURRENT_POLICY=$(
>     aws sns get-topic-attributes \
>         --topic-arn ${TOPIC_ARN} \
>         --query "Attributes.Policy" \
>         --output text
> ) \
> && echo ${CURRENT_POLICY}
{"Version":"2008-10-17","Id":"__default_policy_ID","Statement":[{"Sid":"__default_statement_ID","Effect":"Allow","Principal":{"AWS":"*"},"Action":["SNS:GetTopicAttributes","SNS:SetTopicAttributes","SNS:AddPermission","SNS:RemovePermission","SNS:DeleteTopic","SNS:Subscribe","SNS:ListSubscriptionsByTopic","SNS:Publish"],"Resource":"arn:aws:sns:ap-northeast-1:999999999999:monitoring-1-topic","Condition":{"StringEquals":{"AWS:SourceOwner":"999999999999"}}}]}
[cloudshell-user@ip-10-130-49-7 ~]$ 
[cloudshell-user@ip-10-130-49-7 ~]$ # 現在のポリシーをJSON形式に変換
[cloudshell-user@ip-10-130-49-7 ~]$ CURRENT_POLICY_JSON=$(echo ${CURRENT_POLICY} | jq .) \
> && echo ${CURRENT_POLICY_JSON}
{ "Version": "2008-10-17", "Id": "__default_policy_ID", "Statement": [ { "Sid": "__default_statement_ID", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": [ "SNS:GetTopicAttributes", "SNS:SetTopicAttributes", "SNS:AddPermission", "SNS:RemovePermission", "SNS:DeleteTopic", "SNS:Subscribe", "SNS:ListSubscriptionsByTopic", "SNS:Publish" ], "Resource": "arn:aws:sns:ap-northeast-1:999999999999:monitoring-1-topic", "Condition": { "StringEquals": { "AWS:SourceOwner": "999999999999" } } } ] }
[cloudshell-user@ip-10-130-49-7 ~]$ 
[cloudshell-user@ip-10-130-49-7 ~]$ # 新しいポリシーステートメント
[cloudshell-user@ip-10-130-49-7 ~]$ NEW_POLICY_STATEMENT=$(cat <<EOF
> {
>   "Sid": "${EVENT_RULE_NAME}",
>   "Effect": "Allow",
>   "Principal": {
>     "Service": "events.amazonaws.com"
>   },
>   "Action": "sns:Publish",
>   "Resource": "${TOPIC_ARN}"
> }
> EOF
> ) \
> && echo ${NEW_POLICY_STATEMENT}
{ "Sid": "monitoring-1-event-rule", "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": "sns:Publish", "Resource": "arn:aws:sns:ap-northeast-1:999999999999:monitoring-1-topic" }
[cloudshell-user@ip-10-130-49-7 ~]$ 
[cloudshell-user@ip-10-130-49-7 ~]$ # ポリシーに新しいステートメントを追加
[cloudshell-user@ip-10-130-49-7 ~]$ UPDATED_POLICY=$(echo ${CURRENT_POLICY_JSON} | jq --argjson stmt "${NEW_POLICY_STATEMENT}" '.Statement += [$stmt]') \
> && echo ${UPDATED_POLICY}
{ "Version": "2008-10-17", "Id": "__default_policy_ID", "Statement": [ { "Sid": "__default_statement_ID", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": [ "SNS:GetTopicAttributes", "SNS:SetTopicAttributes", "SNS:AddPermission", "SNS:RemovePermission", "SNS:DeleteTopic", "SNS:Subscribe", "SNS:ListSubscriptionsByTopic", "SNS:Publish" ], "Resource": "arn:aws:sns:ap-northeast-1:999999999999:monitoring-1-topic", "Condition": { "StringEquals": { "AWS:SourceOwner": "999999999999" } } }, { "Sid": "monitoring-1-event-rule", "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": "sns:Publish", "Resource": "arn:aws:sns:ap-northeast-1:999999999999:monitoring-1-topic" } ] }
[cloudshell-user@ip-10-130-49-7 ~]$ 
[cloudshell-user@ip-10-130-49-7 ~]$ # 更新されたポリシーを文字列に変換
[cloudshell-user@ip-10-130-49-7 ~]$ UPDATED_POLICY_STR=$(echo ${UPDATED_POLICY} | jq -c .) \
> && echo ${UPDATED_POLICY_STR}
{"Version":"2008-10-17","Id":"__default_policy_ID","Statement":[{"Sid":"__default_statement_ID","Effect":"Allow","Principal":{"AWS":"*"},"Action":["SNS:GetTopicAttributes","SNS:SetTopicAttributes","SNS:AddPermission","SNS:RemovePermission","SNS:DeleteTopic","SNS:Subscribe","SNS:ListSubscriptionsByTopic","SNS:Publish"],"Resource":"arn:aws:sns:ap-northeast-1:999999999999:monitoring-1-topic","Condition":{"StringEquals":{"AWS:SourceOwner":"999999999999"}}},{"Sid":"monitoring-1-event-rule","Effect":"Allow","Principal":{"Service":"events.amazonaws.com"},"Action":"sns:Publish","Resource":"arn:aws:sns:ap-northeast-1:999999999999:monitoring-1-topic"}]}
[cloudshell-user@ip-10-130-49-7 ~]$ 
[cloudshell-user@ip-10-130-49-7 ~]$ aws sns set-topic-attributes \
>     --topic-arn ${TOPIC_ARN} \
>     --attribute-name Policy \
>     --attribute-value "${UPDATED_POLICY_STR}"
```
# 8. 削除
## CloudFormation
```bash:コマンド
aws cloudformation delete-stack --stack-name ${STACK_NAME}
```
```bash:出力
[cloudshell-user@ip-10-130-49-7 ~]$ aws cloudformation delete-stack --stack-name ${STACK_NAME}
```
## CloudWatch
### ダッシュボード
```bash:コマンド
aws cloudwatch delete-dashboards --dashboard-names ${DASHBOARD}
```
```bash:出力
[cloudshell-user@ip-10-130-49-7 ~]$ aws cloudwatch delete-dashboards --dashboard-names ${DASHBOARD}
```
### アラーム
```bash:コマンド
aws cloudwatch delete-alarms --alarm-names ${ALARM_NAME}
```
```bash:出力
[cloudshell-user@ip-10-130-49-7 ~]$ aws cloudwatch delete-alarms --alarm-names ${ALARM_NAME}
```
### ログ
```bash:コマンド
aws logs delete-log-group \
    --log-group-name ${LOG_ACCESS_NAME}

aws logs delete-log-group \
    --log-group-name ${LOG_ERROR_NAME}
```
```bash:出力
[cloudshell-user@ip-10-130-49-7 ~]$ aws logs delete-log-group \
>     --log-group-name ${LOG_ACCESS_NAME}
[cloudshell-user@ip-10-130-49-7 ~]$ 
[cloudshell-user@ip-10-130-49-7 ~]$ aws logs delete-log-group \
>     --log-group-name ${LOG_ERROR_NAME}
```
### イベント
```bash:コマンド
aws events remove-targets \
  --rule ${EVENT_RULE_NAME}  --ids 1

aws events delete-rule \
  --name ${EVENT_RULE_NAME}
```
```bash:出力
[cloudshell-user@ip-10-130-49-7 ~]$ aws events remove-targets \
>   --rule ${EVENT_RULE_NAME}  --ids 1
{
    "FailedEntryCount": 0,
    "FailedEntries": []
}
[cloudshell-user@ip-10-130-49-7 ~]$ 
[cloudshell-user@ip-10-130-49-7 ~]$ aws events delete-rule \
>   --name ${EVENT_RULE_NAME}
```
## SNS
### 指定のSidが含まれるステートメントを削除
```bash:コマンド
# 現在のSNSトピックのポリシーを取得
CURRENT_POLICY=$(
    aws sns get-topic-attributes \
        --topic-arn ${TOPIC_ARN} \
        --query "Attributes.Policy" \
        --output text
) \
&& echo ${CURRENT_POLICY}

# 削除したいSidを指定
SID_TO_DELETE=${EVENT_RULE_NAME} \
&& echo ${SID_TO_DELETE}

# 現在のポリシーをJSON形式に変換
CURRENT_POLICY_JSON=$(echo ${CURRENT_POLICY} | jq .) \
&& echo ${CURRENT_POLICY_JSON}

# 指定のSidが含まれるステートメントを削除
UPDATED_POLICY=$(
    echo ${CURRENT_POLICY_JSON} | jq 'del(.Statement[] | select(.Sid == "'${SID_TO_DELETE}'"))'
) \
&& echo ${UPDATED_POLICY}

# 更新されたポリシーを文字列に変換
UPDATED_POLICY_STR=$(echo ${UPDATED_POLICY} | jq -c .) \
&& echo ${UPDATED_POLICY_STR}

# 更新されたポリシーを設定
aws sns set-topic-attributes \
    --topic-arn ${TOPIC_ARN} \
    --attribute-name Policy \
    --attribute-value "${UPDATED_POLICY_STR}"
```
```bash:出力
[cloudshell-user@ip-10-130-49-7 ~]$ # 現在のSNSトピックのポリシーを取得
[cloudshell-user@ip-10-130-49-7 ~]$ CURRENT_POLICY=$(
>     aws sns get-topic-attributes \
>         --topic-arn ${TOPIC_ARN} \
>         --query "Attributes.Policy" \
>         --output text
> ) \
> && echo ${CURRENT_POLICY}
{"Version":"2008-10-17","Id":"__default_policy_ID","Statement":[{"Sid":"__default_statement_ID","Effect":"Allow","Principal":{"AWS":"*"},"Action":["SNS:GetTopicAttributes","SNS:SetTopicAttributes","SNS:AddPermission","SNS:RemovePermission","SNS:DeleteTopic","SNS:Subscribe","SNS:ListSubscriptionsByTopic","SNS:Publish"],"Resource":"arn:aws:sns:ap-northeast-1:999999999999:monitoring-1-topic","Condition":{"StringEquals":{"AWS:SourceOwner":"999999999999"}}},{"Sid":"monitoring-1-event-rule","Effect":"Allow","Principal":{"Service":"events.amazonaws.com"},"Action":"sns:Publish","Resource":"arn:aws:sns:ap-northeast-1:999999999999:monitoring-1-topic"}]}
[cloudshell-user@ip-10-130-49-7 ~]$ 
[cloudshell-user@ip-10-130-49-7 ~]$ # 削除したいSidを指定
[cloudshell-user@ip-10-130-49-7 ~]$ SID_TO_DELETE=${EVENT_RULE_NAME} \
> && echo ${SID_TO_DELETE}
monitoring-1-event-rule
[cloudshell-user@ip-10-130-49-7 ~]$ 
[cloudshell-user@ip-10-130-49-7 ~]$ # 現在のポリシーをJSON形式に変換
[cloudshell-user@ip-10-130-49-7 ~]$ CURRENT_POLICY_JSON=$(echo ${CURRENT_POLICY} | jq .) \
> && echo ${CURRENT_POLICY_JSON}
{ "Version": "2008-10-17", "Id": "__default_policy_ID", "Statement": [ { "Sid": "__default_statement_ID", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": [ "SNS:GetTopicAttributes", "SNS:SetTopicAttributes", "SNS:AddPermission", "SNS:RemovePermission", "SNS:DeleteTopic", "SNS:Subscribe", "SNS:ListSubscriptionsByTopic", "SNS:Publish" ], "Resource": "arn:aws:sns:ap-northeast-1:999999999999:monitoring-1-topic", "Condition": { "StringEquals": { "AWS:SourceOwner": "999999999999" } } }, { "Sid": "monitoring-1-event-rule", "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": "sns:Publish", "Resource": "arn:aws:sns:ap-northeast-1:999999999999:monitoring-1-topic" } ] }
[cloudshell-user@ip-10-130-49-7 ~]$ 
[cloudshell-user@ip-10-130-49-7 ~]$ # 指定のSidが含まれるステートメントを削除
[cloudshell-user@ip-10-130-49-7 ~]$ UPDATED_POLICY=$(
>     echo ${CURRENT_POLICY_JSON} | jq 'del(.Statement[] | select(.Sid == "'${SID_TO_DELETE}'"))'
> ) \
> && echo ${UPDATED_POLICY}
{ "Version": "2008-10-17", "Id": "__default_policy_ID", "Statement": [ { "Sid": "__default_statement_ID", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": [ "SNS:GetTopicAttributes", "SNS:SetTopicAttributes", "SNS:AddPermission", "SNS:RemovePermission", "SNS:DeleteTopic", "SNS:Subscribe", "SNS:ListSubscriptionsByTopic", "SNS:Publish" ], "Resource": "arn:aws:sns:ap-northeast-1:999999999999:monitoring-1-topic", "Condition": { "StringEquals": { "AWS:SourceOwner": "999999999999" } } } ] }
[cloudshell-user@ip-10-130-49-7 ~]$ 
[cloudshell-user@ip-10-130-49-7 ~]$ # 更新されたポリシーを文字列に変換
[cloudshell-user@ip-10-130-49-7 ~]$ UPDATED_POLICY_STR=$(echo ${UPDATED_POLICY} | jq -c .) \
> && echo ${UPDATED_POLICY_STR}
{"Version":"2008-10-17","Id":"__default_policy_ID","Statement":[{"Sid":"__default_statement_ID","Effect":"Allow","Principal":{"AWS":"*"},"Action":["SNS:GetTopicAttributes","SNS:SetTopicAttributes","SNS:AddPermission","SNS:RemovePermission","SNS:DeleteTopic","SNS:Subscribe","SNS:ListSubscriptionsByTopic","SNS:Publish"],"Resource":"arn:aws:sns:ap-northeast-1:999999999999:monitoring-1-topic","Condition":{"StringEquals":{"AWS:SourceOwner":"999999999999"}}}]}
[cloudshell-user@ip-10-130-49-7 ~]$ 
[cloudshell-user@ip-10-130-49-7 ~]$ # 更新されたポリシーを設定
[cloudshell-user@ip-10-130-49-7 ~]$ aws sns set-topic-attributes \
>     --topic-arn ${TOPIC_ARN} \
>     --attribute-name Policy \
>     --attribute-value "${UPDATED_POLICY_STR}"
```
### トピック削除
```bash:コマンド
aws sns delete-topic --topic-arn ${TOPIC_ARN} 
```
```bash:出力
[cloudshell-user@ip-10-130-49-7 ~]$ aws sns delete-topic --topic-arn ${TOPIC_ARN} 
```