kawabatas技術ブログ

試してみたことを書いていきます

Lambda から EC2 へ TCP 疎通を確認する

概要

セキュリティグループのインバウンドルールで TCP を許可している EC2 に対して、

VPC 内にアクセス可能にした Lambda、そうでない Lambda からの疎通確認をしてみました。

Lambda のランタイムは Go です。

Lambda のコード

package main

import (
    "log"
    "net"
    "time"

    "github.com/aws/aws-lambda-go/lambda"
)

func main() {
    lambda.Start(func() {
        ip := "x.x.x.x"
        port := "xxxx"
        conn, err := net.DialTimeout("tcp", ip+":"+port, 3*time.Second)
        if err != nil {
            log.Fatal(err)
        }
        defer conn.Close()
        log.Print("Connected.")
    })
}

ip を EC2 インスタンスの パブリックIP/プライベートIP に変えて TCP の疎通を試します。

VPC 内にアクセスできない Lambda から確認

Lambda を作成 f:id:kawabatas:20190207125229p:plain

コードをアップロード(パブリックIP)

// ビルド
GOOS=linux GOARCH=amd64 go build -o hello ./hello
// zip化
zip handler.zip ./hello

AWS マネジメントコンソールから zip をアップロード f:id:kawabatas:20190207125311p:plain

テストを実行 f:id:kawabatas:20190207125342p:plain

テスト成功。ログに 'Connected' が表示されている

続いて、ip をプライベートIPに変更し、ビルド&アップロード

テストを実行 f:id:kawabatas:20190207125435p:plain

tcp のコネクションがタイムアウトになり、テストは失敗

VPC 内にアクセス可能な Lambda から確認

Lambda を VPC アクセス可能に変更する

IAM -> ロールから AWSLambdaVPCAccessExecutionRole ポリシーをアタッチ

f:id:kawabatas:20190207125520p:plain

lambda 関数のネットワークの設定(VPC,サブネット,セキュリティグループ)を更新 f:id:kawabatas:20190207125543p:plain

テストを実行(ip はプライベートIP) f:id:kawabatas:20190207125600p:plain

テスト成功