CLUSTER_NAME=<CLUSTER_NAME>
AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
aws dynamodb create-table \\
--table-name keda-events \\
--attribute-definitions \\
AttributeName=event_type,AttributeType=S \\
AttributeName=id,AttributeType=S \\
--key-schema \\
AttributeName=event_type,KeyType=HASH \\
AttributeName=id,KeyType=RANGE \\
--billing-mode PAY_PER_REQUEST \\
--region ap-northeast-2
cat << EOF > iam_policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DynamoDBAccess",
"Effect": "Allow",
"Action": [
"dynamodb:DescribeTable",
"dynamodb:Query",
"dynamodb:Scan",
"dynamodb:GetItem",
"dynamodb:PutItem",
"dynamodb:UpdateItem",
"dynamodb:DeleteItem"
],
"Resource": "arn:aws:dynamodb:ap-northeast-2:$AWS_ACCOUNT_ID:table/keda-events"
}
]
}
EOF
aws iam create-policy \\
--policy-name DynamoDBPolicy \\
--policy-document file://iam_policy.json
eksctl create iamserviceaccount \\
--cluster=$CLUSTER_NAME \\
--namespace=keda-dynamodb-guidance \\
--name=keda-operator \\
--role-name=keda-operator-role \\
--attach-policy-arn=arn:aws:iam::$AWS_ACCOUNT_ID:policy/DynamoDBPolicy \\
--approve
helm repo add kedacore <https://kedacore.github.io/charts>
helm repo update
helm install keda kedacore/keda \\
-n keda-dynamodb-guidance \\
--set serviceAccount.operator.create=false \\
--set serviceAccount.operator.name=keda-operator
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: aws-dynamodb-table-scaledobject
namespace: keda-dynamodb-guidance
spec:
scaleTargetRef:
name: nginx-deployment
minReplicaCount: 2
maxReplicaCount: 100
pollingInterval: 10
cooldownPeriod: 90
triggers:
- type: aws-dynamodb
metadata:
awsRegion: ap-northeast-2
tableName: keda-events
expressionAttributeNames: '{ "#k" : "event_type"}'
keyConditionExpression: "#k = :key"
expressionAttributeValues: '{ ":key" : {"S":"scaling_event"}}'
targetValue: "5"
identityOwner: operator
kubectl apply -f scaledobject.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: keda-dynamodb-guidance
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
serviceAccountName: keda-operator
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
kubectl apply -f deployment.yaml