APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

【Alibaba Cloud】Cloud Configを触ってみる

はじめに

こんにちは、IaC技術推進部の山路です。今回はAlibaba Cloudの管理サービスの中から、Cloud Configについて紹介いたします。

Cloud Configとは

Cloud ConfigはAlibaba Cloudの提供するリソース管理サービスの一つです。Cloud Configは、利用者の作成したリソースの一覧を提供し、あらかじめ設定したRuleに則ってコンプライアンスのチェックを自動的に行います。コンプライアンスに違反するリソースが存在する場合は管理画面上に表示され、対象のリソースを確認することができます。これにより、大量のリソースを利用している場合でも、組織のコンプライアンスに違反するリソースを素早く認識し、対策を打つことが可能になります。

Cloud Configには他にも以下のような特徴があります。

  • Scopeの設定変更:Cloud Configでは監視対象のリソースを「Scope」として設定します。サービス開始時点では監視対象のすべてのリソース種別をScopeとして設定しますが、一部リソース種別にのみ適用し、監視対象リソースを絞ることが可能です。
  • 複数リージョンのリソースを管理:Cloud Configは複数のリージョンに作成されたリソースに対して適用されます。
  • MNSと連携してメッセージを飛ばすことも可能:Alibaba CloudのMNS (Message Notification Service)と連携し、コンプライアンス違反を検知した際にメッセージを送信し、管理者等に通知することができます。
  • リソースの自動修正:一部リソースに対しては、コンプライアンス違反を検知すると同時に設定を修正することができます。また設定の修正は自動・手動を選択することが可能です。
  • Config Snapshotを保存OSS (Object Storage Service)にConfig情報を転送・保存し、各リソースの設定内容履歴を長期保存することが可能です。
  • ActionTrailとの連携:Alibaba Cloudの別サービスであるActionTrailと連携し、各リソースの操作履歴を表示します。あるリソースがコンプライアンス違反となったとき、対象リソースの操作内容や時間をCloud Config管理画面から確認することができます。

一方でCloud Configを利用する際には以下のような注意点もあります。

  • 一部サービスのみ対応:Cloud Configは全てのサービスに対応しているわけではないため、管理対象とするリソースが監視対象に含まれているかは事前に確認が必要となります。Cloud Configが対応するリソース種別はこちらのページより確認できます。
  • 自動修正は一部機能のみ対応:リソースの自動修復は、本記事執筆時点ではTagの付与のみが対応しています(こちらのページを参照)。
  • RuleはScopeに一括で適用される:Cloud ConfigのRuleは、設定したScopeに対して一律で適用されます。そのため、複数のリソースを別々の範囲(リージョンなど)に個別に適用することはできません。例えば開発環境・本番環境で別々のRuleを適用したい場合、Alibaba Cloudアカウントを分けることでScopeを別々にし、それぞれにRuleを適用することで実現できます。

構築手順

有効化

ではここからCloud Configの利用方法について紹介します。

まずはCloud Configを有効にする必要があります。Webコンソールから「Cloud Config」のページに移動し、必要に応じてサービスの有効化を行います。

authorized

公式ドキュメントより

有効化が完了すると、Cloud Configの概要画面が表示されます。

f:id:FY0323:20200708173044p:plain

Rule作成

Cloud Configのコンプライアンス監視機能を利用するため、まずはRuleの作成を行います。Cloud Configで利用するRuleは、ある特定のリソースに対して一定の基準を設け、それを超える、あるいは下回ったときにアラートを表示する用動作します。

Ruleには3つの種類があり、いずれかを選択して利用します。

  • Managed rule:Alibaba Cloudが作成した、デフォルトで利用可能なテンプレート。
  • Function Compute:Alibaba Cloudの別サービスであるFunction Computeを利用する。Function Computeの例はこちら
  • Visual Editor:Webブラウザ上でリソースなどを設定。

Managed Ruleの場合

今回はまず、ECSと紐づいていないDiskが存在しないかどうかをチェックするecs-disk-in-useというManaged Ruleを利用してみます。

まずは「Create Rule」を選択します。

f:id:FY0323:20200708173124p:plain

