AWS Global Acceleratorのフローログを設定して可視化してみた

はじめに

AWSチームのすずきです。

海外からのインターネットアクセスの改善のために導入したAWS Global Accelerator。 その利用傾向や、コストの確認のためGlobal AcceleratorのフローログをS3に出力する設定を行い、 Amazon Athenaを利用した集計と、Amazon QuickSightによる可視化を試みる機会がありましたので、 紹介させて頂きます。

AWS Global Acceleratorを利用して国外からのブログアクセスを改善してみた

準備

実行環境

AWS Global Accelerator に対応した最新AWS CLIの実行環境を用意しました。

  • OS: AmazonLinux 2 (amzn2-ami-hvm-2.0.20181114-x86_64-gp2)
  • IAMロール: PowerUserAccessを付与済

最新AWS CLIインストール

sudo yum install git -y
curl -O https://bootstrap.pypa.io/get-pip.py
python get-pip.py --user
echo 'export PATH=~/.local/bin:$PATH' >> ~/.bash_profile
source .bash_profile
pip install -U awscli --user

AWS CLIバージョン情報

$ aws --version
aws-cli/1.16.75 Python/2.7.14 Linux/4.14.77-81.59.amzn2.x86_64 botocore/1.12.65

エンドポイント確認

  • AWS Global Acceleratorのエンドポイントはオレゴンに存在します。
$ host globalaccelerator.amazonaws.com
globalaccelerator.amazonaws.com is an alias for globalaccelerator.us-west-2.amazonaws.com.
globalaccelerator.us-west-2.amazonaws.com is an alias for globalaccelerator-1584653106.us-west-2.elb.amazonaws.com.
globalaccelerator-1584653106.us-west-2.elb.amazonaws.com has address 52.32.64.41
globalaccelerator-1584653106.us-west-2.elb.amazonaws.com has address 52.88.94.37
globalaccelerator-1584653106.us-west-2.elb.amazonaws.com has address 34.209.92.216

$ host globalaccelerator.ap-northeast-1.amazonaws.com
Host globalaccelerator.ap-northeast-1.amazonaws.com not found: 3(NXDOMAIN)
  • Global Acceleratorの設定は、CLIのオプションで「us-west-2」リージョンを明示して行いました。

list-accelerators

$ aws --region=us-west-2 globalaccelerator list-accelerators
{
    "Accelerators": [
        {
            "AcceleratorArn": "arn:aws:globalaccelerator::000000000000:accelerator/xxxx-xxxx-xxxx-xxxx-xxxx",
            "IpAddressType": "IPV4",
            "Name": "xxxxxxxx",
            "Enabled": true,
            "Status": "DEPLOYED",
            "IpSets": [
                {
                    "IpAddresses": [
                        "13.248.136.211",
                        "76.223.10.179"
                    ],
                    "IpFamily": "IPv4"
                }
            ],
            "CreatedTime": 1544503340.0,
            "LastModifiedTime": 1544503343.0
        }
    ]
}

設定

S3

S3バケット作成

  • フローログの出力先となる、任意のS3バケット「global-accelerator-flowlogs-xxxxxx」を作成します。
  • Athena、QuickSightを利用するリージョンに設置しました。

S3バケットポリシー設定

  • 作成したS3バケットに以下のバケットポリシーを反映、フローログの書き込みを許可します。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AWSLogDeliveryWrite",
            "Effect": "Allow",
            "Principal": {
                "Service": "delivery.logs.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::global-accelerator-flowlogs-xxxxxx/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        },
        {
            "Sid": "AWSLogDeliveryAclCheck",
            "Effect": "Allow",
            "Principal": {
                "Service": "delivery.logs.amazonaws.com"
            },
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::global-accelerator-flowlogs-xxxxxx"
        }
    ]
}

Global Accelerator

  • CLIを利用してフローログを有効にします。
aws --region=us-west-2 globalaccelerator update-accelerator-attributes \
    --accelerator-arn arn:aws:globalaccelerator::000000000000:accelerator/xxxx-xxxx-xxxx-xxxx-xxxx \
    --flow-logs-enabled \
    --flow-logs-s3-bucket global-accelerator-flowlogs-xxxxxx \
    --flow-logs-s3-prefix flowlogs/xxxxxx/

update-accelerator-attributes実行結果

$ aws --region=us-west-2 globalaccelerator update-accelerator-attributes \
>        --accelerator-arn arn:aws:globalaccelerator::000000000000:accelerator/xxxx-xxxx-xxxx-xxxx-xxxx \
>        --flow-logs-enabled \
>        --flow-logs-s3-bucket global-accelerator-flowlogs-xxxxxx \
>        --flow-logs-s3-prefix flowlogs/xxxxxx/
{
    "AcceleratorAttributes": {
        "FlowLogsS3Bucket": "global-accelerator-flowlogs-xxxxxx",
        "FlowLogsS3Prefix": "flowlogs/xxxxxx/",
        "FlowLogsEnabled": true
    }
}

