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