Ruleの作成画面に移動したら、まずは利用するRuleのタイプを選択します。今回は「Managed Rule」を選択します。

f:id:FY0323:20200708173322p:plain

「Rule ARN」でecs-disk-in-useを検索し、選択します。Managed Ruleの場合、利用するRuleを選択した時点でRule名が入力されるので、これをそのまま利用します。「Risk Level」はそのままの設定とします。

f:id:FY0323:20200709093742p:plain

次にRuleを適用する対象のリソースと、Ruleに設定されているパラメータを設定します。

f:id:FY0323:20200708173846p:plain

Managed Ruleでは、対象リソース・パラメータともに既に設定されていることが多く、今回も特に設定する箇所はありません。

f:id:FY0323:20200708173758p:plain

次に、Ruleを違反したリソースに対する修正について設定します。ここでも3つの選択がありますが、ecs-disk-in-useの場合コンフィグの自動修正は実行できないため、Disable Correctionを選択します。「Submit」を選択すれば、設定は完了です。

f:id:FY0323:20200708174006p:plain

これでRuleの設定が完了しました。

f:id:FY0323:20200708174101p:plain

しばらくすると設定したRuleが起動し、リソースに対するコンプライアンスチェックを行います。この時点ではRuleに違反したリソースが存在しないため、「Non-Compliance」がゼロにカウントされます。

f:id:FY0323:20200709093948p:plain

ここでECSインスタンスにアタッチされていないDiskを用意します。

f:id:FY0323:20200709101249p:plain

Diskを作成してしばらくすると、先ほどはゼロにカウントされていた「Non-Compliance」が変化しています。

f:id:FY0323:20200708175001p:plain

「Non-compliant Resources」を選択すると、コンプライアンスに違反したリソースも確認することができます。

f:id:FY0323:20200709101429p:plain

対象のリソースを選択することで、リソースの詳細(コンフィグ情報やコンプライアンス違反をしたRuleなど)を確認することができます。

f:id:FY0323:20200708175326p:plain

画面上部の「Configuration Timeline」を選択すると、リソースのコンフィグの変更履歴を追跡することができます。

f:id:FY0323:20200709094555p:plain

「Configuration Timeline」にはActionTrailの操作履歴も表示されるため、リソースに対してどのような操作を行ったかが確認できます。

f:id:FY0323:20200708180414p:plain

「Compliance Timeline」を選択すると、コンプライアンスの履歴を確認できます。

f:id:FY0323:20200709094657p:plain

カスタムRuleの場合

次にカスタムRuleの場合を見てみます。ここではRuleのタイプにVisual Editorを選択し、特定のVPCにのみECSを配置することを許可するようなRuleを用意します。

カスタムRuleの動作確認のため、以下のようにあらかじめVPCとECSインスタンスを用意しておきます。

f:id:FY0323:20200709094829p:plainf:id:FY0323:20200709094836p:plain

作成の流れはManaged Ruleの場合と同じですが、今回はRuleを適用するリソースと監視項目について設定を行います。

あらかじめカスタムRule作成時の条件を記載しておきます。

  • 選択できるリソース種別は1つまで:一つのRuleにつき、1種類のリソース種別にしか適用することができません。
  • 監視項目はあらかじめ用意されたものの中から選択:ECSの場合は以下のようなカテゴリが存在し今回はVPC IDを指定します。それぞれの項目について値を設定し、各項目と値との間でどのような関係性を持たせるか(例:Equal to Not Equal toなど)を指定します。

    • Elastic IP Bandwidth Limit:Elastic IPの帯域幅を制限
    • VPC ID:所属するVPCを指定
    • Instance Operating System:ECSのOSを指定
    • Instance Family:ECSインスタンスタイプのファミリー(sn1 g5など)を指定

各カテゴリに対応する値は、Cloud Configが提供する各リソースのコンフィグの情報から判断することができます。Cloud Configでは各リソースの設定状況をJSONファイルで提供し、各監視項目の設定値も記載されています。

f:id:FY0323:20200708182052p:plain

f:id:FY0323:20200708182104p:plain

以下に、あるECSインスタンスのコンフィグ値を載せます(一部見やすくするために修正をしております)。

