본문 바로가기

Server Infra/AWS

AWS Lambda Function URL 사용 #2

728x90

 이번에는 Lambda를 VPC 내부에 위치 시켜 보았다.

 

요즘은 CDK를 열심히 쓰고 있으니 CDK로 현재 VPC 네트워크 구조를 알아보자

export class VpcStack extends Stack {
    constructor(scope: Construct, id: string, props?: StackProps) {
        super(scope, id, props);

        const mySiteBucketName = new CfnParameter(this, "mySiteBucketName", {
            type: "String"
            , description: "The name of S3 bucket to upload react application"
        });

        const vpc = new ec2.Vpc(this, 'SpecificRoutingVPC', {
            natGateways: 1
            , maxAzs: 2
            , cidr: '10.0.0.0/16'
            , enableDnsHostnames : true
            , enableDnsSupport : true
            , subnetConfiguration: [
                {
                    subnetType: ec2.SubnetType.PRIVATE_ISOLATED
                    , name: 'DB_Subnet'
                    , cidrMask: 24
                }
                , {
                    subnetType: ec2.SubnetType.PRIVATE_WITH_NAT
                    , name: 'Private_Subnet'
                    , cidrMask: 24
                }
                , {
                    subnetType: ec2.SubnetType.PUBLIC
                    , name: 'Public_Subnet'
                    , cidrMask: 24
                }
            ]
        });
        
        const logGroup = new logs.LogGroup(this, 'FlowLogGroup');

        const role = new iam.Role(this, 'FlowLogRole', {
            assumedBy: new iam.ServicePrincipal('vpc-flow-logs.amazonaws.com')
        });

        new ec2.FlowLog(this, 'SampleFlowLog', {
            resourceType: ec2.FlowLogResourceType.fromVpc(vpc)
            , destination: ec2.FlowLogDestination.toCloudWatchLogs(logGroup, role)
            , flowLogName: 'SampleFlowLog'
            , trafficType: ec2.FlowLogTrafficType.ALL
        });


        

    new CfnOutput(this, "vpc-id", { value: vpc.vpcId });
    }
}

위처럼 3개의 서브넷으로 나누었고 그중 DB_Subnet은 NAT gw또한 없는 완전한 Private영역이다.

 

우선 Lambda를 VPC내부에 위치시키기 위해선 Role 추가가 필요하다. 관련하여 Managed Role이 있어서 AWSLambdaVPCAccessExecutionRole을 사용했다.

그리고 Lambda를 VPC내부로 위치시켰다.

 

그런데 호출은?

내 생각과 다르게 외부에서 잘만 호출된다...

그렇다고 내부 자원 접근이 안되는것도 아니고...이거 도대체 구성이 어떻게 되어있는걸까...?

 

분명 Private한 구성이 되면 Lambda자체도 외부 인터넷 호출을 위해 NAT g/w가 필요한데 얘는 그것과는 완전 별도로 동작하는것 같다. 마치 Lambda의 Service API를 외부에 노출시킨 느낌이다.

 

어찌보면 보안적으로 이슈가 있을것 같은데 이건 Private한 ALB를 붙이는 방법도 있으니 넘어가도록 하자.

 

아무튼 각 기능에 궁금한건 알았으니 이제 활용을 어찌 할지 고민을 해볼 차례다

 

728x90