AWS
CloudFormation
VPCFlowLogs

CloudFormationを使ってVPCフローログを設定する


はじめに

本記事では、AWS CloudFormation管理コンソールを使って、VPCフローログを設定する手順を説明しています。(初心者向け)

本記事で掲載しているテンプレートの最新版は、下記に置いてます。

https://github.com/okubo-t/aws-cloudformation

出力先をS3に設定する手順は、下記を参照して下さい。

CloudFormationを使ってVPCフローログを設定し出力先をS3に設定する

[https://qiita.com/okubot55/items/fbb1ae40bd8104958102]


構成図


前提条件

下記の記事の構築手順で、VPCを構築していること。

CloudFormationを使ってVPCを構築する

PJPrefixの値は、同一にすること。

VPCフローログのS3バケットへの出力は、CloudFormationが対応していないため、出力先には、CloudWatchLogsしか設定できません。(2018.08.24時点)

出力先をS3に設定する手順は、下記を参照して下さい。

CloudFormationを使ってVPCフローログを設定し出力先をS3に設定する

[https://qiita.com/okubot55/items/fbb1ae40bd8104958102]


構築手順

1 AWS CloudFormation管理コンソールから、スタックの作成をクリックします。

2 後述のテンプレートを選択します。

3 各パラメータを入力します。

パラメータ名
用途
備考

スタックの名前
テンプレートから作成するリソース一式の名前
例 prd-stack-vpc-20180801

PJPrefix
構築するプロジェクトの環境を識別するために各コンポーネントの先頭に付与する識別子
例 qiita-prd

Filter
フローログのトラフィックタイプ
許可されたログのみ出力する場合は、ACCEPT
拒否されたログのみ出力する場合は、REJECT
全てのログを出力する場合は、ALL

ALLデフォルト)

RetentionInDays
フローログの保持日数
下記の日数から選択できます。
1日、3日、5日、7日、14日、30日、60日、90日、120日、150日、180日、365日、400日、545日、731日、1827日、3653日
30日(デフォルト)

4 後続は、デフォルトのまま次へ次へで、作成します。

作成する前に、下記のチェックをつけること

AWS CloudFormation によってカスタム名のついた IAM リソースが作成される場合があることを承認します。

5 状況が CREATE COMPLETEになれば、VPCフローログの設定が完了です。


テンプレート


vpcflowlogs.yml

AWSTemplateFormatVersion: "2010-09-09"

Description:
VPCFlowLogs Settings

Metadata:
"AWS::CloudFormation::Interface":
ParameterGroups:
- Label:
default: "Project Name Prefix"
Parameters:
- PJPrefix
- Label:
default: "VPCFlowLogs Configuration (Destination Type is CloudWatchLogs)"
Parameters:
- Filter
- RetentionInDays

# ------------------------------------------------------------#
# Input Parameters
# ------------------------------------------------------------#
Parameters:
PJPrefix:
Type: String

Filter:
Type: String
Default: ALL
AllowedValues: [ ALL, ACCEPT, REJECT ]

RetentionInDays:
AllowedValues: [ 1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, 3653 ]
Type: Number
Default: 30

Resources:
# ------------------------------------------------------------#
# IAM Role for VPCFlowLogs
# ------------------------------------------------------------#
VPCFlowLogsIAMRole:
Type: "AWS::IAM::Role"
Properties:
RoleName: !Sub "${PJPrefix}-vpcflowlogs-role"
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service:
- "vpc-flow-logs.amazonaws.com"
Action:
- "sts:AssumeRole"

Policies:
- PolicyName: !Sub "${PJPrefix}-vpcflowlogs-policy"
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- "logs:CreateLogGroup"
- "logs:CreateLogStream"
- "logs:PutLogEvents"
- "logs:DescribeLogGroups"
- "logs:DescribeLogStreams"
Resource: "*"

# ------------------------------------------------------------#
# LogGroup
# ------------------------------------------------------------#
LogGroup:
Type: "AWS::Logs::LogGroup"
Properties:
LogGroupName: !Sub "${PJPrefix}-vpcflowlogs-group"
RetentionInDays: !Ref RetentionInDays

# ------------------------------------------------------------#
# VPCFlowLogs
# ------------------------------------------------------------#
VPCFlowLogs:
Type: "AWS::EC2::FlowLog"
Properties:
DeliverLogsPermissionArn: !GetAtt VPCFlowLogsIAMRole.Arn
LogGroupName: !Ref LogGroup
ResourceId: { "Fn::ImportValue": !Sub "${PJPrefix}-vpc" }
ResourceType: "VPC"
TrafficType: !Ref Filter

# ------------------------------------------------------------#
# Output Parameters
# ------------------------------------------------------------#
Outputs:
#LogGroup
LogGroupName:
Value: !Sub "${PJPrefix}-vpcflowlogs-group"
Export:
Name: !Sub "${PJPrefix}-vpcflowlogs-group-name"
LogGroupARN:
Value: !GetAtt LogGroup.Arn
Export:
Name: !Sub "${PJPrefix}-vpcflowlogs-group-arn"