Athena

  • 今回「2018/12/14」以下のフローログを集計対象とし、スペース区切りのCSVとして読み込みます。
CREATE EXTERNAL TABLE `flowlogs`(
  `version` string, 
  `aws_account_id` string, 
  `accelerator_id` string, 
  `client_ip` string, 
  `client_port` string, 
  `gip` string, 
  `gip_port` string, 
  `endpoint_ip` string, 
  `endpoint_port` string, 
  `protocol` string, 
  `ip_address_type` string, 
  `packets` bigint, 
  `bytes` bigint, 
  `start_time` bigint, 
  `end_time` bigint, 
  `action` string, 
  `log_status` string, 
  `globalaccelerator_source_ip` string, 
  `globalaccelerator_source_port` string, 
  `endpoint_region` string, 
  `globalaccelerator_region` string, 
  `direction` string)
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY ' ' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://global-accelerator-flowlogs-xxxx/flowlogs/xxxxxx/AWSLogs/000000000000/globalaccelerator/us-west-2/2018/12/14'
TBLPROPERTIES (
  'CrawlerSchemaDeserializerVersion'='1.0', 
  'CrawlerSchemaSerializerVersion'='1.0', 
  'UPDATED_BY_CRAWLER'='orders_jp', 
  'classification'='csv', 
  'columnsOrdered'='true', 
  'compressionType'='none', 
  'delimiter'=' ', 
  'objectCount'='1', 
  'skip.header.line.count'='1', 
  'transient_lastDdlTime'='1544880186', 
  'typeOfData'='file')

「テーブルのプレビュー」結果

集計データ作成

  • 1時間集計データが生成出来ることを確認します。
SELECT 
  date_format(from_unixtime(start_time),'%Y-%m-%dT%H:00:00') as start_datetime
, client_ip
, protocol
, ip_address_type
, sum(bytes) as sum_byte
, sum(end_time-start_time) as sum_elapsed_time
, count(1) as count_rec
, log_status
, substring(split_part(globalaccelerator_region,'-',1),1,3) as ga_region
, direction
FROM "default"."ga_flowlogs"
GROUP BY 
  date_format(from_unixtime(start_time),'%Y-%m-%dT%H:00:00') 
, client_ip
, protocol
, ip_address_type
, log_status
, substring(split_part(globalaccelerator_region,'-',1),1,3)
, direction
order by sum_byte desc
limit 10
  • order by, limit を除外したものを、QuickSightのカスタムクエリとして利用します。

  • 実行結果

QuickSight

AWS resources設定

  • バージニアリージョンのQuickSightコンソールを利用して、AthenaとS3の利用を許可する権限設定を行います。

  • 利用するAthena と S3をチェック

  • S3はフローログ出力先のバケットをチェックします。

Data Set作成

  • Athenaを利用するデータセットを作成します。

  • SPICEの容量節約と同期時間の短縮の為、カスタムSQLを指定します。

  • 先に動作確認をした1時間集計を行うSQLを登録し、「Finish」を行います。
SELECT 
  date_format(from_unixtime(start_time),'%Y-%m-%dT%H:00:00') as start_datetime
, client_ip
, protocol
, ip_address_type
, sum(bytes) as sum_byte
, sum(end_time-start_time) as sum_elapsed_time
, count(1) as count_rec
, log_status
, substring(split_part(globalaccelerator_region,'-',1),1,3) as ga_region
, direction
FROM "default"."ga_flowlogs"
GROUP BY 
  date_format(from_unixtime(start_time),'%Y-%m-%dT%H:00:00') 
, client_ip
, protocol
, ip_address_type
, log_status
, substring(split_part(globalaccelerator_region,'-',1),1,3)
, direction

  • Athenaで文字列型で出力した日時カラム、QuickSightで時刻カラムとして扱うための設定を行います。

Visualize

QuickSightで対象を指定して可視化を行いました。

direction
  • 約94%のトラフィックがEGRESS、ユーザーへのアウトバウンドトラフィックである事が確認できました。

region
  • 米国からのアクセスが大半を占め約60%、アジアと欧州からのアクセスがそれぞれ20%程度である事が確認できました。

時間別
  • 1時間あたりのトラフィックは400MB弱、1日8GB程度のトラフィックが発生する事を確認できました。

まとめ

今回Global Acceleratorを導入した環境、1日あたりのAWS費用は約0.85ドルとの計算になりました。

内訳は、時間課金で発生する固定費用として0.6ドル(0.025ドル * 24時間)。 ネットワーク転送量に応じた課金は 0.25 ドル ((8GB * 0.035ドル * 0.6 ) + (8GB * 0.043ドル * 0.2 ) + (8GB* 0.01ドル * 0.2 ) )でした。

事前に予想したコストで利用できる目処のついたGlobal Accelerator、 しばらく継続稼働させ、その費用に見合う効果が得られるか確認を試みてみたいと思います。

AWS Global Accelerator の料金