CloudWatch エージェントを使用してインスタンスのログをS3に転送するCloudFormationの作成

CloudWatch エージェントを使用してインスタンスのログをS3に転送するCloudFormationの作成

目次

    はじめに


    AWSの起動テンプレートに記載したインスタンスのUserdataを使用して、インスタンス起動時からログをAmazon S3に配信するCloudFormationを作成する機会があったため、執筆します。
    ハマったところや注意点をナレッジとして役立てていただければと思います。

    この記事の対象

    • AWS初学者

    • EC2のログ転送を検討している方

    • CloudFormationに興味のある方

    アーキテクチャ図

    202303_CloudWatch02

    作成yamlファイル

    ファイル詳細
    AWSTemplateFormatVersion: 2010-09-09
    Resources:
    mainVPC:
    Type: AWS::EC2::VPC
    Properties:
    CidrBlock: 10.0.0.0/16
    EnableDnsSupport: true
    EnableDnsHostnames: true
    igwName:
    Type: AWS::EC2::InternetGateway
    AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
    VpcId: !Ref mainVPC
    InternetGatewayId: !Ref igwName
    PublicRouteTable:
    Type: AWS::EC2::RouteTable
    DependsOn: AttachGateway
    Properties:
    VpcId: !Ref mainVPC
    PublicRoute:
    Type: AWS::EC2::Route
    DependsOn: AttachGateway
    Properties:
    RouteTableId: !Ref PublicRouteTable
    DestinationCidrBlock: 0.0.0.0/0
    GatewayId: !Ref igwName
    PublicSubnet1:
    Type: AWS::EC2::Subnet
    DependsOn: AttachGateway
    Properties:
    CidrBlock: 10.0.210.0/24
    AvailabilityZoneId: 'use1-az2'
    MapPublicIpOnLaunch: 'True'
    VpcId: !Ref mainVPC
    PublicSubnet1RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
    SubnetId: !Ref PublicSubnet1
    RouteTableId: !Ref PublicRouteTable
    PublicSubnet2:
    Type: AWS::EC2::Subnet
    DependsOn: AttachGateway
    Properties:
    CidrBlock: 10.0.220.0/24
    AvailabilityZoneId: 'use1-az4'
    MapPublicIpOnLaunch: 'True'
    VpcId: !Ref mainVPC
    PublicSubnet2RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
    SubnetId: !Ref PublicSubnet2
    RouteTableId: !Ref PublicRouteTable
    PrivateSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
    CidrBlock: 10.0.1.0/24
    AvailabilityZoneId: 'use1-az2'
    MapPublicIpOnLaunch: 'false'
    VpcId: !Ref mainVPC
    PrivateSubnet1RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
    SubnetId: !Ref PrivateSubnet1
    RouteTableId: !Ref PrivateSubnet1RouteTable
    PrivateSubnet1RouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
    VpcId: !Ref mainVPC
    PrivateSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
    CidrBlock: 10.0.2.0/24
    AvailabilityZoneId: 'use1-az4'
    MapPublicIpOnLaunch: 'false'
    VpcId: !Ref mainVPC
    PrivateSubnet2RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
    SubnetId: !Ref PrivateSubnet2
    RouteTableId: !Ref PrivateSubnet2RouteTable
    PrivateSubnet2RouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
    VpcId: !Ref mainVPC
    PublicSecGroupName:
    Type: AWS::EC2::SecurityGroup
    Properties:
    GroupName: handson-lbsg
    GroupDescription: SecGroupLB
    VpcId: !Ref mainVPC
    SecurityGroupIngress:
    - IpProtocol: tcp
    FromPort: 80
    ToPort: 80
    CidrIp: 0.0.0.0/0
    PrivateSecGroupName1:
    Type: AWS::EC2::SecurityGroup
    Properties:
    GroupName: handson-websg
    GroupDescription: SecGroupWEB
    VpcId: !Ref mainVPC
    SecurityGroupIngress:
    - IpProtocol: tcp
    FromPort: 80
    ToPort: 80
    CidrIp: 0.0.0.0/0
    PrivateSecGroupName2:
    Type: AWS::EC2::SecurityGroup
    Properties:
    GroupName: handson-endppointsg
    GroupDescription: SecGroupDB
    VpcId: !Ref mainVPC
    SecurityGroupIngress:
    - IpProtocol: tcp
    FromPort: 443
    ToPort: 443
    CidrIp: 10.0.0.0/16
    ssmEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
    ServiceName: !Join
    - ''
    - - com.amazonaws.
    - !Ref 'AWS::Region'
    - .ssm
    SubnetIds:
    - !Ref PrivateSubnet1
    - !Ref PrivateSubnet2
    VpcId: !Ref mainVPC
    VpcEndpointType: Interface
    SecurityGroupIds:
    - !Ref PrivateSecGroupName2
    PrivateDnsEnabled: true
    ssmmessagesEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
    ServiceName: !Join
    - ''
    - - com.amazonaws.
    - !Ref 'AWS::Region'
    - .ssmmessages
    SubnetIds:
    - !Ref PrivateSubnet1
    - !Ref PrivateSubnet2
    VpcId: !Ref mainVPC
    VpcEndpointType: Interface
    SecurityGroupIds:
    - !Ref PrivateSecGroupName2
    PrivateDnsEnabled: true
    ec2messagesEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
    ServiceName: !Join
    - ''
    - - com.amazonaws.
    - !Ref 'AWS::Region'
    - .ec2messages
    SubnetIds:
    - !Ref PrivateSubnet1
    - !Ref PrivateSubnet2
    VpcId: !Ref mainVPC
    VpcEndpointType: Interface
    SecurityGroupIds:
    - !Ref PrivateSecGroupName2
    PrivateDnsEnabled: true
    logsEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
    ServiceName: !Join
    - ''
    - - com.amazonaws.
    - !Ref 'AWS::Region'
    - .logs
    SubnetIds:
    - !Ref PrivateSubnet1
    - !Ref PrivateSubnet2
    VpcId: !Ref mainVPC
    VpcEndpointType: Interface
    SecurityGroupIds:
    - !Ref PrivateSecGroupName2
    PrivateDnsEnabled: true
    MonitoringEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
    ServiceName: !Join
    - ''
    - - com.amazonaws.
    - !Ref 'AWS::Region'
    - .monitoring
    SubnetIds:
    - !Ref PrivateSubnet1
    - !Ref PrivateSubnet2
    VpcId: !Ref mainVPC
    VpcEndpointType: Interface
    SecurityGroupIds:
    - !Ref PrivateSecGroupName2
    PrivateDnsEnabled: true
    ec2Endpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
    ServiceName: !Join
    - ''
    - - com.amazonaws.
    - !Ref 'AWS::Region'
    - .ec2
    SubnetIds:
    - !Ref PrivateSubnet1
    - !Ref PrivateSubnet2
    VpcId: !Ref mainVPC
    VpcEndpointType: Interface
    SecurityGroupIds:
    - !Ref PrivateSecGroupName2
    PrivateDnsEnabled: true
    s3Endpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
    ServiceName: !Join
    - ''
    - - com.amazonaws.
    - !Ref 'AWS::Region'
    - .s3
    VpcId: !Ref mainVPC
    RouteTableIds:
    - !Ref PrivateSubnet1RouteTable
    - !Ref PrivateSubnet2RouteTable
    EC2Role:
    Type: AWS::IAM::Role
    Properties:
    RoleName: handson-webRole
    AssumeRolePolicyDocument:
    Version: 2012-10-17
    Statement:
    - Effect: Allow
    Principal:
    Service:
    - ec2.amazonaws.com
    Action:
    - sts:AssumeRole
    Path: /
    ManagedPolicyArns:
    - arn:aws:iam::aws:policy/CloudWatchAgentAdminPolicy
    - arn:aws:iam::aws:policy/CloudWatchLogsFullAccess
    - arn:aws:iam::aws:policy/AmazonSSMFullAccess
    InstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
    Path: /
    Roles:
    - !Ref EC2Role
    LaunchTemplate:
    Type: AWS::EC2::LaunchTemplate
    Properties:
    LaunchTemplateName: handson-launchtemplates
    LaunchTemplateData:
    IamInstanceProfile:
    Arn: !GetAtt InstanceProfile.Arn
    SecurityGroupIds:
    - !Ref PrivateSecGroupName1
    - !Ref PrivateSecGroupName2
    ImageId: ami-0b5eea76982371e91
    InstanceType: t2.micro
    Monitoring:
    Enabled: true
    UserData:
    Fn::Base64: |
    #!/bin/bash
    yum update -y
    yum install httpd -y
    touch /var/www/html/index.html
    echo "Hello World from user data" > /var/www/html/index.html
    systemctl enable httpd
    systemctl start httpd

    amazon-linux-extras enable collectd
    yum clean metadata
    yum -y install collectd

    yum -y install amazon-cloudwatch-agent
    systemctl enable amazonn-cloudwatch-agent.service
    systemctl start amazonn-cloudwatch-agent.service
    cat << EOF > /opt/aws/amazon-cloudwatch-agent/bin/config.json
    {
    "agent": {
    "run_as_user": "root"
    },
    "logs": {
    "logs_collected": {
    "files": {
    "collect_list": [
    {
    "file_path": "/var/log/messages",
    "log_group_name": "handson-log-group",
    "log_stream_name": "/var/log/messages",
    "retention_in_days": -1
    }
    ]
    }
    }
    },
    "metrics": {
    "metrics_collected": {
    "statsd": {
    "metrics_aggregation_interval": 60,
    "metrics_collection_interval": 10,
    "service_address": ":8125"
    }
    }
    }
    }
    EOF
    /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s
    systemctl restart amazonn-cloudwatch-agent.service
    AutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
    LaunchTemplate:
    LaunchTemplateId: !Ref LaunchTemplate
    Version: !GetAtt LaunchTemplate.LatestVersionNumber
    MaxSize: '1'
    MinSize: '1'
    DesiredCapacity: '1'
    TargetGroupARNs:
    - !Ref TargetGroup
    VPCZoneIdentifier:
    - !Ref PrivateSubnet1
    - !Ref PrivateSubnet2
    TargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
    VpcId: !Ref mainVPC
    Protocol: HTTP
    Port: 80
    ApplicationLoadBalancer:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
    Name: handson-alb
    Scheme: internet-facing
    SecurityGroups:
    - !Ref PublicSecGroupName
    Subnets:
    - !Ref PublicSubnet1
    - !Ref PublicSubnet2
    ALBListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
    LoadBalancerArn: !Ref ApplicationLoadBalancer
    DefaultActions:
    - TargetGroupArn: !Ref TargetGroup
    Type: forward
    Port: 80
    Protocol: HTTP
    LogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
    LogGroupName: handson-log-group
    FirehoseSubscriptionFilter:
    Type: AWS::Logs::SubscriptionFilter
    Properties:
    DestinationArn: !GetAtt Deliverystream.Arn
    FilterPattern: ''
    LogGroupName: !Ref LogGroup
    RoleArn: !GetAtt LogsRole.Arn
    LogsRole:
    Type: AWS::IAM::Role
    Properties:
    AssumeRolePolicyDocument:
    Version: '2012-10-17'
    Statement:
    - Effect: Allow
    Principal:
    Service: !Sub 'logs.${AWS::Region}.amazonaws.com'
    Action: sts:AssumeRole
    Path: /
    Policies:
    - PolicyName: root
    PolicyDocument:
    Version: '2012-10-17'
    Statement:
    - Effect: Allow
    Action:
    - firehose:PutRecord
    - firehose:PutRecords
    Resource: !GetAtt 'Deliverystream.Arn'
    FirehoseRole:
    Type: AWS::IAM::Role
    Properties:
    AssumeRolePolicyDocument:
    Version: '2012-10-17'
    Statement:
    - Sid: ''
    Effect: Allow
    Principal:
    Service: firehose.amazonaws.com
    Action: sts:AssumeRole
    Path: /
    Policies:
    - PolicyName: handson-firehose-policy
    PolicyDocument:
    Version: 2012-10-17
    Statement:
    - Effect: Allow
    Action:
    - s3:AbortMultipartUpload
    - s3:GetBucketLocation
    - s3:GetObject
    - s3:ListBucket
    - s3:ListBucketMultipartUploads
    - s3:PutObject
    Resource:
    - !Sub 'arn:aws:s3:::${S3bucket}'
    - !Sub 'arn:aws:s3:::${S3bucket}*'
    Deliverystream:
    Type: AWS::KinesisFirehose::DeliveryStream
    Properties:
    ExtendedS3DestinationConfiguration:
    BucketARN: !Sub 'arn:aws:s3:::${S3bucket}'
    RoleARN: !GetAtt 'FirehoseRole.Arn'
    S3bucket:
    Type: AWS::S3::Bucket

    留意事項

    • 本構成は「米国東部リージョン(バージニア北部)」にて作成しています。
      別のリージョンで作成をする際には、上記のyamlテンプレートの「us-east-1」を、任意のリージョンに書き換えてご使用ください。

    • 各サービスの名前を省略しているため、作成されるリソースはランダムな文字列の名前となります。
      リソースに任意の名前をつけたい場合は、リソースにNameプロパティを追加し、任意の名前を設定してください。プロパティの記法の確認には下記参考情報に各リソースのドキュメントのリンクを記載しましたのでご活用ください。

    • アーキテクチャ図では、2つのプライベートサブネットにインスタンスをデプロイしていますが、上記のyamlテンプレートは検証用のため2つあるプライベートサブネットのどちらかに1台のインスタンスがデプロイされるようにしています。

    構成のポイント

    本構成では、Load balancersとAuto Scalling グループで構成されたWebサーバの作成、及び作成したサーバからシステムログを収集し、S3にて保管を想定しています。
    まずはシステム構成について説明します。

    本構成ではAuto Scalling グループを使用した動的拡張を実施しています。
    そのため、Auto Scalling グループが利用する起動テンプレートにWebサービスの起動及びCloudWatch エージェントの設定を記述することで、AutoScalingによって追加されたサーバに改めて設定を行うことなく、ログ収集が行えるようにしています。
    Auto Scalling グループを使用した動的拡張のトリガーとして、Application Load balancersとターゲットグループを作成し、ヘルスチェックを行っています。

    上記の構成のインスタンスのログをAmazon S3に配信するために今回CloudWatch ロググループとAmazon Kinesis Data Firehoseのサービスを使用しました。
    配信の流れは以下の通りです。
    インスタンスのログをCloudWatch エージェント経由でCloudWatch ロググループに転送し、Amazon Kinesis Data Firehoseを使用して、CloudWatch ロググループからAmazon S3内のバケットに配信をしています。

     

    ログの処理フロー図

    202303_CloudWatch01

    続きまして、今回の構成について細かい設定解説をしていきます。長くなるので、インスタンス→CloudWatch ロググループまでと、CloudWatch ロググループ→Amazon S3までに分けて紹介していきます。

    インスタンス→CloudWatch ロググループ

    まずはインスタンス→CloudWatch ロググループまでの説明です。
    インスタンスのログをCloudWatch ロググループへ出力させるためには以下の2点の設定を追加しています。

    • インスタンスにCloudWatch エージェントのインストール及び設定

    • インスタンスにCloudWatchへの権限付与

    また、本構成ではインスタンスはプライベートサブネットに配置されているため、以下の設定を追加しています。

    • VPCエンドポイントの作成

    • セキュリティグループの追加

     

    インスタンスにCloudWatch エージェントのインストール及び設定

    インスタンスの任意のログをCloudWatchを使用して収集するためには、インスタンスにCloudWatch エージェントをインストール及び設定をする必要があります。
    CloudWatch エージェントのインストール及び設定は起動テンプレートのUserdataを利用しました。

    • コマンド
      yum install amazon-CloudWatch-agent

     

    また、amazon-CloudWatch-agentの設定ファイルを変更することで、収集対象のファイル、転送するCloudWatch ロググループを指定します。

    • 設定ファイル

      /opt/aws/amazon-CloudWatch-agent/bin/config.json

     

    CloudWatch エージェントの設定は、以下のウィザードを使用した対話方式の設定と、Systems Manager パラメータストア等から設定ファイルを作成する、2種類の方法があります。

    • 対話方式による設定コマンド

      amazon-CloudWatch-agent-config-wizard

     

    今回は、Systems Manager パラメータストアを使用せずに、Userdataからcatコマンドを使用してjsonファイルを作成する方法を選択しています。
    config.jsonは以下の3つのセクションから構成されます。

    • agentセクション : エージェント全体の設定に関する内容を記載。本構成ではroot権限でログを収集することを記載。
    • logsセクション : CloudWatch ロググループに発行されるログに関する内容を記載。本構成では収集対象のファイル及びログを出力するCloudWatch ロググループ名を記載。
    • metricsセクション:ログの収集と発行に関するカスタムメトリクスを記載。本構成ではログの収集間隔及びポート番号を記載。

    上記のUserdataの編集をすることで、用途に合わせて追加のログを収集することができます。
    (本構成では/var/log/messageを収集対象としています。)

    設定ファイルを作成しただけでは設定は反映がされないため、以下のコマンドでCloudWatch エージェントの設定を更新します。

    • 設定適用コマンド
      /opt/aws/amazon-CloudWatch-agent/bin/amazon-CloudWatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-CloudWatch-agent/bin/config.json -s

     

    インスタンスにCloudWatchへの権限付与

    インスタンスからCloudWatch エージェントを使用してCloudWatch ロググループにログを出力させるためには、EC2がCloudWatchにアクセスする権限が必要です。
    以下のIAMポリシーを関連付けたIAMロールを作成しています。

    適用ポリシー

    • CloudWatchLogsFullAccess
    • CloudWatchAgentAdminPolicy

    また、今回インスタンスに対してSSH接続ではなく、SSMセッションマネージャーを使用したコンソール接続を想定しているため、追加で以下のポリシーも設定しています。
    SSMセッションマネージャーを使用しない場合、以下のポリシーは不要です。

    適用ポリシー

    • AmazonSSMFullAccess

    作成したロールを起動テンプレート内に関連づけることで、作成したインスタンスがCloudWatchへアクセスすることが可能です。

     

    VPCエンドポイントの作成

    プライベートサブネットに配置しているインスタンスからCloudWatch ロググループにログを出力するには、VPCエンドポイントを配置して出力経路を確保する必要があります。
    そのため、ログ出力用のVPCエンドポイントを作成し、プライベートサブネットに関連付けています。

    • com.amazonaws.us-east-1.ec2
    • com.amazonaws.us-east-1.monitoring
    • com.amazonaws.us-east-1.logs

    本構成では米国東部リージョンに作成したため、「us-east-1」としておりますが、こちらを任意のリージョンにすることで他のリージョンでも同様の設定することができます。
    インスタンスをパブリックサブネット、プライベートサブネットするに関わらず、CloudWatch エージェント側での追加の設定は不要です。
    プライベートサブネットに配置する場合はVPCエンドポイントの設定を忘れないようにしましょう。

     

    セキュリティグループの追加

    VPCエンドポイントはHTTPS(443番ポート)を使用して通信を行うため、インスタンスのセキュリティグループにHTTPS通信を許可する必要があります。

    • 許可ポート:443
    • 許可IPアドレス:10.0.0.0/16
       VPCエンドポイントの通信はAWS内部通信のため、VPCのIPアドレス範囲を指定

    本構成では、区別がしやすいようにインスタンスのセキュリティグループを、Load balancersで使用する外部アクセス用のセキュリティグループと、VPCエンドポイントで使用する内部アクセス用のセキュリティグループに分けて作成しています。

    CloudWatch ロググループ→Amazon S3

    続いてCloudWatch ロググループ→Amazon S3までの設定説明です。
    CloudWatch ロググループに出力したログを、Amazon Kinesis Data Firehoseを経由してAmazon S3のバケットに配信するためには、以下の4点を設定します。

    • ログを格納するAmazon S3バケットの作成

    • CloudWatch及びAmazon Kinesis Data Firehoseのアクセス権限設定

    • Amazon Kinesis Data Firehose の作成

    • CloudWatch ロググループのサブスクリプションフィルターを作成

     

    Amazon S3バケット作成

    まずはログを格納するバケットの作成です。
    本構成ではバージョニングやライフサイクルポリシーの設定を省略して一意のバケットを作成しています。

     

    CloudWatch及びAmazon Kinesis Data Firehoseのアクセス権限設定

    CloudWatch ロググループがAmazon Kinesis Data Firehoseにログを配信するためのロールと、Amazon Kinesis Data FirehoseがAmazon S3にログを配信するためのロールの2つを作成しています。

    • CloudWatch用のロール

    Amazon Kinesis Data Firehose のサービスに対して、単一(PutRecord)または複数(PutRecords)のレコードを送信するポリシー及びロールを作成します。
    作成したロールはサブスクリプションフィルターにて関連付けします。

     

    • Amazon Kinesis Data Firehose用のロール

    Amazon S3のバケットに対してログを格納するポリシー及びロールを作成します。
    作成したロールはAmazon Kinesis Data Firehose にて関連付けします。

     

    Amazon Kinesis Data Firehose の作成

    前述したAmazon S3バケット及びAmazon Kinesis Data Firehose用のロールを関連付けした、Amazon Kinesis Data Firehose の配信を作成します。
    Amazon Kinesis Data FirehoseからAmazon S3に配信を行う場合、ExtendedS3DestinationConfigurationのプロパティタイプを使用します。

     

    CloudWatch ロググループのサブスクリプションフィルターを作成

    CloudWatch ロググループとサブスクリプションフィルターの関連付けを行います。

    まとめ

    以上、インスタンス起動時からログをAmazon S3に配信するCloudFormationの解説でした。
    CloudFormationの作成経験が浅いため、設定を確認するためにマネジメントコンソールで実際にサービスを作成したり、 AWS公式ドキュメントのパラメータを確認しながら作成をしました。

    VPCから作成を行ったため、上記のyamlファイルをコピーペーストすることでCloudFormationで本記事の構成が再現できるようになっています。
    ただし、その分yamlファイルが長くなったため、必要な設定値はなるべく最小限にしています。
    必要に応じて、以下のAWSドキュメントから必要な設定値を追記してご使用ください。
    また、本構成はAWSの無料使用枠以外のサービスも使用しているため、検証時にはリソースの削除漏れにご注意ください。
    作成したリソースはCloudFormation上から削除できますが、事前にS3バケットに転送したログの削除をするようにしてください。

    参考情報

    AWS::EC2::VPCEndpoint

    AWS::IAM::Role

    AWS::EC2::LaunchTemplate

    AWS::IAM::InstanceProfile

    AWS::AutoScaling::AutoScalingGroup

    AWS::ElasticLoadBalancingV2::TargetGroup

    AWS::ElasticLoadBalancingV2::LoadBalancer

    AWS::ElasticLoadBalancingV2::Listener

    AWS::Logs::SubscriptionFilter

    AWS::KinesisFirehose::DeliveryStream

    CloudWatch エージェント設定ファイルを手動で作成または編集する

    Amazon Linux2にCloudWatchエージェントを設定する手順(ユーザデータでの手順あり)

    [AWS CFn] Cloudwatch LogsのログをFirehose経由でS3に転送する

    アジアクエスト株式会社では一緒に働いていただける方を募集しています。
    興味のある方は以下のURLを御覧ください。