Amazon VPC에서 Lambda 함수를 사용하여 Secrets Manager 보안 정보를 검색하려면 어떻게 해야 하나요?

4분 분량
0

Amazon Virtual Private Cloud(VPC)의 AWS Lambda 함수가 AWS Secrets Manager에 액세스할 수 없습니다.

간략한 설명

Lambda 함수는 AWS 서비스 및 인터넷에 액세스할 수 있는 안전한 Amazon VPC에서 실행됩니다. Lambda 서비스가 이 Amazon VPC를 소유하고 있으며 기본 Amazon VPC에 연결되어 있지 않습니다.

Amazon VPC에 연결된 Lambda 함수는 액세스를 제공하도록 Amazon VPC를 구성한 경우에만 인터넷에 액세스할 수 있습니다. Lambda가 Amazon VPC 내에서 생성하는 네트워크 인터페이스는 프라이빗 IP 주소를 사용하며 인터넷 게이트웨이를 사용하여 인터넷에 연결할 수 없습니다.

자세한 내용은 VPC 연결 기능을 위한 인터넷 및 서비스 액세스를 참조합니다.

참고: 함수가 Amazon VPC의 다른 리소스에 액세스해야 하는 경우가 아니라면, Amazon VPC에 Lambda 함수를 배치하지 않는 것이 가장 좋습니다.

해결 방법

Lambda 네트워크 구성

Amazon VPC에 연결된 Lambda 함수가 Secrets Manager에 액세스할 수 있도록 허용하려면 다음 방법 중 하나를 따릅니다.

**프라이빗 서브넷에 NAT 게이트웨이 연결 **

기능에 인터넷 액세스 권한을 부여합니다. 함수를 프라이빗 서브넷에 배치하고 아웃바운드 트래픽을 퍼블릭 서브넷의 NAT 게이트웨이로 라우팅합니다. NAT 게이트웨이는 공인 IP 주소를 가지며 VPC의 인터넷 게이트웨이를 통해 인터넷에 연결합니다.

Amazon VPC 인터페이스 엔드포인트 사용

Secrets Manager에 대한 Amazon VPC 인터페이스 엔드포인트를 설정합니다. 그러면 Amazon VPC가 인터넷에 액세스하지 않고도 Lambda 함수에서 Secrets Manager에 연결합니다. Amazon VPC 엔드포인트 보안 그룹이 Lambda 보안 그룹 또는 IP 주소 범위에서 포트 443 인바운드 트래픽을 허용하는지 확인합니다. 또한 Lambda 보안 그룹이 Amazon VPC 엔드포인트 보안 그룹 또는 IP 주소 범위로 포트 443 아웃바운드 트래픽을 허용하는지 확인합니다.

참고: AWS PrivateLink VPC 엔드포인트를 사용하는 경우, 도메인 이름 시스템(DNS)에 대해 Amazon VPC의 DHCP 옵션을 구성해야 합니다. 자세한 내용은 Amazon VPC의 DNS 속성을 참조합니다.

예를 들어, 다음 AWS CloudFormation 템플릿은 VPC의 프라이빗 서브넷 내에 Lambda 함수를 설정합니다. 이렇게 하면, VPC 엔드포인트를 통해 AWS Secrets Manager에 비공개로 액세스할 수 있습니다.

