【2/3】マルチアカウント環境のリソース情報を可視化してみる(AWS Config + Athena + QuickSight)

記事タイトルとURLをコピーする

こんにちは。AWS CLIが好きな福島です。

はじめに

今回は以下のブログの続きとなります。

【1/3】マルチアカウント環境のリソース情報を可視化してみる(AWS Config + Athena + QuickSight) - サーバーワークスエンジニアブログ

前回は第1弾として、以下のことを実施しましたが、今回は第2弾として、可視化したい情報ごとに様々なビューを作成します。 また、アカウント名という有益な情報を付与する方法をご紹介いたします。

第1弾

①ConfigSnapshotの出力設定(各アカウントで実行)
②AWS Config用S3のバケットポリシー更新(ログアーカイブアカウントで実行)
③AWS Config用のテーブル作成(可視化アカウントで実行)
④AWS Config用のテーブルを更新するLambdaの作成(可視化アカウントで実行)
⑤Lambdaのリソースベースポリシーの設定(可視化アカウントで実行)
⑥S3イベントの設定(ログアーカイブアカウントで実施)

第2弾

⑦可視化したい情報ごとに様々なビューの作成(可視化アカウントで実行)
⑧アカウントIDとアカウント名のテーブル作成(可視化アカウントで実行)
⑨⑦と⑧の結合(可視化アカウントで実行)

第3弾

⑩QuickSightでデータの可視化(可視化アカウントで実行)

概要図

第1弾にも記載している概要図を記載いたします。

参考

https://aws.amazon.com/jp/blogs/mt/how-to-query-your-aws-resource-configuration-states-using-aws-config-and-amazon-athena/

https://aws.amazon.com/jp/blogs/mt/visualizing-aws-config-data-using-amazon-athena-and-amazon-quicksight/

⑦可視化したい情報ごとに様々なビューの作成(可視化アカウントで実行)

第1弾で作成したaws_config_configuration_snapshotから、可視化したい情報ごとに様々なビューを作成します。 今回は、サンプルとして、Config,EC2,RDS,VPCのビューを作成しますが、それ以外のサービスもビューを作成し、QuickSightで可視化することが可能です。

すべての AWS Config リソースのビューの作成

CREATE OR REPLACE VIEW v_config_resources AS
SELECT DISTINCT
"accountId" "AccountId"
,"region" "Region"
,"configurationItem"."resourceid" "ResourceId"
,"configurationItem"."resourcename" "ResourceName"
,"configurationItem"."resourcetype" "ResourceType"
,"configurationItem"."availabilityzone" "AvailabiltyZone"
, "configurationItem"."resourceCreationTime" "CreationTime"
FROM default.aws_config_configuration_snapshot
CROSS JOIN UNNEST("configurationitems") t (configurationItem)
WHERE ("dt" = 'latest')

作成したビューを確認してみます。

select * from v_config_resources limit 3

以下のようにConfigで管理できるAWSリソースを確認できます。
この情報を使えば、AWSのリソース数や一番多く利用しているリソースを可視化できます。
ただ情報量が少ないため、このビューの利用用途としては全体を把握するために使う程度になりそうです。

すべての EC2 インスタンスのビューを作成

CREATE OR REPLACE VIEW "v_config_ec2_instances" AS 
SELECT DISTINCT
  "accountId" "AccountId"
