CloudFormationでVPCフローログを設定する (CloudWatch版)

VPCフローログをCloudFormationで設定する機会がありましたので、紹介させていただきます。S3とCloudWatch Logsへ保存できますが、今回はCloudWatch Logsへ保存したいと思います。

IAM Role

  • CloudWatch Logsへログを保存するための必要最小限の権限で作成しています。
  #--------------------------------------------------------------------
  VpcFlowLogsIamRole:
  #--------------------------------------------------------------------
    Type: "AWS::IAM::Role"
    Properties:
      RoleName: !Sub ${SystemName}-${Env}-flowlogs-role
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - "vpc-flow-logs.amazonaws.com"
            Action:
              - "sts:AssumeRole"
      Policies:
        - PolicyName: !Sub ${SystemName}-${Env}-flowlogs-policy
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action:
                  - "logs:CreateLogGroup"
                  - "logs:CreateLogStream"
                  - "logs:PutLogEvents"
                  - "logs:DescribeLogGroups"
                  - "logs:DescribeLogStreams"
                Resource: "*"

LogGroup

  • フローログを保存するロググループを作成します。
  • 一定期間後に削除するようにRetentionInDaysを指定しています。
  #--------------------------------------------------------------------
  VpcFlowLogsLogGroup:
  #--------------------------------------------------------------------
    Type: "AWS::Logs::LogGroup"
    Properties:
      LogGroupName: !Sub ${SystemName}-${Env}-vpc-flowlogs
      RetentionInDays: !Ref RetentionInDays

FlowLog

  • VPCフローログを作成します。
  • VPCは別スタックで作成している想定です。環境に合わせて変更してください。
  #--------------------------------------------------------------------
  VpcFlowLogs:
  #--------------------------------------------------------------------
    Type: "AWS::EC2::FlowLog"
    Properties:
      ResourceType: "VPC"
      ResourceId:
        Fn::ImportValue: !Sub ${SystemName}-${Env}-vpc
      TrafficType: !Ref TrafficType
      DeliverLogsPermissionArn: !GetAtt VpcFlowLogsIamRole.Arn
      LogGroupName: !Ref VpcFlowLogsLogGroup

テンプレート全体

パラメータ、リソース名などはお好みで変更してください。

---
AWSTemplateFormatVersion: '2010-09-09'
Description: VPC Flow Logs

#--------------------------------------------------------------------
Parameters:
#--------------------------------------------------------------------
  SystemName:
    Description: This value is used as the resource prefix.
    Type: String
    Default: example
    MinLength: 1
  Env:
    Description: Environment Name
    Type: String
    Default: dev
    AllowedValues: [ dev ]
  TrafficType:
    Description: The type of traffic to log.
    Type: String
    Default: ALL
    AllowedValues: [ ACCEPT, REJECT, ALL ]
  RetentionInDays:
    Description: The number of days to retain the log events in the specified log group.
    Type: Number
    Default: 30
    AllowedValues: [ 1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, 3653 ]

#--------------------------------------------------------------------
Resources:
#--------------------------------------------------------------------

  #--------------------------------------------------------------------
  VpcFlowLogs:
  #--------------------------------------------------------------------
    Type: "AWS::EC2::FlowLog"
    Properties:
      ResourceType: "VPC"
      ResourceId:
        Fn::ImportValue: !Sub ${SystemName}-${Env}-vpc
      TrafficType: !Ref TrafficType
      DeliverLogsPermissionArn: !GetAtt VpcFlowLogsIamRole.Arn
      LogGroupName: !Ref VpcFlowLogsLogGroup

  #--------------------------------------------------------------------
  VpcFlowLogsLogGroup:
  #--------------------------------------------------------------------
    Type: "AWS::Logs::LogGroup"
    Properties:
      LogGroupName: !Sub ${SystemName}-${Env}-vpc-flowlogs
      RetentionInDays: !Ref RetentionInDays

  #--------------------------------------------------------------------
  VpcFlowLogsIamRole:
  #--------------------------------------------------------------------
    Type: "AWS::IAM::Role"
    Properties:
      RoleName: !Sub ${SystemName}-${Env}-flowlogs-role
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - "vpc-flow-logs.amazonaws.com"
            Action:
              - "sts:AssumeRole"
      Policies:
        - PolicyName: !Sub ${SystemName}-${Env}-flowlogs-policy
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action:
                  - "logs:CreateLogGroup"
                  - "logs:CreateLogStream"
                  - "logs:PutLogEvents"
                  - "logs:DescribeLogGroups"
                  - "logs:DescribeLogStreams"
                Resource: "*"

終わりに

普段はあまり参照することのないフローログですが、通信できないなどの障害があった場合には、調査で見ることも多いかと思います。このテンプレートがお役に立てば幸いです。