どうも、AWS勉強中のとがみんです。
この記事ではCloudFromationを使って、VPCとサブネット、インターネットゲートウェイ、ルートテーブルを作成し、作成したネットワークにEC2インスタンスを配置しSSH接続をして、その通信情報をVPCフローログにより確認します。
Contents
今回作成するもの
下記の図のネットワークを構成します。VPCにサブネットを一つ作成し、インターネットとの通信を可能にするためにインターネットゲートウェイを作成します。
また、インターネットゲートウェイから、サブネットへのルートを設定したルートテーブルを作成します。
作成したサブネットにEC2インスタンスを配置し、SSH接続を行い、VPCフローログを活用し、IPトラフィックのログを確認します。
作業手順概要
- serverless.ymlに各種リソースを作成しデプロイ
- EC2インスタンスを作成しSSH接続の実施
- VPCのFlowLogをCLoudWatchで確認
作業詳細
serverless.ymlに各種リソースを作成しデプロイ
作成したserverless.ymlのファイルは以下のGithubに上げています。
sls deployのコマンドを実行することで、各種リソースが作成されます。
それぞれのコードの詳細について簡単に整理していきます。
ネットワークの構築
VPC
1 2 3 4 5 6 7 8 9 10 | # ------------------------------------------------------------# # VPC # ------------------------------------------------------------# VPC: Type: "AWS::EC2::VPC" Properties: CidrBlock: "10.1.0.0/16" Tags: - Key: Name Value: !Sub ${self:provider.stage}-vpc |
VPCはAWSアカウント内に構築できる仮想ネットワークで、論理的に分離されたネットワークを構築することができます。Cidrは10.0.0.0/16に設定しているので、65,536個のIPアドレスがVPC内で使用できます。
Amazon Virtual Private Cloud (Amazon VPC)
AWS::EC2::VPC
InternetGateway
1 2 3 4 5 6 7 8 9 | # ------------------------------------------------------------# # InternetGateway # ------------------------------------------------------------# InternetGateway: Type: AWS::EC2::InternetGateway Properties: Tags: - Key: Name Value: !Sub ${self:provider.stage}-vpc-intenetgateway |
インターネットゲートウェイは、VPCとインターネットの通信を可能にするためのものです。
今回はローカルのPCからEC2に接続できるようにするため、インターネットゲートウェイを作成します。
Connect to the internet using an internet gateway
AWS::EC2::InternetGateway
InternetGatewayAttachment
1 2 3 4 5 6 7 8 | # ------------------------------------------------------------# # InternetGatewayAttachment # ------------------------------------------------------------# InternetGatewayAttachment: Type: AWS::EC2::VPCGatewayAttachment Properties: InternetGatewayId: !Ref InternetGateway VpcId: !Ref VPC |
インターネットとVPCの接続を可能にするために、インターネットゲートウェイとVPCを接続します。
接続するインターネットゲートウェイとVPCをInternetGatewayIdとVpcIdで指定しています。
AWS::EC2::VPCGatewayAttachment
Subnet
1 2 3 4 5 6 7 8 9 10 11 12 | # ------------------------------------------------------------# # Subnet # ------------------------------------------------------------# PublicSubnetA: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC CidrBlock: "10.1.0.0/24" AvailabilityZone: ap-northeast-1a Tags: - Key: Name Value: !Sub ${self:provider.stage}-vpc-subnetA |
作成したVPCに所属させた10.1.0.0/24のサブネットを作成します。
VPC のサブネット
AWS::EC2::Subnet
RouteTable
1 2 3 4 5 6 7 8 9 10 | # ------------------------------------------------------------# # RouteTable # ------------------------------------------------------------# PublicRouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref VPC Tags: - Key: Name Value: !Sub ${self:provider.stage}-vpc-public-route-table |
ルートテーブルは、パケット情報がどこへ向かえば良いかを定義したものになります。
作成したVPCのためのルートテーブルを作成します。
Configure route tables
AWS::EC2::RouteTable
Route
1 2 3 4 5 6 7 8 9 | # ------------------------------------------------------------# # Route # ------------------------------------------------------------# PublicRoute: Type: AWS::EC2::Route Properties: RouteTableId: !Ref PublicRouteTable DestinationCidrBlock: "0.0.0.0/0" GatewayId: !Ref InternetGateway |
作成したルートテーブルにルートを追加します。
インターネットに抜けられるように、ルートを設定します。
SubnetRouteTableAssociation
1 2 3 4 5 6 7 8 | # ------------------------------------------------------------# # SubnetRouteTableAssociation # ------------------------------------------------------------# PublicSubnetARouteTableAssociationA: Type: AWS::EC2::SubnetRouteTableAssociation Properties: RouteTableId: !Ref PublicRouteTable SubnetId: !Ref PublicSubnetA |
ルートテーブルへサブネットを関連付けます。
サブネットがインターネットへ抜けられるようになります。
フローログの作成
VPC FlowLogs IAM Role
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | # ------------------------------------------------------------# # VPC FlowLogs IAM Role # ------------------------------------------------------------# VpcFlowLogsIamRole: Type: "AWS::IAM::Role" Properties: RoleName: !Sub ${self:provider.stage}-flowlogs-test-role AssumeRolePolicyDocument: Version: "2012-10-17" Statement: Effect: Allow Principal: Service: vpc-flow-logs.amazonaws.com Action: "sts:AssumeRole" Policies: - PolicyName: !Sub ${self:provider.stage}-flowlogs-test-policy PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: - "logs:CreateLogGroup" - "logs:CreateLogStream" - "logs:PutLogEvents" - "logs:DescribeLogGroups" - "logs:DescribeLogStreams" Resource: "*" |
CloudWatchにログを書き込むための権限を作成します。
VPC FlowLogs LogGroup
1 2 3 4 5 6 7 | # ------------------------------------------------------------# # VPC FlowLogs LogGroup # ------------------------------------------------------------# VpcFlowLogsLogGroup: Type: "AWS::Logs::LogGroup" Properties: LogGroupName: !Sub ${self:provider.stage}-vpc-flowlogs |
ロググループを作成します。
FlowLog
1 2 3 4 5 6 7 8 9 10 11 12 13 | # ------------------------------------------------------------# # FlowLog # ------------------------------------------------------------# VPCFlowLogs: Type: AWS::EC2::FlowLog Properties: ResourceId: !Ref VPC ResourceType: "VPC" TrafficType: "ALL" DeliverLogsPermissionArn: !GetAtt VpcFlowLogsIamRole.Arn LogGroupName: !Ref VpcFlowLogsLogGroup LogFormat: ${vpc-id} ${subnet-id} ${instance-id} ${srcaddr} ${dstaddr} ${srcport} ${dstport} ${protocol} ${action} ${log-status} ${flow-direction} ${traffic-path} MaxAggregationInterval: 60 |
VPCのネットワークインターフェースとの間で行き来するIPトラフィックに関する情報をキャプチャできるようにします。
出力するログのフォーマットには、VPCのIDやサブネットID、インスタンスIDに加えて、送信元のIPアドレスや、送信先のIPアドレス、送信元ポート番号や送信先ポート番号、通信プロトコルや、その通信が受信されたか拒否されたか等の情報を出力するように設定しています。
セキュリティグループの作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # ------------------------------------------------------------# # SecurityGroup # ------------------------------------------------------------# SSHSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: "ssh" SecurityGroupIngress: - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: 0.0.0.0/0 VpcId: !Ref VPC |
EC2インスタンスに付与するセキュリティグループを作成します。
今回はEC2インスタンスに対してSSH接続を行うため、SSHのみを許可するセキュリティグループを作成します。
EC2インスタンスを作成しSSH接続の実施
作成したVPC内のサブネットにEC2インスタンスを作成します。
AWSのコンソールからEC2を立ち上げる設定画面のネットワークにて設定します。
パブリックIPを自動で割り当てられるようにし、
また、作成したセキュリティグループを付与しています。
作成後、EC2インスタンスに対して、SSH接続を実施します。
EC2インスタンスに対するSSH接続に関しては下記の記事にまとめています。
VPCのFlowLogをCloudWatchのログで確認
自分のPCでcurl ipecho.net/plain; echoのコマンドを実行し、グローバルIPアドレスを確認します。
xxx.xxx.xx.xxx
確認したIPアドレスを、CloudWatchのログで検索すると、自分のPCからSSH接続した時の通信ログが確認できます。
まとめ
VPCネットワークを構築し、EC2インスタンスを配置し、SSH接続の通信ログを確認しました。