mirror of
https://github.com/Pavelevich/claw-alexa.git
synced 2026-03-11 21:54:15 +01:00
148 lines
4.8 KiB
Bash
Executable File
148 lines
4.8 KiB
Bash
Executable File
#!/bin/bash
|
|
# OpenClaw Alexa Skill - AWS Lambda Deployment Script
|
|
# Run: ./deploy.sh
|
|
|
|
set -e
|
|
|
|
FUNCTION_NAME="openclaw-alexa"
|
|
REGION="${AWS_REGION:-us-east-1}"
|
|
RUNTIME="nodejs20.x"
|
|
TIMEOUT=30
|
|
MEMORY=128
|
|
|
|
# Colors
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
RED='\033[0;31m'
|
|
NC='\033[0m'
|
|
|
|
echo -e "${GREEN}═══════════════════════════════════════${NC}"
|
|
echo -e "${GREEN} OpenClaw Alexa - Lambda Deployment ${NC}"
|
|
echo -e "${GREEN}═══════════════════════════════════════${NC}"
|
|
|
|
# Check AWS CLI
|
|
if ! command -v aws &> /dev/null; then
|
|
echo -e "${RED}Error: AWS CLI not installed${NC}"
|
|
echo "Install: brew install awscli"
|
|
exit 1
|
|
fi
|
|
|
|
# Check AWS credentials
|
|
if ! aws sts get-caller-identity &> /dev/null; then
|
|
echo -e "${RED}Error: AWS not configured${NC}"
|
|
echo "Run: aws configure"
|
|
exit 1
|
|
fi
|
|
|
|
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
|
|
echo -e "${GREEN}AWS Account:${NC} $ACCOUNT_ID"
|
|
echo -e "${GREEN}Region:${NC} $REGION"
|
|
|
|
# Create deployment package
|
|
echo -e "\n${YELLOW}Creating deployment package...${NC}"
|
|
cd "$(dirname "$0")/lambda"
|
|
zip -r ../lambda.zip index.js
|
|
|
|
cd ..
|
|
|
|
# Check if function exists
|
|
if aws lambda get-function --function-name $FUNCTION_NAME --region $REGION &> /dev/null; then
|
|
echo -e "${YELLOW}Updating existing function...${NC}"
|
|
aws lambda update-function-code \
|
|
--function-name $FUNCTION_NAME \
|
|
--zip-file fileb://lambda.zip \
|
|
--region $REGION
|
|
else
|
|
echo -e "${YELLOW}Creating new Lambda function...${NC}"
|
|
|
|
# Create execution role if needed
|
|
ROLE_NAME="openclaw-alexa-role"
|
|
ROLE_ARN="arn:aws:iam::${ACCOUNT_ID}:role/${ROLE_NAME}"
|
|
|
|
if ! aws iam get-role --role-name $ROLE_NAME &> /dev/null; then
|
|
echo -e "${YELLOW}Creating IAM role...${NC}"
|
|
|
|
cat > trust-policy.json << 'EOF'
|
|
{
|
|
"Version": "2012-10-17",
|
|
"Statement": [
|
|
{
|
|
"Effect": "Allow",
|
|
"Principal": {
|
|
"Service": "lambda.amazonaws.com"
|
|
},
|
|
"Action": "sts:AssumeRole"
|
|
}
|
|
]
|
|
}
|
|
EOF
|
|
|
|
aws iam create-role \
|
|
--role-name $ROLE_NAME \
|
|
--assume-role-policy-document file://trust-policy.json
|
|
|
|
aws iam attach-role-policy \
|
|
--role-name $ROLE_NAME \
|
|
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
|
|
|
|
echo "Waiting for role to propagate..."
|
|
sleep 10
|
|
|
|
rm trust-policy.json
|
|
fi
|
|
|
|
# Create function
|
|
aws lambda create-function \
|
|
--function-name $FUNCTION_NAME \
|
|
--runtime $RUNTIME \
|
|
--role $ROLE_ARN \
|
|
--handler index.handler \
|
|
--zip-file fileb://lambda.zip \
|
|
--timeout $TIMEOUT \
|
|
--memory-size $MEMORY \
|
|
--region $REGION
|
|
fi
|
|
|
|
# Set environment variables (use your own values)
|
|
echo -e "${YELLOW}Setting environment variables...${NC}"
|
|
if [ -z "$OPENCLAW_GATEWAY_URL" ] || [ -z "$OPENCLAW_GATEWAY_PASSWORD" ]; then
|
|
echo -e "${RED}Error: Set OPENCLAW_GATEWAY_URL and OPENCLAW_GATEWAY_PASSWORD first${NC}"
|
|
echo "export OPENCLAW_GATEWAY_URL=https://your-machine.tailnet.ts.net"
|
|
echo "export OPENCLAW_GATEWAY_PASSWORD=your-password"
|
|
exit 1
|
|
fi
|
|
|
|
aws lambda update-function-configuration \
|
|
--function-name $FUNCTION_NAME \
|
|
--environment "Variables={OPENCLAW_GATEWAY_URL=$OPENCLAW_GATEWAY_URL,OPENCLAW_GATEWAY_PASSWORD=$OPENCLAW_GATEWAY_PASSWORD}" \
|
|
--region $REGION
|
|
|
|
# Get function ARN
|
|
LAMBDA_ARN=$(aws lambda get-function --function-name $FUNCTION_NAME --region $REGION --query 'Configuration.FunctionArn' --output text)
|
|
|
|
# Clean up
|
|
rm -f lambda.zip
|
|
|
|
echo -e "\n${GREEN}═══════════════════════════════════════${NC}"
|
|
echo -e "${GREEN} Deployment Complete! ${NC}"
|
|
echo -e "${GREEN}═══════════════════════════════════════${NC}"
|
|
echo -e "\nLambda ARN: ${YELLOW}$LAMBDA_ARN${NC}"
|
|
echo -e "\n${GREEN}Next Steps:${NC}"
|
|
echo "1. Go to: https://developer.amazon.com/alexa/console/ask"
|
|
echo "2. Create New Skill → Name: 'OpenClaw' → Custom → Provision your own"
|
|
echo "3. Copy the Skill ID"
|
|
echo "4. Add Alexa trigger to Lambda:"
|
|
echo " aws lambda add-permission \\"
|
|
echo " --function-name $FUNCTION_NAME \\"
|
|
echo " --statement-id alexa-skill \\"
|
|
echo " --action lambda:InvokeFunction \\"
|
|
echo " --principal alexa-appkit.amazon.com \\"
|
|
echo " --event-source-token <YOUR_SKILL_ID>"
|
|
echo ""
|
|
echo "5. In Alexa Console → JSON Editor → paste contents of:"
|
|
echo " interactionModels/custom/en-US.json"
|
|
echo ""
|
|
echo "6. Endpoint → AWS Lambda ARN → paste: $LAMBDA_ARN"
|
|
echo "7. Save & Build Model"
|
|
echo "8. Test tab → say 'ask claw bot to tell me a joke'"
|