{
    "ResourceGroupId":""
    "Memory":4096
    "InstanceChargeType":"PostPaid"
    "Cpu":2
    "OSName":"CentOS 8.0 64位"
    "InstanceNetworkType":"vpc"
    "InnerIpAddress":{
        "IpAddress":[]
    },
    "ExpiredTime":"2099-12-31T15:59Z"
    "ImageId":"centos_8_0_x64_20G_alibase_20200218.vhd"
    "EipAddress":{
        "AllocationId":""
        "IpAddress":""
        "InternetChargeType":""
    },
    "HostName":"cloudconfig-test"
    "VlanId":""
    "Status":"Running"
    "MetadataOptions":{
        "HttpTokens":""
        "HttpEndpoint":""
    },
    "InstanceId":"i-6weci6f7i9xtf8r6ixuc"
    "StoppedMode":"Not-applicable"
    "CpuOptions":{
        "ThreadsPerCore":2
        "Numa":""
        "CoreCount":1
    },
    "StartTime":"2020-07-08T05:28Z"
    "DeletionProtection":false,
    "SecurityGroupIds":{
        "SecurityGroupId":[
            0:"sg-6wea298ason1gzj81z0n"
        ]
    },
    "VpcAttributes":{
        "PrivateIpAddress":{
            "IpAddress":[
                0:"192.168.0.13"
            ]
        }
     "VpcId":"vpc-6weclb1pxh4mjwww9vsj9"
        "VSwitchId":"vsw-6we1cy3rb74yq4bk4x072"
        "NatIpAddress":""
    },
    "InternetChargeType":"PayByTraffic"
    "InstanceName":"cloudconfig-test"
    "DeploymentSetId":""
    "InternetMaxBandwidthOut":5
    "SerialNumber":"4db766e7-518d-4ad2-95a4-893fbd2e3d76"
    "OSType":"linux"
    "CreationTime":"2020-07-08T05:28Z"
    "AutoReleaseTime":""
    "Description":""
    "InstanceTypeFamily":"ecs.sn1"
    "DedicatedInstanceAttribute":{
        "Tenancy":""
        "Affinity":""
    },
    "PublicIpAddress":{
        "IpAddress":[
            0:"<パブリックIPアドレス>"
        ]
    },
    "GPUSpec":""
    "NetworkInterfaces":{
        "NetworkInterface":[
            0:{
                "PrimaryIpAddress":"192.168.0.13",
                "NetworkInterfaceId":"eni-6wea298ason1gzje4czj",
                "MacAddress":"00:16:3e:00:52:b4"
            }
        ]
    },
    "SpotPriceLimit":0,
    "DeviceAvailable":true,
    "SaleCycle":"",
    "InstanceType":"ecs.sn1.medium",
    "OSNameEn":"CentOS 8.0 64 bit",
    "SpotStrategy":"NoSpot",
    "IoOptimized":true,
    "ZoneId":"ap-northeast-1a",
    "ClusterId":"",
    "EcsCapacityReservationAttr":{
        "CapacityReservationPreference":"",
        "CapacityReservationId":""
    },
    "DedicatedHostAttribute":{
        "DedicatedHostId":"",
        "DedicatedHostName":""
    },
    "GPUAmount":0,
    "OperationLocks":{
        "LockReason":[]
    },
    "InternetMaxBandwidthIn":500,
    "Recyclable":false,
    "RegionId":"ap-northeast-1",
    "CreditSpecification":""
}

それでは実際の作成を行います。まずはRuleのタイプを選択します。ここではVisual Editorを選択します。Rule Nameはcloudconfig-testとしておきます。

f:id:FY0323:20200709095250p:plain

今回は監視項目としてVPC ID、値にはvpc-6weclb1pxh4mjwww9vsj9を、そしてそれぞれの関係をEquals toに指定しました。ここで指定する関係を満たすリソース(ここでは特定のVPCに所属するリソース)は、Ruleの条件を満たしていると判断され、それ以外のリソースがコンプライアンス違反とみなされます。

f:id:FY0323:20200709095538p:plain

上記Ruleを設定後しばらくすると、以下のように新しいRuleに対して複数の違反リソースが確認できます。

