- 公開日
- 最終更新日
AWS Configを使ったVPC Flow Logsの自動設定
この記事を共有する
目次
皆さんこんにちは!
サービスGの山内です!
今回は、AWS Configを使ったVPC Flow Logsの自動修復について紹介したいと思います。
作成するAWS Configルールについて
VPC Flow Logsが設定されていないVPCを検出し、「修復」をクリックすることで自動的にVPC Flow Logsの設定を行います。

実際にVPC Flow Logsを設定しているのは AWS Systems Manager ドキュメントです。
AWS Configルールの修復アクションにて、AWS Systems Manager ドキュメントを指定しています。

AWS Configルールの構成とスタックの作成
AWS CloudFormationにて、以下のYAMLテンプレートのスタックを作成し、AWS Config ルールを作成します。
スタックを作成することで、以下のリソースを作成しています。
- AWS Configルール
- AWS Systems Manager ドキュメント実行ロール
- AWS Systems Manager ドキュメント
- AWS Configルールの自動修復設定
また、VPC Flow Logs保管用バケットは作成済みとします。
ここを押すと展開します
AWSTemplateFormatVersion: "2010-09-09"
Description: Setup AWS Config with auto-remediation to enable VPC Flow Logs
#---------------------
# Parameters
#---------------------
Parameters:
VPCFlowlogBucketArn:
Type: String
Resources:
#------------------------
# Create RunBook Role
#------------------------
AutomationAssumeRole:
Type: AWS::IAM::Role
Properties:
RoleName: Check-VPC-Flowlog-role
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action: sts:AssumeRole
Principal:
Service:
- ssm.amazonaws.com
Policies:
- PolicyName: CreateVPCFlowLogs
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- ec2:CreateFlowLogs
- ec2:Describe*
- ecs:List*
- ecs:Describe*
- logs:CreateLogDelivery
- logs:GetLogDelivery
- logs:UpdateLogDelivery
- logs:DeleteLogDelivery
- logs:ListLogDeliveries
Resource:
- "*"
- Effect: Allow
Action:
- s3:PutObject
- s3:GetBucketLocation
Resource:
- !Sub "${VPCFlowlogBucketArn}/*"
- Effect: Allow
Action:
- s3:GetBucketLocation
Resource:
- !Sub "${VPCFlowlogBucketArn}"
#----------------------------------------------------
# Create Runbooks
#----------------------------------------------------
SSMDocument:
Type: AWS::SSM::Document
Properties:
Name: Check-VPC-Flowlog-SSMDocument
DocumentFormat: YAML
DocumentType: Automation
UpdateMethod: NewVersion
Content:
schemaVersion: "0.3"
description: Create VPC Flow Logs
assumeRole: !GetAtt AutomationAssumeRole.Arn
parameters:
AutomationAssumeRole:
type: String
description: (Optional) The ARN of the role that allows Automation to perform the actions on your behalf.
default: !GetAtt AutomationAssumeRole.Arn
ResourceIds:
type: StringList
description: (Required) The IDs of the resources for which to create the flow log.
allowedPattern: (vpc|eni|subnet|tgw|tgw-attach)-[0-9a-f]{8,17}
TrafficType:
type: String
description: (Optional) The type of traffic to log.
default: ALL
allowedValues:
- ACCEPT
- REJECT
- ALL
LogDestinationType:
type: String
description: (Optional) The destination type to publish flow log data to.
default: s3
allowedValues:
- cloud-watch-logs
- s3
LogDestinationARN:
type: String
description: (Required) The ARN of the S3 bucket or CloudWatch Logs log group.
mainSteps:
- description: Create VPC Flow Logs
name: CreateFlowLogs
action: aws:executeAwsApi
isEnd: true
inputs:
Service: ec2
Api: CreateFlowLogs
ResourceIds: "{{ ResourceIds }}"
ResourceType: VPC
TrafficType: "{{ TrafficType }}"
LogDestinationType: "{{ LogDestinationType }}"
LogDestination: "{{ LogDestinationARN }}"
LogFormat: "${version} ${account-id} ${interface-id} ${srcaddr} ${dstaddr} ${srcport} ${dstport} ${protocol} ${packets} ${bytes} ${start} ${end} ${action} ${log-status} ${vpc-id} ${subnet-id} ${instance-id} ${tcp-flags} ${type} ${pkt-srcaddr} ${pkt-dstaddr} ${region} ${az-id} ${sublocation-type} ${sublocation-id} ${pkt-src-aws-service} ${pkt-dst-aws-service} ${flow-direction} ${traffic-path} ${ecs-cluster-arn} ${ecs-cluster-name} ${ecs-container-instance-arn} ${ecs-container-instance-id} ${ecs-container-id} ${ecs-second-container-id} ${ecs-service-name} ${ecs-task-definition-arn} ${ecs-task-arn} ${ecs-task-id} ${reject-reason}"
DestinationOptions:
PerHourPartition: True
#----------------------
# Create Config Rule
#----------------------
ConfigRule:
Type: AWS::Config::ConfigRule
Properties:
ConfigRuleName: Check-VPC-Flowlog
Description: "Check that VPC Flow Logs are enabled for all VPCs"
Source:
Owner: AWS
SourceIdentifier: VPC_FLOW_LOGS_ENABLED
#--------------------------------
# Create RemediationConfiguration
#--------------------------------
RemediationConfiguration:
Type: AWS::Config::RemediationConfiguration
Properties:
Automatic: true
MaximumAutomaticAttempts: 10
RetryAttemptSeconds: 300
ConfigRuleName: !Ref ConfigRule
TargetType: SSM_DOCUMENT
TargetId: !Ref SSMDocument
ResourceType: AWS::EC2::VPC
Parameters:
TrafficType:
StaticValue:
Values:
- "ALL"
LogDestinationType:
StaticValue:
Values:
- "s3"
LogDestinationARN:
StaticValue:
Values:
- !Ref VPCFlowlogBucketArn
ResourceIds:
ResourceValue:
Value: RESOURCE_ID
AutomationAssumeRole:
StaticValue:
Values:
- !GetAtt AutomationAssumeRole.Arn
また、今回設定するVPC Flow Logsのログフォーマットは以下です。
ECSのトラフィックログも取得できるように設定しています。
ここを押すと展開します
${version} ${account-id} ${interface-id} ${srcaddr} ${dstaddr} ${srcport} ${dstport} ${protocol} ${packets} ${bytes} ${start} ${end} ${action} ${log-status} ${vpc-id} ${subnet-id} ${instance-id} ${tcp-flags} ${type} ${pkt-srcaddr} ${pkt-dstaddr} ${region} ${az-id} ${sublocation-type} ${sublocation-id} ${pkt-src-aws-service} ${pkt-dst-aws-service} ${flow-direction} ${traffic-path} ${ecs-cluster-arn} ${ecs-cluster-name} ${ecs-container-instance-arn} ${ecs-container-instance-id} ${ecs-container-id} ${ecs-second-container-id} ${ecs-service-name} ${ecs-task-definition-arn} ${ecs-task-arn} ${ecs-task-id} ${reject-reason}
VPC Flow Logs保管用バケットのリソースポリシー
VPC Flow Logsの保管用バケットに、以下のようなバケットポリシーを設定し、VPC Flow Logsが保管できるようにします。
アカウントIDとなる部分は「xxxxxxxxxxxx」としています。
ここを押すと展開します
{
"Version": "2012-10-17",
"Id": "AWSLogDeliveryWrite20150319",
"Statement": [
{
"Sid": "AWSLogDeliveryWrite1",
"Effect": "Allow",
"Principal": {
"Service": "delivery.logs.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::my-aws-vpc-flow-logs-20260321/AWSLogs/xxxxxxxxxxxx/*",
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control",
"aws:SourceAccount": "xxxxxxxxxxxx"
},
"ArnLike": {
"aws:SourceArn": "arn:aws:logs:ap-northeast-1:xxxxxxxxxxxx:*"
}
}
},
{
"Sid": "AWSLogDeliveryAclCheck1",
"Effect": "Allow",
"Principal": {
"Service": "delivery.logs.amazonaws.com"
},
"Action": "s3:GetBucketAcl",
"Resource": "arn:aws:s3:::my-aws-vpc-flow-logs-20260321",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "xxxxxxxxxxxx"
},
"ArnLike": {
"aws:SourceArn": "arn:aws:logs:ap-northeast-1:xxxxxxxxxxxx:*"
}
}
}
]
}
また、
上記のバケットポリシーは、手動でVPC Flow LogsをVPC Flow Logs保管バケットに対して設定することで自動的に設定されます。
バケットポリシーの設定が面倒な方は、手動でVPC Flow Logsを作成することをお勧めします。
AWS CloudFormationスタックの作成
変更を行う部分だけ解説します。
AWS CloudFormationのマネジメントコンソールから「スタックの作成」をクリックします。

