Basic Function to ALB
•
lambda_function.py
import json
def lambda_handler(event, context):
# TODO implement
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
Python
복사
zip -r lambda-function.zip .
# 버킷에 Zip 파일 업로드 진행
aws s3 mb s3://crs-lambda-function-bucket
Shell
복사
# VPC
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: VPC
metadata:
name: demo-vpc
spec:
forProvider:
region: ap-northeast-2
cidrBlock: 10.0.0.0/16
enableDnsSupport: true
enableDnsHostNames: true
instanceTenancy: default
tags:
- key: Name
value: demo-vpc
providerConfigRef:
name: aws-provider
---
# Public Subnets
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: Subnet
metadata:
name: demo-public-subnet-a
spec:
forProvider:
region: ap-northeast-2
availabilityZone: ap-northeast-2a
cidrBlock: 10.0.0.0/24
vpcIdRef:
name: demo-vpc
mapPublicIPOnLaunch: true
tags:
- key: Name
value: demo-public-subnet-a
providerConfigRef:
name: aws-provider
---
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: Subnet
metadata:
name: demo-public-subnet-b
spec:
forProvider:
region: ap-northeast-2
availabilityZone: ap-northeast-2b
cidrBlock: 10.0.1.0/24
vpcIdRef:
name: demo-vpc
mapPublicIPOnLaunch: true
tags:
- key: Name
value: demo-public-subnet-b
providerConfigRef:
name: aws-provider
---
# Private Subnets
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: Subnet
metadata:
name: demo-private-subnet-a
spec:
forProvider:
region: ap-northeast-2
availabilityZone: ap-northeast-2a
cidrBlock: 10.0.2.0/24
vpcIdRef:
name: demo-vpc
mapPublicIPOnLaunch: false
tags:
- key: Name
value: demo-private-subnet-a
providerConfigRef:
name: aws-provider
---
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: Subnet
metadata:
name: demo-private-subnet-b
spec:
forProvider:
region: ap-northeast-2
availabilityZone: ap-northeast-2b
cidrBlock: 10.0.3.0/24
vpcIdRef:
name: demo-vpc
mapPublicIPOnLaunch: false
tags:
- key: Name
value: demo-private-subnet-b
providerConfigRef:
name: aws-provider
---
# Internet Gateway
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: InternetGateway
metadata:
name: demo-igw
spec:
forProvider:
region: ap-northeast-2
vpcIdRef:
name: demo-vpc
tags:
- key: Name
value: demo-igw
providerConfigRef:
name: aws-provider
---
# EIPs for NAT
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: Address
metadata:
name: demo-eip-a
spec:
forProvider:
region: ap-northeast-2
domain: vpc
tags:
- key: Name
value: demo-eip-a
providerConfigRef:
name: aws-provider
---
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: Address
metadata:
name: demo-eip-b
spec:
forProvider:
region: ap-northeast-2
domain: vpc
tags:
- key: Name
value: demo-eip-b
providerConfigRef:
name: aws-provider
---
# NAT Gateways
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: NATGateway
metadata:
name: demo-natgw-a
spec:
forProvider:
region: ap-northeast-2
allocationIdRef:
name: demo-eip-a
subnetIdRef:
name: demo-public-subnet-a
tags:
- key: Name
value: demo-natgw-a
providerConfigRef:
name: aws-provider
---
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: NATGateway
metadata:
name: demo-natgw-b
spec:
forProvider:
region: ap-northeast-2
allocationIdRef:
name: demo-eip-b
subnetIdRef:
name: demo-public-subnet-b
tags:
- key: Name
value: demo-natgw-b
providerConfigRef:
name: aws-provider
---
# Route Tables
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: RouteTable
metadata:
name: demo-public-rt
spec:
forProvider:
region: ap-northeast-2
vpcIdRef:
name: demo-vpc
routes:
- destinationCidrBlock: 0.0.0.0/0
gatewayIdRef:
name: demo-igw
associations:
- subnetIdRef:
name: demo-public-subnet-a
- subnetIdRef:
name: demo-public-subnet-b
tags:
- key: Name
value: demo-public-rt
providerConfigRef:
name: aws-provider
---
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: RouteTable
metadata:
name: demo-private-rt-a
spec:
forProvider:
region: ap-northeast-2
vpcIdRef:
name: demo-vpc
routes:
- destinationCidrBlock: 0.0.0.0/0
natGatewayIdRef:
name: demo-natgw-a
associations:
- subnetIdRef:
name: demo-private-subnet-a
tags:
- key: Name
value: demo-private-rt-a
providerConfigRef:
name: aws-provider
---
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: RouteTable
metadata:
name: demo-private-rt-b
spec:
forProvider:
region: ap-northeast-2
vpcIdRef:
name: demo-vpc
routes:
- destinationCidrBlock: 0.0.0.0/0
natGatewayIdRef:
name: demo-natgw-b
associations:
- subnetIdRef:
name: demo-private-subnet-b
tags:
- key: Name
value: demo-private-rt-b
providerConfigRef:
name: aws-provider
---
# Endpoint
apiVersion: ec2.aws.crossplane.io/v1alpha1
kind: VPCEndpoint
metadata:
name: demo-s3-vpc-endpoint
spec:
forProvider:
region: ap-northeast-2
routeTableIdRefs:
- name: demo-private-rt-a
- name: demo-private-rt-b
serviceName: com.amazonaws.ap-northeast-2.s3
vpcEndpointType: Gateway
vpcIdRef:
name: demo-vpc
tags:
Name: demo-s3-vpc-endpoint
providerConfigRef:
name: aws-provider
---
# Security Group for Lambda
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: SecurityGroup
metadata:
name: lambda-sg
spec:
forProvider:
region: ap-northeast-2
groupName: lambda-sg
vpcIdRef:
name: demo-vpc
description: Security group for Lambda function
egress:
# AWS will treat it as all ports any protocol
- ipProtocol: '-1'
ipRanges:
- cidrIp: 0.0.0.0/0
ingress:
- fromPort: 80
ipProtocol: tcp
ipRanges:
- cidrIp: 0.0.0.0/0
toPort: 80
tags:
- key: Name
value: lambda-sg
providerConfigRef:
name: aws-provider
---
# Security Group for ALB
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: SecurityGroup
metadata:
name: alb-sg
spec:
forProvider:
region: ap-northeast-2
groupName: alb-sg
vpcIdRef:
name: demo-vpc
description: Security group for ALB
egress:
# AWS will treat it as all ports any protocol
- ipProtocol: '-1'
ipRanges:
- cidrIp: 0.0.0.0/0
ingress:
- fromPort: 80
ipProtocol: tcp
ipRanges:
- cidrIp: 0.0.0.0/0
toPort: 80
tags:
- key: Name
value: alb-sg
providerConfigRef:
name: aws-provider
---
# Application Load Balancer
apiVersion: elbv2.aws.crossplane.io/v1alpha1
kind: LoadBalancer
metadata:
name: demo-alb
spec:
forProvider:
region: ap-northeast-2
name: demo-alb
loadBalancerType: application
subnetRefs:
- name: demo-public-subnet-a
- name: demo-public-subnet-b
securityGroupRefs:
- name: alb-sg
providerConfigRef:
name: aws-provider
---
# Target Group
apiVersion: elbv2.aws.crossplane.io/v1alpha1
kind: TargetGroup
metadata:
name: lambda-tg
labels:
type: alb-target-group
spec:
forProvider:
region: ap-northeast-2
name: lambda-tg
targetType: lambda
providerConfigRef:
name: aws-provider
---
# ALB Listener
apiVersion: elbv2.aws.crossplane.io/v1alpha1
kind: Listener
metadata:
name: alb-listener
spec:
forProvider:
region: ap-northeast-2
loadBalancerArnRef:
name: demo-alb
port: 80
protocol: HTTP
defaultActions:
- actionType: forward
forwardConfig:
targetGroups:
- targetGroupArnRef:
name: lambda-tg
providerConfigRef:
name: aws-provider
---
# Lambda Execution Role
apiVersion: iam.aws.crossplane.io/v1beta1
kind: Role
metadata:
name: lambda-execution-role
spec:
forProvider:
assumeRolePolicyDocument: |
{
"Version": "2012-10-17",
"Statement": [{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
}
}]
}
providerConfigRef:
name: aws-provider
---
apiVersion: iam.aws.crossplane.io/v1beta1
kind: RolePolicyAttachment
metadata:
name: lambda-vpc-execution-policy
spec:
forProvider:
policyArn: arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole
roleName: lambda-execution-role
providerConfigRef:
name: aws-provider
---
# Lambda Function
apiVersion: lambda.aws.crossplane.io/v1beta1
kind: Function
metadata:
name: demo-function
spec:
forProvider:
packageType: Zip
code:
s3Bucket: crs-lambda-function-bucket
s3Key: lambda-function.zip
handler: lambda_function.lambda_handler
runtime: python3.13
roleRef:
name: lambda-execution-role
region: ap-northeast-2
timeout: 60
memorySize: 128
vpcConfig:
subnetIDRefs:
- name: demo-private-subnet-a
- name: demo-private-subnet-b
securityGroupIDRefs:
- name: lambda-sg
tags:
Name: demo-function
providerConfigRef:
name: aws-provider
---
apiVersion: elbv2.aws.crossplane.io/v1alpha1
kind: Target
metadata:
name: lambda-target
spec:
forProvider:
region: ap-northeast-2
targetGroupArnRef:
name: lambda-tg
lambdaArnRef:
name: demo-function
providerConfigRef:
name: aws-provider
YAML
복사
Container Image Function to ALB
aws ecr create-repository \
--repository-name nginx \
--region ap-northeast-2 \
--image-tag-mutability MUTABLE
Shell
복사
docker pull nginx # nginx Image 사용
ACCOUNT_ID=$(aws sts get-caller-identity --query "Account" --output text)
REGION_CODE=$(aws configure set region ap-northeast-2 && aws configure get region)
aws ecr get-login-password --region $REGION_CODE | docker login --username AWS --password-stdin $ACCOUNT_ID.dkr.ecr.$REGION_CODE.amazonaws.com
docker build -t nginx .
docker tag nginx:latest $ACCOUNT_ID.dkr.ecr.$REGION_CODE.amazonaws.com/nginx:latest
docker push $ACCOUNT_ID.dkr.ecr.$REGION_CODE.amazonaws.com/nginx:latest
Shell
복사
# VPC
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: VPC
metadata:
name: demo-vpc
spec:
forProvider:
region: ap-northeast-2
cidrBlock: 10.0.0.0/16
enableDnsSupport: true
enableDnsHostNames: true
instanceTenancy: default
tags:
- key: Name
value: demo-vpc
providerConfigRef:
name: aws-provider
---
# Public Subnets
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: Subnet
metadata:
name: demo-public-subnet-a
spec:
forProvider:
region: ap-northeast-2
availabilityZone: ap-northeast-2a
cidrBlock: 10.0.0.0/24
vpcIdRef:
name: demo-vpc
mapPublicIPOnLaunch: true
tags:
- key: Name
value: demo-public-subnet-a
providerConfigRef:
name: aws-provider
---
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: Subnet
metadata:
name: demo-public-subnet-b
spec:
forProvider:
region: ap-northeast-2
availabilityZone: ap-northeast-2b
cidrBlock: 10.0.1.0/24
vpcIdRef:
name: demo-vpc
mapPublicIPOnLaunch: true
tags:
- key: Name
value: demo-public-subnet-b
providerConfigRef:
name: aws-provider
---
# Private Subnets
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: Subnet
metadata:
name: demo-private-subnet-a
spec:
forProvider:
region: ap-northeast-2
availabilityZone: ap-northeast-2a
cidrBlock: 10.0.2.0/24
vpcIdRef:
name: demo-vpc
mapPublicIPOnLaunch: false
tags:
- key: Name
value: demo-private-subnet-a
providerConfigRef:
name: aws-provider
---
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: Subnet
metadata:
name: demo-private-subnet-b
spec:
forProvider:
region: ap-northeast-2
availabilityZone: ap-northeast-2b
cidrBlock: 10.0.3.0/24
vpcIdRef:
name: demo-vpc
mapPublicIPOnLaunch: false
tags:
- key: Name
value: demo-private-subnet-b
providerConfigRef:
name: aws-provider
---
# Internet Gateway
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: InternetGateway
metadata:
name: demo-igw
spec:
forProvider:
region: ap-northeast-2
vpcIdRef:
name: demo-vpc
tags:
- key: Name
value: demo-igw
providerConfigRef:
name: aws-provider
---
# EIPs for NAT
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: Address
metadata:
name: demo-eip-a
spec:
forProvider:
region: ap-northeast-2
domain: vpc
tags:
- key: Name
value: demo-eip-a
providerConfigRef:
name: aws-provider
---
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: Address
metadata:
name: demo-eip-b
spec:
forProvider:
region: ap-northeast-2
domain: vpc
tags:
- key: Name
value: demo-eip-b
providerConfigRef:
name: aws-provider
---
# NAT Gateways
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: NATGateway
metadata:
name: demo-natgw-a
spec:
forProvider:
region: ap-northeast-2
allocationIdRef:
name: demo-eip-a
subnetIdRef:
name: demo-public-subnet-a
tags:
- key: Name
value: demo-natgw-a
providerConfigRef:
name: aws-provider
---
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: NATGateway
metadata:
name: demo-natgw-b
spec:
forProvider:
region: ap-northeast-2
allocationIdRef:
name: demo-eip-b
subnetIdRef:
name: demo-public-subnet-b
tags:
- key: Name
value: demo-natgw-b
providerConfigRef:
name: aws-provider
---
# Route Tables
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: RouteTable
metadata:
name: demo-public-rt
spec:
forProvider:
region: ap-northeast-2
vpcIdRef:
name: demo-vpc
routes:
- destinationCidrBlock: 0.0.0.0/0
gatewayIdRef:
name: demo-igw
associations:
- subnetIdRef:
name: demo-public-subnet-a
- subnetIdRef:
name: demo-public-subnet-b
tags:
- key: Name
value: demo-public-rt
providerConfigRef:
name: aws-provider
---
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: RouteTable
metadata:
name: demo-private-rt-a
spec:
forProvider:
region: ap-northeast-2
vpcIdRef:
name: demo-vpc
routes:
- destinationCidrBlock: 0.0.0.0/0
natGatewayIdRef:
name: demo-natgw-a
associations:
- subnetIdRef:
name: demo-private-subnet-a
tags:
- key: Name
value: demo-private-rt-a
providerConfigRef:
name: aws-provider
---
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: RouteTable
metadata:
name: demo-private-rt-b
spec:
forProvider:
region: ap-northeast-2
vpcIdRef:
name: demo-vpc
routes:
- destinationCidrBlock: 0.0.0.0/0
natGatewayIdRef:
name: demo-natgw-b
associations:
- subnetIdRef:
name: demo-private-subnet-b
tags:
- key: Name
value: demo-private-rt-b
providerConfigRef:
name: aws-provider
---
# Endpoint
apiVersion: ec2.aws.crossplane.io/v1alpha1
kind: VPCEndpoint
metadata:
name: demo-s3-vpc-endpoint
spec:
forProvider:
region: ap-northeast-2
routeTableIdRefs:
- name: demo-private-rt-a
- name: demo-private-rt-b
serviceName: com.amazonaws.ap-northeast-2.s3
vpcEndpointType: Gateway
vpcIdRef:
name: demo-vpc
tags:
Name: demo-s3-vpc-endpoint
providerConfigRef:
name: aws-provider
---
# Security Group for Lambda
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: SecurityGroup
metadata:
name: lambda-sg
spec:
forProvider:
region: ap-northeast-2
groupName: lambda-sg
vpcIdRef:
name: demo-vpc
description: Security group for Lambda function
egress:
# AWS will treat it as all ports any protocol
- ipProtocol: '-1'
ipRanges:
- cidrIp: 0.0.0.0/0
ingress:
- fromPort: 80
ipProtocol: tcp
ipRanges:
- cidrIp: 0.0.0.0/0
toPort: 80
tags:
- key: Name
value: lambda-sg
providerConfigRef:
name: aws-provider
---
# Security Group for ALB
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: SecurityGroup
metadata:
name: alb-sg
spec:
forProvider:
region: ap-northeast-2
groupName: alb-sg
vpcIdRef:
name: demo-vpc
description: Security group for ALB
egress:
# AWS will treat it as all ports any protocol
- ipProtocol: '-1'
ipRanges:
- cidrIp: 0.0.0.0/0
ingress:
- fromPort: 80
ipProtocol: tcp
ipRanges:
- cidrIp: 0.0.0.0/0
toPort: 80
tags:
- key: Name
value: alb-sg
providerConfigRef:
name: aws-provider
---
# Application Load Balancer
apiVersion: elbv2.aws.crossplane.io/v1alpha1
kind: LoadBalancer
metadata:
name: demo-alb
spec:
forProvider:
region: ap-northeast-2
name: demo-alb
loadBalancerType: application
subnetRefs:
- name: demo-public-subnet-a
- name: demo-public-subnet-b
securityGroupRefs:
- name: alb-sg
providerConfigRef:
name: aws-provider
---
# Target Group
apiVersion: elbv2.aws.crossplane.io/v1alpha1
kind: TargetGroup
metadata:
name: lambda-tg
labels:
type: alb-target-group
spec:
forProvider:
region: ap-northeast-2
name: lambda-tg
targetType: lambda
providerConfigRef:
name: aws-provider
---
# ALB Listener
apiVersion: elbv2.aws.crossplane.io/v1alpha1
kind: Listener
metadata:
name: alb-listener
spec:
forProvider:
region: ap-northeast-2
loadBalancerArnRef:
name: demo-alb
port: 80
protocol: HTTP
defaultActions:
- actionType: forward
forwardConfig:
targetGroups:
- targetGroupArnRef:
name: lambda-tg
providerConfigRef:
name: aws-provider
---
# Lambda Execution Role
apiVersion: iam.aws.crossplane.io/v1beta1
kind: Role
metadata:
name: lambda-execution-role
spec:
forProvider:
assumeRolePolicyDocument: |
{
"Version": "2012-10-17",
"Statement": [{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
}
}]
}
providerConfigRef:
name: aws-provider
---
apiVersion: iam.aws.crossplane.io/v1beta1
kind: RolePolicyAttachment
metadata:
name: lambda-vpc-execution-policy
spec:
forProvider:
policyArn: arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole
roleName: lambda-execution-role
providerConfigRef:
name: aws-provider
---
# Lambda Function
apiVersion: lambda.aws.crossplane.io/v1beta1
kind: Function
metadata:
name: demo-function
spec:
forProvider:
packageType: Image
code:
imageURI: IMAGE
roleRef:
name: lambda-execution-role
region: ap-northeast-2
timeout: 60
memorySize: 128
vpcConfig:
subnetIDRefs:
- name: demo-private-subnet-a
- name: demo-private-subnet-b
securityGroupIDRefs:
- name: lambda-sg
tags:
Name: demo-function
providerConfigRef:
name: aws-provider
---
apiVersion: elbv2.aws.crossplane.io/v1alpha1
kind: Target
metadata:
name: lambda-target
spec:
forProvider:
region: ap-northeast-2
targetGroupArnRef:
name: lambda-tg
lambdaArnRef:
name: demo-function
providerConfigRef:
name: aws-provider
YAML
복사
IMAGE_URL=$(aws ecr describe-repositories --repository-name nginx --query "repositories[].repositoryUri" --output text)
IMAGE_TAG=$(aws ecr describe-images --repository-name nginx --query "imageDetails[].imageTags" --output text)
IMAGE="$IMAGE_URL:$IMAGE_TAG"
sed -i "s|IMAGE|$IMAGE|g" alb.yaml
Shell
복사
kubectl apply -f alb.yaml
Shell
복사
kubectl get loadbalancer
Shell
복사