f:id:FY0323:20200709095803p:plain f:id:FY0323:20200709095811p:plain

また唯一Ruleを満たしているリソースは、先ほど作成したECSインスタンスであることも確認できます。

f:id:FY0323:20200708184703p:plain

f:id:FY0323:20200709101835p:plain

OSSへの転送

続いて、Cloud Configの取得したコンフィグ情報をOSSへ転送する例について見ていきます。ここではあらかじめcloudconfig-testというバケットを用意しておきます。

f:id:FY0323:20200709100227p:plain

続いてCloud Config側で転送先のOSSを指定します。Cloud ConfigのSettingsを選択し、転送先OSSを指定すれば完了します。

f:id:FY0323:20200708185458p:plain

f:id:FY0323:20200709100421p:plain

ここで、先ほどのecs-disk-in-useに関連する操作として、新たにECSインスタンスにアタッチしないDiskを作成し、先ほど作成したcloudconfig-testDiskはECSインスタンスにアタッチします。

f:id:FY0323:20200709100551p:plain

設定変更からしばらくすると、OSSに以下のようなフォルダ・ファイルが作成されます。Cloud Configのフォルダ構成はACSLogs/<ID>/Config/<Region>/<year>/<month>/<day>/<ファイル名>となります。

たくさんのファイルが生成されていますが、ファイル名の命名規則は<AccountID>_Config_<Region>_ConfigSnapshot_<Resource Type>_<Creation Time>.jsonとなり、一つのJSONファイルに1つのリソース種別のログが記録されています。

保存されているファイルの一つをダウンロードすると、以下のようなファイル構造となっています。

{
    configurationItems: “<コンフィグの内容>”,
    fileVersion:1.0
}

configurationItemsの部分を取り出し、JSONファイルの内容を整形すると、以下のように出力されます。先ほどECSインスタンスにアタッチしたDisk、そして作成のみをしてアタッチしていないDiskの内容が確認できます。