, "region" "Region"
, "json_extract_scalar"("configurationItem"."configuration", '$.instanceId') "InstanceId"
, "configurationItem"."tags"['Name'] "TagName"
, "configurationItem"."configurationitemcapturetime" "LastConfigSnapshot"
, "json_extract_scalar"("configurationItem"."configuration", '$.launchTime') "LaunchTime"
, "json_extract_scalar"("configurationItem"."configuration", '$.instanceType') "InstanceType"
, "json_extract_scalar"("configurationItem"."configuration", '$.platform') "platform"
, "json_extract_scalar"("configurationItem"."configuration", '$.keyName') "KeyName"
, "json_extract_scalar"("configurationItem"."configuration", '$.imageId') "AmiId"
, "json_extract_scalar"("configurationItem"."configuration", '$.privateIpAddress') "PrivateIp"
, "json_extract_scalar"("configurationItem"."configuration", '$.publicipAddress') "PublicIp"
, "json_extract_scalar"("configurationItem"."configuration", '$.state.name') "State"
FROM
  (default.aws_config_configuration_snapshot
CROSS JOIN UNNEST("configurationitems") t (configurationItem))
WHERE (("dt" = 'latest') AND ("configurationItem"."resourcetype" = 'AWS::EC2::Instance'))

作成したビューを確認してみます。

select * from v_config_ec2_instances limit 10

以下のようにEC2のリソース情報を確認できます。
この情報を使うことでEC2の総数やインスタンスタイプの内訳、ステータスなど可視化することができます。

すべての VPC のビューを作成

CREATE OR REPLACE VIEW "v_config_vpcs" AS 
SELECT DISTINCT
  "accountId" "AccountId"
, "region" "Region"
, "configurationItem"."resourceid" "ResourceId"
, "configurationItem"."tags"['Name'] "TagName"
, "json_extract_scalar"("configurationItem"."configuration", '$.isDefault') "IsDefault"
, "json_extract_scalar"("configurationItem"."configuration", '$.cidrBlockAssociationSet[0].cidrBlock') "CidrBlock0"
, "json_extract_scalar"("configurationItem"."configuration", '$.cidrBlockAssociationSet[1].cidrBlock') "CidrBlock1"
, "json_extract_scalar"("configurationItem"."configuration", '$.cidrBlockAssociationSet[2].cidrBlock') "CidrBlock2"
, "json_extract_scalar"("configurationItem"."configuration", '$.cidrBlockAssociationSet[3].cidrBlock') "CidrBlock3"
, "json_extract_scalar"("configurationItem"."configuration", '$.cidrBlockAssociationSet[4].cidrBlock') "CidrBlock4"
FROM
  (default.aws_config_configuration_snapshot
CROSS JOIN UNNEST("configurationitems") t (configurationItem))
WHERE (("dt" = 'latest') AND ("configurationItem"."resourcetype" = 'AWS::EC2::VPC'))

作成したビューを確認してみます。

select * from v_config_vpcs limit 3

以下のようにVPCのリソース情報を確認できます。
この情報を使うことでVPCの総数やCIDRなど可視化することができます。

すべての RDS データベース インスタンスのビューを作成

CREATE OR REPLACE VIEW "v_config_rds_dbinstances" AS 
SELECT DISTINCT
  "accountId" "AccountId"
, "region" "Region"
, "configurationItem"."configurationitemcapturetime" "LastConfigSnapshot"
, "configurationItem"."resourcename" "resourcename"
, "configurationItem"."availabilityzone" "availabilityzone"
, "json_extract_scalar"("configurationItem"."configuration", '$.endpoint.address') "EndPoint"
, "json_extract_scalar"("configurationItem"."configuration", '$.engine') "Engine"
, "json_extract_scalar"("configurationItem"."configuration", '$.engineVersion') "engineVersion"
, "json_extract_scalar"("configurationItem"."configuration", '$.endpoint.port') "Port"
, "json_extract_scalar"("configurationItem"."configuration", '$.dBInstanceClass') "InstanceType"
, "json_extract_scalar"("configurationItem"."configuration", '$.storageType') "storageType"
, "json_extract_scalar"("configurationItem"."configuration", '$.allocatedStorage') "allocatedStorage"
, "json_extract_scalar"("configurationItem"."configuration", '$.storageEncrypted') "StorageEncrypted"
, "json_extract_scalar"("configurationItem"."configuration", '$.preferredBackupWindow') "BackupWindow"
, "json_extract_scalar"("configurationItem"."configuration", '$.backupRetentionPeriod') "BackupRetention"
, "json_extract_scalar"("configurationItem"."configuration", '$.preferredMaintenanceWindow') "preferredMaintenanceWindow"
, "json_extract_scalar"("configurationItem"."configuration", '$.publiclyAccessible') "PubliclyAccessible"
, "json_extract_scalar"("configurationItem"."configuration", '$.dBInstanceStatus') "Status"
, "json_extract_scalar"("configurationItem"."configuration", '$.deletionprotection') "DeletionProtection"
FROM
  (default.aws_config_configuration_snapshot
CROSS JOIN UNNEST("configurationitems") t (configurationItem))
WHERE (("dt" = 'latest') AND ("configurationItem"."resourcetype" = 'AWS::RDS::DBInstance'))
select * from v_config_rds_dbinstances limit 3

