[파이썬] 파이썬 애플리케이션의 AWS Lambda 보안 및 인가 설정

AWS Lambda는 서버리스 아키텍처를 사용하여 파이썬 애플리케이션을 실행하는 데에 매우 유용합니다. 그러나 보안과 인가 설정은 언제나 중요한 고려 사항입니다. 이 글에서는 AWS Lambda에서 파이썬 애플리케이션의 보안 및 인가 설정에 대해 알아보겠습니다.

1. IAM(Identity and Access Management) 역할 사용

AWS Lambda 함수를 실행하기 위해 IAM 역할을 설정하는 것이 첫 번째 중요한 단계입니다. 이를 통해 Lambda 함수가 권한이 있는 AWS 리소스에 액세스할 수 있게 됩니다. 예를 들어, Lambda 함수가 S3 버킷에 접근해야 하는 경우 해당 버킷에 대한 읽기 및 쓰기 권한이 있는 IAM 역할을 생성한 다음 Lambda 함수에 연결할 수 있습니다.

import boto3

# IAM 역할 생성
iam_client = boto3.client('iam')
response = iam_client.create_role(
    RoleName='lambda-role',
    AssumeRolePolicyDocument='''{
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "lambda.amazonaws.com"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }'''
)

# IAM 역할에 S3 버킷 접근 권한 추가
policy_document = '''{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::my-bucket/*"
        }
    ]
}'''
response = iam_client.put_role_policy(
    RoleName='lambda-role',
    PolicyName='s3-access-policy',
    PolicyDocument=policy_document
)

2. 보안 그룹 및 네트워크 ACL 설정

AWS Lambda 함수는 VPC(Virtual Private Cloud) 내에서 실행될 수 있습니다. 이 경우, 해당 VPC에 대한 네트워크 ACL을 설정하고 보안 그룹을 구성해야 합니다. 이렇게하면 Lambda 함수가 필요한 네트워크 리소스에만 액세스 할 수 있도록 제한할 수 있습니다.

import boto3

ec2_client = boto3.client('ec2')

# VPC ID를 가져옴
response = ec2_client.describe_vpcs()
vpc_id = response['Vpcs'][0]['VpcId']

# 네트워크 ACL 설정
response = ec2_client.create_network_acl(
    VpcId=vpc_id
)

# 네트워크 ACL 규칙 추가
acl_id = response['NetworkAcl']['NetworkAclId']
response = ec2_client.create_network_acl_entry(
    NetworkAclId=acl_id,
    RuleNumber=100,
    Protocol='-1',
    RuleAction='allow',
    Egress=False,
    CidrBlock='0.0.0.0/0'
)

# 보안 그룹 생성
response = ec2_client.create_security_group(
    GroupName='lambda-sg',
    Description='Security Group for Lambda function',
    VpcId=vpc_id
)
security_group_id = response['GroupId']

# 보안 그룹 규칙 추가
response = ec2_client.authorize_security_group_ingress(
    GroupId=security_group_id,
    IpPermissions=[
        {
            'FromPort': 80,
            'ToPort': 80,
            'IpProtocol': 'tcp',
            'IpRanges': [{'CidrIp': '0.0.0.0/0'}]
        }
    ]
)

# Lambda 함수에 보안 그룹 연결
lambda_client = boto3.client('lambda')
response = lambda_client.update_function_configuration(
    FunctionName='my-lambda-function',
    VpcConfig={
        'SubnetIds': [subnet_id],
        'SecurityGroupIds': [security_group_id]
    }
)

3. 환경 변수 사용

파이썬 애플리케이션에서 AWS Lambda 함수를 실행할 때, 일부 중요한 정보는 환경 변수로 설정하여 관리하는 것이 좋습니다. 예를 들어, 데이터베이스 연결 정보와 같은 보안 정보는 소스 코드에 하드 코딩하지 않고 환경 변수로 설정되어야 합니다. 이렇게하면 코드가 소스 버전 관리 도구에게 노출될 때 중요한 정보가 노출되는 것을 방지할 수 있습니다.

import os

database_endpoint = os.environ['DB_ENDPOINT']
database_username = os.environ['DB_USERNAME']
database_password = os.environ['DB_PASSWORD']

결론

AWS Lambda를 사용하여 파이썬 애플리케이션을 실행할 때, 적절한 보안 및 인가 설정을 적용하는 것이 매우 중요합니다. IAM 역할을 사용하여 권한을 제어하고, 보안 그룹 및 네트워크 ACL을 설정하여 필요한 네트워크 리소스에만 액세스 할 수 있도록하고, 환경 변수를 사용하여 중요한 정보를 안전하게 관리하는 것이 좋습니다. 이러한 모든 단계를 따르면 AWS Lambda로 실행되는 파이썬 애플리케이션의 보안 수준을 향상시킬 수 있습니다.