[
    0:{
        accountId: <アカウントID>
        availabilityZone:ap-northeast-1a
        regionId:ap-northeast-1
        configuration:{"DetachedTime":"","Category":"cloud_ssd","Description":"","KMSKeyId":"","ResourceGroupId":"","Size":200,"Encrypted":false,"DeleteAutoSnapshot":true,"DiskChargeType":"PostPaid","ExpiredTime":"2999-09-08T16:00Z","ImageId":"","StorageSetId":"","Tags":{"Tag":[]},"Status":"In_use","AttachedTime":"2020-04-17T05:45:18Z","ZoneId":"ap-northeast-1a","InstanceId":"i-6we2zaulrw78pyc4br6o","SourceSnapshotId":"","ProductCode":"","Device":"/dev/xvdb","PerformanceLevel":"","DeleteWithInstance":true,"EnableAutomatedSnapshotPolicy":false,"EnableAutoSnapshot":true,"AutoSnapshotPolicyId":"","DiskName":"ecs-test-disk04","OperationLocks":{"OperationLock":[]},"BdfId":"","Portable":true,"Type":"data","MountInstances":{"MountInstance":[]},"CreationTime":"2020-04-17T05:44:20Z","RegionId":"ap-northeast-1","DiskId":"d-6we0jdafmobs3wz0zgik"}
        resourceCreateTime:1587102260000
        resourceId:d-6we0jdafmobs3wz0zgik
        resourceName:ecs-test-disk04
        resourceType:ACS::ECS::Disk
        tags:{}
    }
 
(中略)
 
    17:{
        accountId: <アカウントID>
        availabilityZone:ap-northeast-1a
        regionId:ap-northeast-1
        configuration:{"DetachedTime":"","Category":"cloud_ssd","Description":"","KMSKeyId":"","ResourceGroupId":"","Size":20,"Encrypted":false,"DeleteAutoSnapshot":true,"DiskChargeType":"PostPaid","ExpiredTime":"2999-09-08T16:00Z","ImageId":"","StorageSetId":"","Tags":{"Tag":[]},"Status":"In_use","AttachedTime":"2020-07-07T02:37:34Z","ZoneId":"ap-northeast-1a","InstanceId":"i-6weacanqbcyg25d7ea8q","SourceSnapshotId":"","ProductCode":"","Device":"/dev/xvdb","PerformanceLevel":"","DeleteWithInstance":false,"EnableAutomatedSnapshotPolicy":false,"EnableAutoSnapshot":true,"AutoSnapshotPolicyId":"","DiskName":"cloudconfig-test","OperationLocks":{"OperationLock":[]},"BdfId":"","Portable":true,"Type":"data","SerialNumber":"6weaimnfcuarwdqt7esy","MountInstances":{"MountInstance":[]},"CreationTime":"2020-07-07T02:18:20Z","RegionId":"ap-northeast-1","DiskId":"d-6weaimnfcuarwdqt7esy"}
        resourceCreateTime:1594088300000
        resourceId:d-6weaimnfcuarwdqt7esy
        resourceName:cloudconfig-testresourceType:ACS::ECS::Disk
        tags:{}
    }
 
(中略)
 
    19:{
        accountId: <アカウントID>
        availabilityZone:ap-northeast-1a
        regionId:ap-northeast-1
        configuration:{"DetachedTime":"","Category":"cloud_ssd","Description":"","KMSKeyId":"","ResourceGroupId":"","Size":20,"Encrypted":false,"DeleteAutoSnapshot":false,"DiskChargeType":"PostPaid","ExpiredTime":"2999-09-08T16:00Z","ImageId":"","StorageSetId":"","Tags":{"Tag":[]},"Status":"Available","AttachedTime":"","ZoneId":"ap-northeast-1a","SourceSnapshotId":"","ProductCode":"","InstanceId":"","Device":"","PerformanceLevel":"","DeleteWithInstance":false,"EnableAutomatedSnapshotPolicy":false,"EnableAutoSnapshot":true,"AutoSnapshotPolicyId":"","DiskName":"cloudconfig-test02","OperationLocks":{"OperationLock":[]},"BdfId":"","Portable":true,"Type":"data","SerialNumber":"6weci6f7i9xsuixpd6ft","MountInstances":{"MountInstance":[]},"CreationTime":"2020-07-07T02:36:25Z","RegionId":"ap-northeast-1","DiskId":"d-6weci6f7i9xsuixpd6ft"}
        resourceCreateTime:1594089385000
        resourceId:d-6weci6f7i9xsuixpd6ft
        resourceName:cloudconfig-test02resourceType:ACS::ECS::Disk
        tags:{}
    }

さらにcloudconfig-testconfiguration部分を取り出して整形をすると、リソースのConfigについてより詳細に内容がわかります。

{
    "DetachedTime": "",
    "Category": "cloud_ssd",
    "Description": "",
    "KMSKeyId": "",
    "ResourceGroupId": "",
    "Size": 20,
    "Encrypted": false,
    "DeleteAutoSnapshot": true,
    "DiskChargeType": "PostPaid",
    "ExpiredTime": "2999-09-08T16:00Z",
    "ImageId": "",
    "StorageSetId": "",
    "Tags": {
        "Tag": []
    },
    "Status": "In_use",
    "AttachedTime": "2020-07-07T02:37:34Z",
    "ZoneId": "ap-northeast-1a",
    "InstanceId": "i-6weacanqbcyg25d7ea8q",
    "SourceSnapshotId": "",
    "ProductCode": "",
    "Device": "/dev/xvdb",
    "PerformanceLevel": "",
    "DeleteWithInstance": false,
    "EnableAutomatedSnapshotPolicy": false,
    "EnableAutoSnapshot": true,
    "AutoSnapshotPolicyId": "",
    "DiskName": "cloudconfig-test",
    "OperationLocks": {
        "OperationLock": []
    },
    "BdfId": "",
    "Portable": true,
    "Type": "data",
    "SerialNumber": "6weaimnfcuarwdqt7esy",
    "MountInstances": {
        "MountInstance": []
    },
    "CreationTime": "2020-07-07T02:18:20Z",
    "RegionId": "ap-northeast-1",
    "DiskId": "d-6weaimnfcuarwdqt7esy"
}

※参考ドキュメント