【未経験向け】CCNA(200-301)とは? NW未経験が1ヶ月で合格した際に使用した魔法の学習教材、サイトを紹介!!!

【AWS】CloudFormation Stack SetsでAWS Configを全リージョンに展開する

AWS

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
          スナップショットを配信する頻度を設定します。
      • Amazon SNS
        • TopicArn
          SNSトピック名を設定します
        • NotificationEmail
          SNSで通知するメールアドレスを設定します。
  • 下記テンプレートのcondition(条件分岐)がどのような仕組みになっているのかを説明します。
    • IsAllSupported
      • AllSupportedがFalseの場合、任意に指定されたAWSリソースのみを記録します。
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 配信チャンネル

やり方

  1. AWS CloudFormation コンソールへ遷移します。
  2. 左ペイン「StackSets」→「StackSetsの作成」をクリックします。
  3. 各項目に従い、パラメーターを入力し、StackSetsを実行します。
    • StackSetsの実行には、以下のIAMロールが必要となります。
      ※リンク先にCFnテンプレートが記載されています、
    • 非有効化リージョンを選択するとエラーになります。
    • organizationが未導入だとマネコン上部に赤いエラー文が出力されますが、StackSets自体は問題なく利用できます。
  4. 指定のリージョンにconfigが展開されたことを確認します。

まとめ

AWSのセキュリティガイドラインでも、未利用のリージョンであってもconfigは有効化しておく必要があると記載されています。

個人的には、Configの全リージョン展開はAWSアカウント発行後の、ToDoリストとして、加えておくべきだと思います。

コメント

タイトルとURLをコピーしました