はじめに
こんにちは、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」のページに移動し、必要に応じてサービスの有効化を行います。
※公式ドキュメントより
有効化が完了すると、Cloud Configの概要画面が表示されます。
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」を選択します。
Ruleの作成画面に移動したら、まずは利用するRuleのタイプを選択します。今回は「Managed Rule」を選択します。
「Rule ARN」でecs-disk-in-use
を検索し、選択します。Managed Ruleの場合、利用するRuleを選択した時点でRule名が入力されるので、これをそのまま利用します。「Risk Level」はそのままの設定とします。
次にRuleを適用する対象のリソースと、Ruleに設定されているパラメータを設定します。
Managed Ruleでは、対象リソース・パラメータともに既に設定されていることが多く、今回も特に設定する箇所はありません。
次に、Ruleを違反したリソースに対する修正について設定します。ここでも3つの選択がありますが、ecs-disk-in-use
の場合コンフィグの自動修正は実行できないため、Disable Correction
を選択します。「Submit」を選択すれば、設定は完了です。
これでRuleの設定が完了しました。
しばらくすると設定したRuleが起動し、リソースに対するコンプライアンスチェックを行います。この時点ではRuleに違反したリソースが存在しないため、「Non-Compliance」がゼロにカウントされます。
ここでECSインスタンスにアタッチされていないDiskを用意します。
Diskを作成してしばらくすると、先ほどはゼロにカウントされていた「Non-Compliance」が変化しています。
「Non-compliant Resources」を選択すると、コンプライアンスに違反したリソースも確認することができます。
対象のリソースを選択することで、リソースの詳細(コンフィグ情報やコンプライアンス違反をしたRuleなど)を確認することができます。
画面上部の「Configuration Timeline」を選択すると、リソースのコンフィグの変更履歴を追跡することができます。
「Configuration Timeline」にはActionTrailの操作履歴も表示されるため、リソースに対してどのような操作を行ったかが確認できます。
「Compliance Timeline」を選択すると、コンプライアンスの履歴を確認できます。
カスタムRuleの場合
次にカスタムRuleの場合を見てみます。ここではRuleのタイプにVisual Editor
を選択し、特定のVPCにのみECSを配置することを許可するようなRuleを用意します。
カスタムRuleの動作確認のため、以下のようにあらかじめVPCとECSインスタンスを用意しておきます。
作成の流れは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ファイルで提供し、各監視項目の設定値も記載されています。
以下に、ある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
としておきます。
今回は監視項目としてVPC ID
、値にはvpc-6weclb1pxh4mjwww9vsj9
を、そしてそれぞれの関係をEquals to
に指定しました。ここで指定する関係を満たすリソース(ここでは特定のVPCに所属するリソース)は、Ruleの条件を満たしていると判断され、それ以外のリソースがコンプライアンス違反とみなされます。
上記Ruleを設定後しばらくすると、以下のように新しいRuleに対して複数の違反リソースが確認できます。
また唯一Ruleを満たしているリソースは、先ほど作成したECSインスタンスであることも確認できます。
OSSへの転送
続いて、Cloud Configの取得したコンフィグ情報をOSSへ転送する例について見ていきます。ここではあらかじめcloudconfig-test
というバケットを用意しておきます。
続いてCloud Config側で転送先のOSSを指定します。Cloud ConfigのSettings
を選択し、転送先OSSを指定すれば完了します。
ここで、先ほどのecs-disk-in-use
に関連する操作として、新たにECSインスタンスにアタッチしないDiskを作成し、先ほど作成したcloudconfig-test
DiskはECSインスタンスにアタッチします。
設定変更からしばらくすると、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-test★ resourceType: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-test02★ resourceType:ACS::ECS::Disk tags:{} }
さらにcloudconfig-test
のconfiguration
部分を取り出して整形をすると、リソースの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" }
※参考ドキュメント