AWSTemplateFormatVersion: "2010-09-09"
Description: "Lambda Secrets Manager"
Resources:
    EC2SecurityGroup:
        Type: "AWS::EC2::SecurityGroup"
        Properties:
            GroupDescription: "launch-wizard-19 created 2022-03-23T11:10:16.721+05:30"
            GroupName: "launch-wizard-19"
            VpcId: !Ref EC2VPC
            SecurityGroupIngress:
              -
                CidrIp: "10.0.0.0/16"
                FromPort: 443
                IpProtocol: "tcp"
                ToPort: 443
            SecurityGroupEgress:
              -
                CidrIp: "10.0.0.0/16"
                FromPort: 443
                IpProtocol: "tcp"
                ToPort: 443


    LambdaFunction:
        Type: "AWS::Lambda::Function"
        Properties:
            Description: "AWS Lambda to AWS Secrets Manager"
            FunctionName: "SecretsManagerLambda"
            Handler: "index.lambda_handler"
            Architectures:
              - "x86_64"
            Code:
              ZipFile: |
                import json
                import boto3
                client = boto3.client('secretsmanager')

                def lambda_handler(event, context):
                    response = client.get_secret_value(
                    SecretId='string',
                    VersionId='string',
                    VersionStage='string'
                    )
                    print(response)
                    # TODO implement
                    return {
                        'statusCode': 200,
                        'body': json.dumps('Hello from Lambda!')
                    }



            MemorySize: 128
            Role: !GetAtt IAMRole.Arn
            Runtime: "python3.11"
            Timeout: 30
            TracingConfig:
                Mode: "PassThrough"
            EphemeralStorage:
                Size: 512
            VpcConfig:
              SecurityGroupIds:
                - !Ref EC2SecurityGroup
              SubnetIds:
                - !Ref EC2Subnet

    EC2VPC:
        Type: "AWS::EC2::VPC"
        Properties:
            CidrBlock: "10.0.0.0/16"
            EnableDnsSupport: true
            EnableDnsHostnames: true
            InstanceTenancy: "default"

    EC2Subnet:
        Type: "AWS::EC2::Subnet"
        Properties:
            AvailabilityZone: !Sub "${AWS::Region}b"
            CidrBlock: "10.0.7.0/24"
            VpcId: !Ref EC2VPC
            MapPublicIpOnLaunch: false
            Tags:
              -
                Key: "Name"
                Value: "Private-new-availability"

    EC2VPCEndpoint:
        Type: "AWS::EC2::VPCEndpoint"
        Properties:
            VpcEndpointType: "Interface"
            VpcId: !GetAtt EC2Subnet.VpcId
            ServiceName: !Sub "com.amazonaws.${AWS::Region}.secretsmanager"
            PolicyDocument: |
                {
                  "Statement": [
                    {
                      "Action": "*",
                      "Effect": "Allow",
                      "Principal": "*",
                      "Resource": "*"
                    }
                  ]
                }
            SubnetIds:
              - !Ref EC2Subnet
            PrivateDnsEnabled: true
            SecurityGroupIds:
              - !Ref EC2SecurityGroup

    IAMRole:
        Type: "AWS::IAM::Role"
        Properties:
            Path: "/"
            RoleName: "Lambdapermissions"
            AssumeRolePolicyDocument: "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"lambda.amazonaws.com\"},\"Action\":\"sts:AssumeRole\"}]}"
            ManagedPolicyArns:
              - !Ref IAMManagedPolicy


            Description: "Allows Lambda functions to call AWS services on your behalf."

    IAMManagedPolicy:
        Type: "AWS::IAM::ManagedPolicy"
        Properties:
            ManagedPolicyName: "LambdaSecretsPolicy"
            Path: "/"
            PolicyDocument: |
                {
                    "Version": "2012-10-17",
                    "Statement": [
                        {
                            "Sid": "Statement1",
                            "Effect": "Allow",
                            "Action": [
                                "secretsmanager:GetSecretValue",
                                "ec2:CreateNetworkInterface",
                                "ec2:DescribeNetworkInterfaces",
                                "ec2:DeleteNetworkInterface"
                            ],
                            "Resource": "*"
                        }
                    ]
                }

Lambda 실행 역할 권한

Lambda 실행 역할에 Secrets Manager 보안 정보에 액세스할 수 있는 권한을 부여합니다. GetSecretValue API 호출을 사용하여 Secrets Manager 보안 정보를 가져옵니다. 자세한 내용은 예시: 보안 정보 값을 검색할 수 있는 권한을 참조합니다.

(선택 사항) AWS Key Management Service(AWS KMS) 권한

Secrets Manager 보안 정보가 관리 키](https://docs.aws.amazon.com/secretsmanager/latest/userguide/security-encryption.html) **aws/secretsmanager](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk) 대신 AWS KMS [고객 관리 키[로 암호화된 경우, 추가 구성이 ** 필요합니다. Decrypt API 작업 권한을 Lambda 실행 역할 또는 AWS KMS 키 정책으로 허용해야 합니다.

관련 정보

Lambda의 권한 문제를 해결하려면 어떻게 해야 하나요?

댓글 없음