CloudFormationにはStakSetsという、1つのCloudFormationテンプレートを、複数のアカウント、もしくはリージョンでスタックを作成することができる機能があります。
本記事では、そのStackSetsを使用して AWS Configを全リージョンに展開するハンズオンを公開します。
概要
本記事の目的
- CloudFormation StackSetsを使用して、AWS Configを複数(全)リージョンに展開する
参考文献
CloudFormation
テンプレート
- 実はサンプルテンプレートがAWS公式から配布されてたりします。
下記テンプレートをそれを基に修正したものになります。 - 下記テンプレートは誰でも汎用的に使用できるようにしています。
ご自身の環境に合わせ、各パラメーターを修正して下さい。- 修正箇所
- AWS Config
- AllSupported
サポートされているすべてのリソース タイプを記録するかどうかを設定します。 - IncludeGlobalResourceTypes
AWS Config がサポートされているすべてのグローバル リソース タイプを記録するかどうかを設定します。 - ResourceTypes
このグループに含めるAWSリソースのリストを設定します。
※ AllSupported がFalseの場合に定義されます - DeliveryChannelName
配信チャンネルの名前を設定します。 - Frequency
スナップショットを配信する頻度を設定します。
- AllSupported
- Amazon SNS
- TopicArn
SNSトピック名を設定します - NotificationEmail
SNSで通知するメールアドレスを設定します。
- TopicArn
- AWS Config
- 修正箇所
- 下記テンプレートのcondition(条件分岐)がどのような仕組みになっているのかを説明します。
- IsAllSupported
- AllSupportedがFalseの場合、任意に指定されたAWSリソースのみを記録します。
- IsAllSupported
AWSTemplateFormatVersion: 2010-09-09
Description: Enable AWS Config
# ------------------------------------------------------------
# Input Metadata
# ------------------------------------------------------------
Metadata:
AWS::CloudFormation::Interface:
ParameterGroups:
- Label:
default: Recorder Configuration
Parameters:
- AllSupported
- IncludeGlobalResourceTypes
- ResourceTypes
- Label:
default: Delivery Channel Configuration
Parameters:
- DeliveryChannelName
- Frequency
- Label:
default: Delivery Notifications
Parameters:
- TopicArn
- NotificationEmail
ParameterLabels:
AllSupported:
default: Support all resource types
IncludeGlobalResourceTypes:
default: Include global resource types
ResourceTypes:
default: List of resource types if not all supported
DeliveryChannelName:
default: Configuration delivery channel name
Frequency:
default: Snapshot delivery frequency
TopicArn:
default: SNS topic name
NotificationEmail:
default: Notification Email (optional)
# ------------------------------------------------------------
# Input Parameters
# ------------------------------------------------------------
Parameters:
AllSupported:
Type: String
Default: True
Description: Indicates whether to record all supported resource types.
AllowedValues:
- True
- False
IncludeGlobalResourceTypes:
Type: String
Default: False
Description: Indicates whether AWS Config records all supported global resource types.
AllowedValues:
- True
- False
ResourceTypes:
Type: List<String>
Description: A list of valid AWS resource types to include in this recording group, such as AWS::EC2::Instance or AWS::CloudTrail::Trail.
Default: AWS::EC2::Instance, AWS::CloudTrail::Trail
DeliveryChannelName:
Type: String
Default: <Generated>
Description: The name of the delivery channel.
Frequency:
Type: String
Default: 24hours
Description: The frequency with which AWS Config delivers configuration snapshots.
AllowedValues:
- 1hour
- 3hours
- 6hours
- 12hours
- 24hours
TopicArn:
Type: String
Default: <New Topic Name>
Description: The Amazon Resource Name (ARN) of the Amazon Simple Notification Service (Amazon SNS) topic that AWS Config delivers notifications to.
NotificationEmail:
Type: String
Default: <None>
Description: Email address for AWS Config notifications (for new topics).
# ------------------------------------------------------------
# Input Conditions
# ------------------------------------------------------------
Conditions:
IsAllSupported: !Equals
- !Ref AllSupported
- True
### Resources ###
Resources:
# ------------------------------------------------------------
# Amazon S3
# ------------------------------------------------------------
# S3 Bucket To AWS Config
ConfigBucket:
DeletionPolicy: Retain
Type: AWS::S3::Bucket
Properties:
BucketEncryption:
ServerSideEncryptionConfiguration:
- ServerSideEncryptionByDefault:
SSEAlgorithm: AES256
# S3 Bucket Policy
ConfigBucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref ConfigBucket
PolicyDocument:
Version: 2012-10-17
Statement:
- Sid: AWSConfigBucketPermissionsCheck
Effect: Allow
Principal:
Service:
- config.amazonaws.com
Action: s3:GetBucketAcl
Resource:
- !Sub "arn:${AWS::Partition}:s3:::${ConfigBucket}"
- Sid: AWSConfigBucketDelivery
Effect: Allow
Principal:
Service:
- config.amazonaws.com
Action: s3:PutObject
Resource:
- !Sub "arn:${AWS::Partition}:s3:::${ConfigBucket}/AWSLogs/${AWS::AccountId}/*"
- Sid: AWSConfigBucketSecureTransport
Action:
- s3:*
Effect: Deny
Resource:
- !Sub "arn:${AWS::Partition}:s3:::${ConfigBucket}"
- !Sub "arn:${AWS::Partition}:s3:::${ConfigBucket}/*"
Principal: "*"
Condition:
Bool:
aws:SecureTransport:
false
# ------------------------------------------------------------
# Amazon SNS
# ------------------------------------------------------------
# SNS Topic
ConfigTopic:
Type: AWS::SNS::Topic
Properties:
TopicName: !Sub "config-topic-${AWS::AccountId}"
DisplayName: AWS Config Notification Topic
KmsMasterKeyId: "alias/aws/sns"
# SNS Topic Policy
ConfigTopicPolicy:
Type: AWS::SNS::TopicPolicy
Properties:
Topics:
- !Ref ConfigTopic
PolicyDocument:
Statement:
- Sid: AWSConfigSNSPolicy
Action:
- sns:Publish
Effect: Allow
Resource: !Ref ConfigTopic
Principal:
Service:
- config.amazonaws.com
# EMail Address
EmailNotification:
Type: AWS::SNS::Subscription
Properties:
Endpoint: !Ref NotificationEmail
Protocol: email
TopicArn: !Ref ConfigTopic
# ------------------------------------------------------------
# AWS Config
# ------------------------------------------------------------
# IMA Role To AWS Config
ConfigRecorderRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service:
- config.amazonaws.com
Action:
- sts:AssumeRole
Path: /
ManagedPolicyArns:
- !Sub "arn:${AWS::Partition}:iam::aws:policy/service-role/AWS_ConfigRole"
# Config Recorder
ConfigRecorder:
Type: AWS::Config::ConfigurationRecorder
DependsOn:
- ConfigBucketPolicy
Properties:
RoleARN: !GetAtt ConfigRecorderRole.Arn
RecordingGroup:
AllSupported: !Ref AllSupported
IncludeGlobalResourceTypes: !Ref IncludeGlobalResourceTypes
ResourceTypes: !If
- IsAllSupported
- !Ref AWS::NoValue
- !Ref ResourceTypes
# Config Delivery Channel
ConfigDeliveryChannel:
Type: AWS::Config::DeliveryChannel
DependsOn:
- ConfigBucketPolicy
Properties:
Name: !If
- IsGeneratedDeliveryChannelName
- !Ref AWS::NoValue
- !Ref DeliveryChannelName
ConfigSnapshotDeliveryProperties:
DeliveryFrequency: !FindInMap
- Settings
- FrequencyMap
- !Ref Frequency
S3BucketName: !Ref ConfigBucket
SnsTopicARN: !If
- CreateTopic
- !Ref ConfigTopic
- !Ref TopicArn
デプロイするリソース一覧
- Amazon S3バケット
- S3バケット用ポリシー
- Amazon SNS トピック
- Amazon SNS トピック用ポリシー
- Amazon SNS トピック EMailAddress
- AWS Config 用IAM Role
- AWS Config 設定レコーダー
- AWS Config 配信チャンネル
やり方
- AWS CloudFormation コンソールへ遷移します。
- 左ペイン「StackSets」→「StackSetsの作成」をクリックします。
- 各項目に従い、パラメーターを入力し、StackSetsを実行します。
- StackSetsの実行には、以下のIAMロールが必要となります。
※リンク先にCFnテンプレートが記載されています、 - 非有効化リージョンを選択するとエラーになります。
- organizationが未導入だとマネコン上部に赤いエラー文が出力されますが、StackSets自体は問題なく利用できます。
- StackSetsの実行には、以下のIAMロールが必要となります。
- 指定のリージョンにconfigが展開されたことを確認します。
まとめ
AWSのセキュリティガイドラインでも、未利用のリージョンであってもconfigは有効化しておく必要があると記載されています。
個人的には、Configの全リージョン展開はAWSアカウント発行後の、ToDoリストとして、加えておくべきだと思います。
コメント