以下のようにRDSのリソース情報を確認できます。
この情報を使うことでRDSの総数やインスタンスクラスの内訳、ステータス、エンジンごとの内訳などなど可視化することができます。

⑧アカウントIDとアカウント名のテーブル作成(可視化アカウントで実行)

上記ビューにはアカウントIDが付与されていますが、さらにアカウント名も付与されているとより有益な情報になるかと存じます。 ということでここからは、ビューにアカウント名を付与する方法をご紹介いたします。

Lambdaを利用することでこのテーブルを自動更新することも可能ですが、その方法はまたの機会にまとめたいと思います。

変数設定

ACCOUNT_INFO_S3_BUCKET=""

S3バケットの作成

aws s3api create-bucket \
--bucket ${ACCOUNT_INFO_S3_BUCKET} \
--create-bucket-configuration LocationConstraint=ap-northeast-1

アカウント情報の作成

以下のようにアカウント名を記載したファイル(account-info.json)を作成します。 アカウントが4つ以上ある場合、行数を追加します。

{"AccountId":"111111111111","Name":"fk-aws-account-001"}
{"AccountId":"222222222222","Name":"fk-aws-account-002"}
{"AccountId":"333333333333","Name":"fk-aws-account-003"}

アカウント情報のアップロード

aws s3api put-object --bucket ${ACCOUNT_INFO_S3_BUCKET} \
--key account-info.json \
--body account-info.json

Athenaでアカウント情報のテーブル作成

CREATE EXTERNAL TABLE `aws_org_accounts`(
  `accountid` string COMMENT 'from deserializer', 
  `name` string COMMENT 'from deserializer')
ROW FORMAT SERDE 
  'org.openx.data.jsonserde.JsonSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
LOCATION
  's3://<S3バケット名>/'

テーブルの情報を確認します。

select * from aws_org_accounts limit 10

⑨⑦と⑧の結合(可視化アカウントで実行)

今回は、EC2のビューとアカウント情報のビューを結合します。 EC2以外のビューとの結合も同じ要領でできます。

CREATE OR REPLACE VIEW v_config_ec2_instances_aws_org_accounts AS
WITH
a AS (
SELECT * FROM default.v_config_ec2_instances
)
, b AS (
SELECT
"accountid"
, "name"
FROM default.aws_org_accounts 
)
SELECT
"b"."name" "AccountName"
, a.*
FROM
(a
LEFT JOIN b ON ("a"."accountid" = "b"."accountid"))

結合したビューを見てみます。 AccountNameが付与されていることが分かります。

select * from v_config_ec2_instances_aws_org_accounts

終わりに

今回は、可視化したい情報ごとに様々なビューを作成いたしました。
またアカウント名という有益な情報を付与する方法を合わせてご紹介いたしました。

次回は、今回作成したビューを基にQuickSighで可視化してみたいと思います。

福島 和弥 (記事一覧)

2019/10 入社

AWS CLIが好きです。

AWS資格12冠。2023 Japan AWS Partner Ambassador/APN ALL AWS Certifications Engineer。