「テンプレートの指定」にて、「テンプレートファイルをアップロード」を選択し、上記のYAMLテンプレートファイルをアップロードします。

スタック名を記載し、以下のパラメーターも記載します。
- VPCFlowlogBucketArn:VPC Flow Logsを保管するS3バケットのARN
記載完了後、「次へ」をクリックします。

「AWS CloudFormation によって IAM リソースがカスタム名で作成される場合があることを承認します。」にチェックを入れ、「次へ」をクリックします。

次の画面で、作成するスタックの設定を確認し、問題なければ「送信」をクリックしスタックを作成します。

無事に作成できました。

動作確認
以下のようにVPC Flow Logsが設定されていないVPCを作成し、
AWS Configを使って自動的にVPC Flow Logsが設定できることを確認します。

この状態で作成したAWS Configルールを確認すると、非準拠として検知ができています。

ルールをクリックし、「対象範囲のリソース」にて、検知しているVPCを選択し「修復」をクリックします。

「アクションが正常に実行されました」という表示になれば、VPC Flow Logsの作成は完了しています。

「アクション」から「再評価」をクリックし、AWS Configルールが準拠状態になることを確認します。

再評価が完了すると、先ほどまで非準拠だったVPCが準拠となっていました。

最後にVPC Flow Logsが作成できているかを確認します。
問題なく作成できていました。

まとめ
今回は、AWS Configを使ったVPC Flow Logsの設定について紹介しました。
VPCの数が多く、効率よくVPC Flow Logsを設定したい場合に有効だと思います。
この記事は私が書きました
山内 宏紀
記事一覧CloudFormationが好きです。 使っているギターはSGです。