├── .gitignore
├── Chapter01
├── lambda-dev-practices-dependency-injection-unit-testing
│ └── iam-operations-with-best-practices
│ │ ├── .gitignore
│ │ ├── pom.xml
│ │ └── src
│ │ ├── main
│ │ └── java
│ │ │ └── tech
│ │ │ └── heartin
│ │ │ └── books
│ │ │ └── serverlesscookbook
│ │ │ ├── MyLambdaHandler.java
│ │ │ ├── domain
│ │ │ ├── IAMOperationRequest.java
│ │ │ ├── IAMOperationResponse.java
│ │ │ └── package-info.java
│ │ │ ├── guice
│ │ │ ├── ApplicationModule.java
│ │ │ └── package-info.java
│ │ │ ├── package-info.java
│ │ │ └── services
│ │ │ ├── IAMService.java
│ │ │ ├── IAMServiceImpl.java
│ │ │ └── package-info.java
│ │ └── test
│ │ └── java
│ │ └── tech
│ │ └── heartin
│ │ └── books
│ │ └── serverlesscookbook
│ │ ├── MyLambdaHandlerTest.java
│ │ └── services
│ │ └── IAMServiceImplTest.java
├── using-aws-sdk-amazon-cloud-formation-aws-cli-with-lambda
│ ├── iam-operations
│ │ ├── .gitignore
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── tech
│ │ │ └── heartin
│ │ │ └── books
│ │ │ └── serverlesscookbook
│ │ │ ├── MyLambdaHandler.java
│ │ │ ├── domain
│ │ │ ├── IAMOperationRequest.java
│ │ │ ├── IAMOperationResponse.java
│ │ │ └── package-info.java
│ │ │ ├── package-info.java
│ │ │ └── services
│ │ │ ├── IAMService.java
│ │ │ └── package-info.java
│ └── resources
│ │ ├── cf-stack-deploy-cli-commands.txt
│ │ ├── cf-template-iam-operations.yml
│ │ └── lambda-iam-operations-s3-upload-cli-commands.txt
├── your-first-aws-lambda
│ └── helloworld-lambda
│ │ ├── .gitignore
│ │ ├── pom.xml
│ │ └── src
│ │ └── main
│ │ └── java
│ │ └── tech
│ │ └── heartin
│ │ └── books
│ │ └── serverlesscookbook
│ │ ├── HelloWorldLambdaHandler.java
│ │ └── package-info.java
├── your-first-lambda-with-aws-cli
│ ├── lambda-handler-with-pojos
│ │ ├── .gitignore
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── tech
│ │ │ └── heartin
│ │ │ └── books
│ │ │ └── serverlesscookbook
│ │ │ ├── MyLambdaHandler.java
│ │ │ ├── domain
│ │ │ ├── HandlerRequest.java
│ │ │ ├── HandlerResponse.java
│ │ │ └── package-info.java
│ │ │ └── package-info.java
│ └── resources
│ │ ├── basic-lambda-permissions.txt
│ │ ├── iam-role-trust-relationship.txt
│ │ └── lambda-with-pojos-cli-commands.txt
└── your-first-lambda-with-cloud-formation
│ └── resources
│ ├── lambda-with-pojos-cf-stack-cli-commands.txt
│ ├── lambda-with-pojos-cf-template.yml
│ └── lambda-with-pojos-s3-upload-cli-commands.txt
├── Chapter02
├── api-with-lambda-proxy-integration
│ ├── lambda-for-proxy-integration
│ │ ├── .gitignore
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── tech
│ │ │ └── heartin
│ │ │ └── books
│ │ │ └── serverlesscookbook
│ │ │ ├── ProxyStreamHandlerLambda.java
│ │ │ └── package-info.java
│ └── resources
│ │ ├── api-for-lambda-proxy-integration-cf-stack-cli-commands.txt
│ │ ├── api-for-lambda-proxy-integration-cf-template.yml
│ │ ├── api-for-lambda-proxy-integration-cli-commands.txt
│ │ ├── lambda-for-proxy-integration-cf-stack-cli-commands.txt
│ │ ├── lambda-for-proxy-integration-cf-template.yml
│ │ └── lambda-for-proxy-integration-s3-upload-cli-commands.txt
├── building-and-testing-your-first-post-api-method
│ └── resources
│ │ ├── your-first-post-api-method-cf-stack-cli-commands.txt
│ │ ├── your-first-post-api-method-cf-template.yml
│ │ └── your-first-post-api-method-cli-commands.txt
├── mapping-requests-and-responses-using-mapping-templates
│ └── resources
│ │ ├── api-with-mapping-templates-cf-stack-cli-commands.txt
│ │ ├── api-with-mapping-templates-cf-template.yml
│ │ └── api-with-mapping-templates-cli-commands.txt
├── validating-input-and-output-with-models
│ └── resources
│ │ ├── validating-payloads-cf-stack-cli-commands.txt
│ │ ├── validating-payloads-cf-template.yml
│ │ └── validating-payloads-cli-commands.txt
├── your-first-api-using-aws-cli
│ └── resources
│ │ ├── alternative_solutions
│ │ ├── cli-commands-with-input-json.txt
│ │ ├── put-integration-cli-input.json
│ │ └── put-integration-response-cli-input.json
│ │ └── your-first-api-using-aws-cli.txt
├── your-first-api-using-cloud-formation
│ └── resources
│ │ ├── your-first-api-using-cf-create-stack-cli-commands.txt
│ │ └── your-first-api-using-cf.yml
└── your-first-api-with-lambda-integration
│ ├── lambda-for-api-gateway
│ ├── .gitignore
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ └── tech
│ │ └── heartin
│ │ └── books
│ │ └── serverlesscookbook
│ │ ├── MyLambdaHandler.java
│ │ ├── domain
│ │ ├── HandlerRequest.java
│ │ ├── HandlerResponse.java
│ │ └── package-info.java
│ │ └── package-info.java
│ └── resources
│ ├── api-gateway-for-lambda-integration-cf-stack-cli-commands.txt
│ ├── api-gateway-for-lambda-integration-cf-template.yml
│ ├── api-gateway-for-lambda-integration-cli-commands.txt
│ ├── lambda-for-api-gateway-cf-stack-cli-commands.txt
│ ├── lambda-for-api-gateway-cf-template.yml
│ └── lambda-for-api-gateway-s3-upload-cli-commands.txt
├── Chapter03
├── adding-data-items-from-lambda
│ ├── lambda-dynamodb-put-item
│ │ ├── .gitignore
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── tech
│ │ │ └── heartin
│ │ │ └── books
│ │ │ └── serverlesscookbook
│ │ │ ├── MyLambdaHandler.java
│ │ │ ├── domain
│ │ │ ├── Request.java
│ │ │ ├── Response.java
│ │ │ └── package-info.java
│ │ │ ├── package-info.java
│ │ │ └── services
│ │ │ ├── DynamoDBService.java
│ │ │ ├── DynamoDBServiceImpl1.java
│ │ │ ├── DynamoDBServiceImpl2.java
│ │ │ └── package-info.java
│ └── resources
│ │ ├── lambda-dynamodb-put-item-cf-template.yml
│ │ └── lambda-dynamodb-put-item-cli-commands.txt
├── creating-tables-from-lambda
│ ├── lambda-dynamodb-create-table
│ │ ├── .gitignore
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── tech
│ │ │ └── heartin
│ │ │ └── books
│ │ │ └── serverlesscookbook
│ │ │ ├── MyLambdaHandler.java
│ │ │ ├── domain
│ │ │ ├── Request.java
│ │ │ ├── Response.java
│ │ │ └── package-info.java
│ │ │ ├── package-info.java
│ │ │ └── services
│ │ │ ├── DynamoDBService.java
│ │ │ ├── DynamoDBServiceImpl1.java
│ │ │ ├── DynamoDBServiceImpl2.java
│ │ │ └── package-info.java
│ └── resources
│ │ ├── lambda-dynamodb-create-table-cf-template.yml
│ │ └── lambda-dynamodb-create-table-cli-commands.txt
├── reading-data-items-from-lambda
│ ├── lambda-dynamodb-read-item
│ │ ├── .gitignore
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── tech
│ │ │ └── heartin
│ │ │ └── books
│ │ │ └── serverlesscookbook
│ │ │ ├── MyLambdaHandler.java
│ │ │ ├── domain
│ │ │ ├── Request.java
│ │ │ ├── Response.java
│ │ │ └── package-info.java
│ │ │ ├── package-info.java
│ │ │ └── services
│ │ │ ├── DynamoDBService.java
│ │ │ ├── DynamoDBServiceImpl1.java
│ │ │ ├── DynamoDBServiceImpl2.java
│ │ │ └── package-info.java
│ └── resources
│ │ ├── lambda-dynamodb-read-item-cf-template.yml
│ │ └── lambda-dynamodb-read-item-cli-commands.txt
├── working-with-data-from-cli
│ └── resources
│ │ └── working-with-data-in-dynamodb-cli-commands.txt
└── your-first-dynamodb-table
│ └── resources
│ ├── cf-stack-deploy-cli-commands.txt
│ ├── your-first-dynamodb-table-cf-template-updated.yml
│ ├── your-first-dynamodb-table-cf-template.yml
│ └── your-first-dynamodb-table-cli-commands.txt
├── Chapter04
├── cognito-client-side-authentication-flow
│ └── resources
│ │ ├── cf-stack-deploy-cli-commands.txt
│ │ ├── cognito-client-side-authentication-client-cf-template.yml
│ │ └── cognito-client-side-authentication-flow-cli-commands.txt
├── cognito-server-side-authentication-flow
│ └── resources
│ │ ├── cf-stack-deploy-cli-commands.txt
│ │ ├── cognito-server-side-authentication-client-cf-template.yml
│ │ └── cognito-server-side-authentication-flow-cli-commands.txt
├── creating-a-cognito-user-pool
│ └── resources
│ │ ├── cf-stack-deploy-cli-commands.txt
│ │ ├── cognito-user-pool-cf-template.yml
│ │ ├── congnito-user-pool-cli-commands.txt
│ │ └── create-user-pool-cli-input.json
├── integrating-cognito-with-api-gateway
│ └── resources
│ │ ├── cf-stack-deploy-cli-commands.txt
│ │ ├── integrating-cognito-with-api-gateway-cf-template.yml
│ │ └── integrating-cognito-with-api-gateway-cli-commands.txt
├── user-sign-up-flow-with-cognito
│ └── resources
│ │ ├── user-sign-up-flow-with-admin-confirmation-cli-commands.txt
│ │ └── user-sign-up-flow-with-self-confirmation-cli-commands.txt
├── user-sign-up-with-sms-and-mfa-verification
│ └── resources
│ │ ├── assume-role-trust-relationship-policy-document.txt
│ │ ├── cf-stack-deploy-cli-commands.txt
│ │ ├── congnito-user-and-client-cli-commands.txt
│ │ ├── create-user-pool-and-client-cf-template.yml
│ │ ├── create-user-pool-cli-input.json
│ │ ├── creating-role-cli-commands.txt
│ │ ├── sns-publish-policy.txt
│ │ ├── user-sign-up-with-sms-and-mfa-verification-cli-commands.txt
│ │ └── user-sign-up-with-sms-only-verification-cli-commands.txt
└── working-with-groups
│ └── resources
│ └── working-with-groups-cli-commands.txt
├── Chapter05
├── custom-domain-with-cloudfront
│ └── resources
│ │ ├── add-route-53-record-sets.yml
│ │ ├── cf-stack-deploy-cli-commands.txt
│ │ ├── change-resource-record-sets.json
│ │ ├── create-cloud-front-distribution-with-domain.yml
│ │ ├── create-cloud-front-parameters.json
│ │ ├── custom-domain-with-cloud-front.txt
│ │ ├── distr-config-disable.json
│ │ └── distribution-config.json
├── registering-domain-name-with-route53
│ └── resources
│ │ ├── contact.json
│ │ └── registering-domain-with-route53.txt
├── s3-static-website-with-custom-domain
│ └── resources
│ │ ├── cf-stack-deploy-cli-commands.txt
│ │ ├── change-resource-record-sets.json
│ │ ├── error.html
│ │ ├── index.html
│ │ ├── s3-static-website-cli-commands.txt
│ │ ├── s3-static-website-with-custom-domain-cf-template.yml
│ │ ├── s3-website-configuration.json
│ │ ├── s3-website-policy.json
│ │ └── s3-website-redirect-configuration.json
├── setting-up-cloudfront-for-s3-bucket
│ └── resources
│ │ ├── cf-stack-deploy-cli-commands.txt
│ │ ├── create-cloud-front-distribution.yml
│ │ └── setting-up-cloud-front-for-s3-bucket.txt
├── setting-up-s3-static-website
│ └── resources
│ │ ├── cf-stack-deploy-cli-commands.txt
│ │ ├── error.html
│ │ ├── index.html
│ │ ├── s3-static-website-cf-template.yml
│ │ ├── s3-static-website-cli-commands.txt
│ │ ├── s3-website-configuration.json
│ │ └── s3-website-policy.json
├── using-custom-ssl-certificate-with-cloudfront
│ └── resources
│ │ ├── add-route-53-record-sets.yml
│ │ ├── cf-stack-deploy-cli-commands.txt
│ │ ├── create-cloud-front-distribution-with-ssl-import-cert.yml
│ │ ├── create-cloud-front-distribution-with-ssl.yml
│ │ ├── create-cloud-front-parameters.json
│ │ ├── distribution-config-update.json
│ │ └── using-custom-ssl-certificate-with-cloudfront.txt
└── using-domains-with-other-registrars
│ └── resources
│ ├── cf-stack-deploy-cli-commands.txt
│ ├── create-hosted-zone.yml
│ └── using-domains-with-other-registrars.txt
├── Chapter06
├── creating-sqs-queue-and-sending-message-with-sdk
│ ├── lambda-sqs-sdk-create-send
│ │ ├── .gitignore
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── tech
│ │ │ └── heartin
│ │ │ └── books
│ │ │ └── serverlesscookbook
│ │ │ ├── LambdaSqsSdkCreateSendHandler.java
│ │ │ ├── domain
│ │ │ ├── Request.java
│ │ │ ├── Response.java
│ │ │ └── package-info.java
│ │ │ ├── package-info.java
│ │ │ └── services
│ │ │ ├── SqsService.java
│ │ │ ├── SqsServiceImpl.java
│ │ │ └── package-info.java
│ └── resources
│ │ ├── basic-lambda-permissions.txt
│ │ ├── iam-role-trust-relationship.txt
│ │ ├── lambda-sqs-create-send-permissions.txt
│ │ ├── lambda-sqs-sdk-create-write-cli-commands.txt
│ │ └── payload.json
├── invoking-lambda-with-sns-event
│ ├── lambda-invoke-sns-event
│ │ ├── .gitignore
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── tech
│ │ │ └── heartin
│ │ │ └── books
│ │ │ └── serverlesscookbook
│ │ │ ├── LambdaSnsEventHandler.java
│ │ │ ├── package-info.java
│ │ │ └── services
│ │ │ ├── SnsService.java
│ │ │ ├── SnsServiceImpl.java
│ │ │ └── package-info.java
│ └── resources
│ │ ├── basic-lambda-permissions.txt
│ │ ├── iam-role-trust-relationship.txt
│ │ ├── lambda-invoke-sns-event-cli-commands.txt
│ │ └── lambda-invoke-sns-event-permissions.txt
├── invoking-lambda-with-sqs-event
│ ├── lambda-invoke-sqs-event
│ │ ├── .gitignore
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── tech
│ │ │ └── heartin
│ │ │ └── books
│ │ │ └── serverlesscookbook
│ │ │ ├── LambdaSqsEventHandler.java
│ │ │ ├── package-info.java
│ │ │ └── services
│ │ │ ├── SqsService.java
│ │ │ ├── SqsServiceImpl.java
│ │ │ └── package-info.java
│ └── resources
│ │ ├── basic-lambda-permissions.txt
│ │ ├── iam-role-trust-relationship.txt
│ │ ├── lambda-invoke-sqs-event-cli-commands.txt
│ │ └── lambda-invoke-sqs-event-permissions.txt
├── publishing-to-sns-topic-with-sdk
│ ├── lambda-sns-publish-with-sdk
│ │ ├── .gitignore
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── tech
│ │ │ └── heartin
│ │ │ └── books
│ │ │ └── serverlesscookbook
│ │ │ ├── LambdaSnsPublishHandler.java
│ │ │ ├── domain
│ │ │ ├── Request.java
│ │ │ └── package-info.java
│ │ │ └── package-info.java
│ └── resources
│ │ ├── basic-lambda-permissions.txt
│ │ ├── iam-role-trust-relationship.txt
│ │ ├── lambda-sns-publish-cli-commands.txt
│ │ ├── lambda-sns-publish-permissions.txt
│ │ └── payload.json
├── receiving-and-sending-sqs-messages-in-batch-with-sdk
│ ├── lambda-sqs-sdk-receive-send-batch
│ │ ├── .gitignore
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── tech
│ │ │ └── heartin
│ │ │ └── books
│ │ │ └── serverlesscookbook
│ │ │ ├── LambdaSqsSdkReceiveSendBatchHandler.java
│ │ │ ├── domain
│ │ │ ├── Request.java
│ │ │ ├── Response.java
│ │ │ └── package-info.java
│ │ │ ├── package-info.java
│ │ │ └── services
│ │ │ ├── SqsService.java
│ │ │ ├── SqsServiceImpl.java
│ │ │ └── package-info.java
│ └── resources
│ │ ├── basic-lambda-permissions.txt
│ │ ├── iam-role-trust-relationship.txt
│ │ ├── lambda-sqs-receive-send-batch-permissions.txt
│ │ ├── lambda-sqs-receive-send-batch-write-cli-commands.txt
│ │ └── payload.json
├── your-first-sns-topic
│ └── resources
│ │ ├── cf-stack-deploy-cli-commands.txt
│ │ ├── sns-topic-cf-template.yml
│ │ └── your-first-sns-topic-cli-commands.txt
└── your-first-sqs-queue
│ └── resources
│ ├── cf-stack-deploy-cli-commands.txt
│ ├── sqs-queue-cf-template.yml
│ └── your-first-sqs-queue-cli-commands.txt
├── Chapter07
├── building-and-testing-alexa-skill
│ ├── lambda-alexa-simple-intro
│ │ ├── .gitignore
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── tech
│ │ │ └── heartin
│ │ │ └── books
│ │ │ └── serverlesscookbook
│ │ │ ├── CancelandStopIntentHandler.java
│ │ │ ├── FallbackIntentHandler.java
│ │ │ ├── HelpIntentHandler.java
│ │ │ ├── LaunchRequestHandler.java
│ │ │ ├── SelfIntroIntentHandler.java
│ │ │ ├── SelfIntroStreamHandler.java
│ │ │ ├── SessionEndedRequestHandler.java
│ │ │ └── package-info.java
│ └── resources
│ │ ├── alexa-skill-cli-commands.txt
│ │ ├── basic-lambda-permissions.txt
│ │ ├── en-IN.json
│ │ ├── en-US.json
│ │ ├── iam-role-trust-relationship.txt
│ │ ├── lambda-alexa-simple-intro-cli-commands.txt
│ │ └── skill.json
├── invoking-lambda-with-kinesis-event
│ ├── lambda-invoke-kinesis-event
│ │ ├── .gitignore
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── tech
│ │ │ └── heartin
│ │ │ └── books
│ │ │ └── serverlesscookbook
│ │ │ ├── LambdaKinesisEventHandler.java
│ │ │ └── package-info.java
│ └── resources
│ │ ├── basic-lambda-permissions.txt
│ │ ├── iam-role-trust-relationship.txt
│ │ ├── lambda-invoke-kinesis-event-cli-commands.txt
│ │ └── lambda-invoke-kinesis-event-permissions.txt
├── using-amazon-ml-for-binary-classification
│ └── resources
│ │ ├── create-data-source-from-s3-cli-input.json
│ │ └── ml-binary-classification.txt
├── writing-data-into-kinesis-stream-with-sdk
│ ├── lambda-kinesis-sdk-write
│ │ ├── .gitignore
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── tech
│ │ │ └── heartin
│ │ │ └── books
│ │ │ └── serverlesscookbook
│ │ │ ├── LambdaKinesisSdkWriteHandler.java
│ │ │ ├── domain
│ │ │ ├── Request.java
│ │ │ ├── Response.java
│ │ │ └── package-info.java
│ │ │ ├── package-info.java
│ │ │ └── services
│ │ │ ├── KinesisService.java
│ │ │ ├── KinesisServiceImpl.java
│ │ │ └── package-info.java
│ └── resources
│ │ ├── basic-lambda-permissions.txt
│ │ ├── iam-role-trust-relationship.txt
│ │ ├── lambda-kinesis-producer-permissions.txt
│ │ ├── lambda-kinesis-sdk-write-cli-commands.txt
│ │ └── payload.json
└── your-first-kinesis-stream
│ └── resources
│ ├── cf-stack-deploy-cli-commands.txt
│ ├── kinesis-stream-cf-template.yml
│ └── kinesis-stream-cli-commands.txt
├── Chapter08
├── cloudwatch-alarms-with-dimensions
│ └── resources
│ │ └── cloudwatch-alarms-with-dimensions.txt
├── filtering-log-events
│ └── resources
│ │ ├── filtering-log-events-cli-commands.txt
│ │ └── metric-transformations.json
├── setting-up-cloudwatch-alarms
│ └── resources
│ │ └── setting-up-cloud-watch-alarm-cli-commands.txt
└── your-first-custom-metric
│ └── resources
│ └── your-first-custom-metric-cli-commands.txt
├── Chapter09
├── cognito-operations-with-javascript-sdk
│ └── resources
│ │ ├── cognito-operations-with-javascript-sdk-cli-commands.txt
│ │ ├── create-user-pool-cli-input.json
│ │ └── s3-website-policy.json
├── creating-ssl-tls-certificates-with-acm
│ └── resources
│ │ ├── certificate-validation-with-cname-record.yml
│ │ ├── cf-stack-deploy-cli-commands.txt
│ │ ├── change-resource-record-sets-dns-validation.json
│ │ ├── creating-ssl-tls-certificates-with-acm.txt
│ │ └── creating-ssl-tls-certificates-with-acm.yml
├── enable-cors-for-the-api
│ └── resources
│ │ ├── enable-cors-new-cli-commands.txt
│ │ ├── enable-cors-update-cli-commands.txt
│ │ ├── put-method-integration-get.json
│ │ ├── put-method-integration-response-options.json
│ │ ├── put-method-response-get.json
│ │ ├── put-method-response-options.json
│ │ ├── response-template-get.json
│ │ └── your-first-api-using-cf-cors.yml
└── federated-identity-with-amazon-cognito
│ └── resources
│ ├── error.html
│ ├── federated-identity-with-amazon-cognito.txt
│ ├── iam-role-trust-relationship.txt
│ ├── index.html
│ ├── provider.json
│ ├── role_policy.txt
│ └── roles.json
├── Chapter10
├── your-first-serverless-application-in-azure
│ ├── helloworld-azure-fn
│ │ ├── .gitignore
│ │ ├── host.json
│ │ ├── pom.xml
│ │ └── src
│ │ │ ├── main
│ │ │ └── java
│ │ │ │ └── tech
│ │ │ │ └── heartin
│ │ │ │ └── books
│ │ │ │ └── serverlesscookbook
│ │ │ │ └── Function.java
│ │ │ └── test
│ │ │ └── java
│ │ │ └── tech
│ │ │ └── heartin
│ │ │ └── books
│ │ │ └── serverlesscookbook
│ │ │ ├── FunctionTest.java
│ │ │ └── HttpResponseMessageMock.java
│ └── resources
│ │ └── hello-world-azure-function-cli-commands.txt
├── your-first-serverless-application-in-gcp
│ └── resources
│ │ └── gcp-cli-commands.txt
└── your-first-serverless-application-in-ibm-cloud
│ └── resources
│ ├── hello.js
│ └── ibm-cloud-cli-commands.txt
├── LICENSE
├── README.md
└── serverless-cookbook-parent-aws-java
├── .gitignore
├── README.md
└── pom.xml
/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
26 |
27 | .DS_Store
--------------------------------------------------------------------------------
/Chapter01/lambda-dev-practices-dependency-injection-unit-testing/iam-operations-with-best-practices/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/Chapter01/lambda-dev-practices-dependency-injection-unit-testing/iam-operations-with-best-practices/src/main/java/tech/heartin/books/serverlesscookbook/domain/IAMOperationRequest.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.domain;
2 |
3 | import lombok.Data;
4 |
5 | /**
6 | * Request POJO.
7 | */
8 | @Data
9 | public class IAMOperationRequest {
10 | private String operation;
11 | private String userName;
12 | }
13 |
--------------------------------------------------------------------------------
/Chapter01/lambda-dev-practices-dependency-injection-unit-testing/iam-operations-with-best-practices/src/main/java/tech/heartin/books/serverlesscookbook/domain/IAMOperationResponse.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.domain;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Data;
5 |
6 | /**
7 | * Response POJO.
8 | */
9 | @Data
10 | @AllArgsConstructor
11 | public class IAMOperationResponse {
12 | private String message;
13 | private String errorMessage;
14 | }
15 |
--------------------------------------------------------------------------------
/Chapter01/lambda-dev-practices-dependency-injection-unit-testing/iam-operations-with-best-practices/src/main/java/tech/heartin/books/serverlesscookbook/domain/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Domain objects.
3 | */
4 | package tech.heartin.books.serverlesscookbook.domain;
5 |
--------------------------------------------------------------------------------
/Chapter01/lambda-dev-practices-dependency-injection-unit-testing/iam-operations-with-best-practices/src/main/java/tech/heartin/books/serverlesscookbook/guice/ApplicationModule.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.guice;
2 |
3 | import com.google.inject.AbstractModule;
4 | import tech.heartin.books.serverlesscookbook.services.IAMService;
5 | import tech.heartin.books.serverlesscookbook.services.IAMServiceImpl;
6 |
7 | /**
8 | * Guice configuration class.
9 | */
10 | public class ApplicationModule extends AbstractModule {
11 |
12 | protected final void configure() {
13 | bind(IAMService.class).to(IAMServiceImpl.class);
14 | }
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/Chapter01/lambda-dev-practices-dependency-injection-unit-testing/iam-operations-with-best-practices/src/main/java/tech/heartin/books/serverlesscookbook/guice/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Guice configurations.
3 | */
4 | package tech.heartin.books.serverlesscookbook.guice;
5 |
--------------------------------------------------------------------------------
/Chapter01/lambda-dev-practices-dependency-injection-unit-testing/iam-operations-with-best-practices/src/main/java/tech/heartin/books/serverlesscookbook/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Package for lambdas.
3 | */
4 | package tech.heartin.books.serverlesscookbook;
5 |
--------------------------------------------------------------------------------
/Chapter01/lambda-dev-practices-dependency-injection-unit-testing/iam-operations-with-best-practices/src/main/java/tech/heartin/books/serverlesscookbook/services/IAMService.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.services;
2 |
3 | import tech.heartin.books.serverlesscookbook.domain.IAMOperationResponse;
4 |
5 | /**
6 | * Interface for IAM operations.
7 | */
8 | public interface IAMService {
9 | /**
10 | * Create user.
11 | * @param userName - user name.
12 | * @return IAMOperationResponse
13 | */
14 | IAMOperationResponse createUser(String userName);
15 |
16 | /**
17 | * Check user.
18 | * @param userName - user name.
19 | * @return IAMOperationResponse
20 | */
21 | IAMOperationResponse checkUser(String userName);
22 |
23 | /**
24 | * Delete user.
25 | * @param userName - user name.
26 | * @return IAMOperationResponse
27 | */
28 | IAMOperationResponse deleteUser(String userName);
29 | }
30 |
--------------------------------------------------------------------------------
/Chapter01/lambda-dev-practices-dependency-injection-unit-testing/iam-operations-with-best-practices/src/main/java/tech/heartin/books/serverlesscookbook/services/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Service classes.
3 | */
4 | package tech.heartin.books.serverlesscookbook.services;
5 |
--------------------------------------------------------------------------------
/Chapter01/lambda-dev-practices-dependency-injection-unit-testing/iam-operations-with-best-practices/src/test/java/tech/heartin/books/serverlesscookbook/MyLambdaHandlerTest.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook;
2 |
3 | import org.junit.Test;
4 |
5 | public class MyLambdaHandlerTest {
6 | @Test
7 | public void testDependencies() throws Exception {
8 | MyLambdaHandler testHandler = new MyLambdaHandler();
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Chapter01/using-aws-sdk-amazon-cloud-formation-aws-cli-with-lambda/iam-operations/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/Chapter01/using-aws-sdk-amazon-cloud-formation-aws-cli-with-lambda/iam-operations/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | tech.heartin.books.serverless-cookbook
8 | iam-operations
9 | 0.0.1-SNAPSHOT
10 |
11 |
12 | tech.heartin.books.serverlesscookbook
13 | serverless-cookbook-parent-aws-java
14 | 0.0.1-SNAPSHOT
15 |
16 |
17 |
18 |
19 | com.amazonaws
20 | aws-lambda-java-core
21 | ${aws.lambda.java.core.version}
22 |
23 |
24 |
25 | com.amazonaws
26 | aws-java-sdk-iam
27 | ${aws.sdk.version}
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/Chapter01/using-aws-sdk-amazon-cloud-formation-aws-cli-with-lambda/iam-operations/src/main/java/tech/heartin/books/serverlesscookbook/MyLambdaHandler.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook;
2 |
3 | import com.amazonaws.services.lambda.runtime.Context;
4 | import com.amazonaws.services.lambda.runtime.RequestHandler;
5 | import tech.heartin.books.serverlesscookbook.domain.IAMOperationRequest;
6 | import tech.heartin.books.serverlesscookbook.domain.IAMOperationResponse;
7 | import tech.heartin.books.serverlesscookbook.services.IAMService;
8 |
9 | /**
10 | * RequestHandler implementation.
11 | */
12 | public final class MyLambdaHandler implements RequestHandler {
13 |
14 | private IAMService service;
15 |
16 | public MyLambdaHandler() {
17 | service = new IAMService();
18 | }
19 |
20 |
21 | /**
22 | * Handle request.
23 | *
24 | * @param request - input to lambda handler
25 | * @param context - context object
26 | * @return greeting text
27 | */
28 | public IAMOperationResponse handleRequest(final IAMOperationRequest request, final Context context) {
29 | context.getLogger().log("Requested operation = " + request.getOperation()
30 | + ". User name = " + request.getUserName());
31 |
32 | switch (request.getOperation()) {
33 | case "CREATE" :
34 | return this.service.createUser(request.getUserName());
35 | case "CHECK" :
36 | return this.service.checkUser(request.getUserName());
37 | case "DELETE" :
38 | return this.service.deleteUser(request.getUserName());
39 |
40 | default:
41 | return new IAMOperationResponse(null,
42 | "Invalid operation " + request.getOperation()
43 | + ". Allowed: CREATE, CHECK, DELETE.");
44 |
45 | }
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/Chapter01/using-aws-sdk-amazon-cloud-formation-aws-cli-with-lambda/iam-operations/src/main/java/tech/heartin/books/serverlesscookbook/domain/IAMOperationRequest.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.domain;
2 |
3 | import lombok.Data;
4 |
5 | /**
6 | * Request POJO.
7 | */
8 | @Data
9 | public class IAMOperationRequest {
10 | private String operation;
11 | private String userName;
12 | }
13 |
--------------------------------------------------------------------------------
/Chapter01/using-aws-sdk-amazon-cloud-formation-aws-cli-with-lambda/iam-operations/src/main/java/tech/heartin/books/serverlesscookbook/domain/IAMOperationResponse.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.domain;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Data;
5 |
6 | /**
7 | * Response POJO.
8 | */
9 | @Data
10 | @AllArgsConstructor
11 | public class IAMOperationResponse {
12 | private String message;
13 | private String errorMessage;
14 | }
15 |
--------------------------------------------------------------------------------
/Chapter01/using-aws-sdk-amazon-cloud-formation-aws-cli-with-lambda/iam-operations/src/main/java/tech/heartin/books/serverlesscookbook/domain/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Domain objects.
3 | */
4 | package tech.heartin.books.serverlesscookbook.domain;
5 |
--------------------------------------------------------------------------------
/Chapter01/using-aws-sdk-amazon-cloud-formation-aws-cli-with-lambda/iam-operations/src/main/java/tech/heartin/books/serverlesscookbook/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Package for lambdas.
3 | */
4 | package tech.heartin.books.serverlesscookbook;
5 |
--------------------------------------------------------------------------------
/Chapter01/using-aws-sdk-amazon-cloud-formation-aws-cli-with-lambda/iam-operations/src/main/java/tech/heartin/books/serverlesscookbook/services/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Service classes.
3 | */
4 | package tech.heartin.books.serverlesscookbook.services;
5 |
--------------------------------------------------------------------------------
/Chapter01/using-aws-sdk-amazon-cloud-formation-aws-cli-with-lambda/resources/cf-stack-deploy-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws cloudformation create-stack \
2 | --stack-name myteststack \
3 | --template-body file://cf-template-iam-operations.yml \
4 | --region us-east-1 \
5 | --profile admin
6 |
7 | aws cloudformation describe-stacks \
8 | --stack-name myteststack \
9 | --region us-east-1 \
10 | --profile admin
11 |
12 | aws cloudformation delete-stack \
13 | --stack-name myteststack \
14 | --region us-east-1 \
15 | --profile admin
--------------------------------------------------------------------------------
/Chapter01/using-aws-sdk-amazon-cloud-formation-aws-cli-with-lambda/resources/lambda-iam-operations-s3-upload-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws s3 cp \
2 | target/serverless-cookbook-iam-operations-0.0.1-SNAPSHOT.jar \
3 | s3://serverless-cookbook/iam-operations-0.0.1-SNAPSHOT.jar \
4 | --profile admin
5 |
--------------------------------------------------------------------------------
/Chapter01/your-first-aws-lambda/helloworld-lambda/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/Chapter01/your-first-aws-lambda/helloworld-lambda/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | tech.heartin.books.serverless-cookbook
8 | helloworld-lambda
9 | 0.0.1-SNAPSHOT
10 |
11 |
12 | tech.heartin.books.serverlesscookbook
13 | serverless-cookbook-parent-aws-java
14 | 0.0.1-SNAPSHOT
15 |
16 |
17 |
18 |
19 | com.amazonaws
20 | aws-lambda-java-core
21 | ${aws.lambda.java.core.version}
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/Chapter01/your-first-aws-lambda/helloworld-lambda/src/main/java/tech/heartin/books/serverlesscookbook/HelloWorldLambdaHandler.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook;
2 |
3 | import com.amazonaws.services.lambda.runtime.Context;
4 | import com.amazonaws.services.lambda.runtime.RequestHandler;
5 |
6 | /**
7 | * RequestHandler implementation.
8 | */
9 | public final class HelloWorldLambdaHandler implements RequestHandler {
10 |
11 | /**
12 | * Handle the request.
13 | *
14 | * @param s - input to lambda handler
15 | * @param context - context object
16 | * @return greeting text
17 | */
18 | public String handleRequest(final String s, final Context context) {
19 | context.getLogger().log("input: " + s + "\n");
20 | String greeting = "Hello " + s;
21 | return greeting;
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Chapter01/your-first-aws-lambda/helloworld-lambda/src/main/java/tech/heartin/books/serverlesscookbook/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Package for lambdas.
3 | */
4 | package tech.heartin.books.serverlesscookbook;
5 |
--------------------------------------------------------------------------------
/Chapter01/your-first-lambda-with-aws-cli/lambda-handler-with-pojos/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/Chapter01/your-first-lambda-with-aws-cli/lambda-handler-with-pojos/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | tech.heartin.books.serverless-cookbook
8 | lambda-handler-with-pojos
9 | 0.0.1-SNAPSHOT
10 |
11 |
12 | tech.heartin.books.serverlesscookbook
13 | serverless-cookbook-parent-aws-java
14 | 0.0.1-SNAPSHOT
15 |
16 |
17 |
18 |
19 | com.amazonaws
20 | aws-lambda-java-core
21 | ${aws.lambda.java.core.version}
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/Chapter01/your-first-lambda-with-aws-cli/lambda-handler-with-pojos/src/main/java/tech/heartin/books/serverlesscookbook/MyLambdaHandler.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook;
2 |
3 | import com.amazonaws.services.lambda.runtime.Context;
4 | import com.amazonaws.services.lambda.runtime.RequestHandler;
5 | import tech.heartin.books.serverlesscookbook.domain.HandlerRequest;
6 | import tech.heartin.books.serverlesscookbook.domain.HandlerResponse;
7 |
8 | /**
9 | * RequestHandler implementation.
10 | */
11 | public final class MyLambdaHandler implements RequestHandler {
12 |
13 | /**
14 | * Handle request.
15 | *
16 | * @param request - input to lambda handler
17 | * @param context - context object
18 | * @return greeting text
19 | */
20 | public HandlerResponse handleRequest(final HandlerRequest request,
21 | final Context context) {
22 | context.getLogger().log("Hello " + request.getName());
23 |
24 | return new HandlerResponse("Hello " + request.getName());
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Chapter01/your-first-lambda-with-aws-cli/lambda-handler-with-pojos/src/main/java/tech/heartin/books/serverlesscookbook/domain/HandlerRequest.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.domain;
2 |
3 | import lombok.Data;
4 |
5 | /**
6 | * Request POJO.
7 | */
8 | @Data
9 | public class HandlerRequest {
10 | private String name;
11 | }
12 |
--------------------------------------------------------------------------------
/Chapter01/your-first-lambda-with-aws-cli/lambda-handler-with-pojos/src/main/java/tech/heartin/books/serverlesscookbook/domain/HandlerResponse.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.domain;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Data;
5 |
6 | /**
7 | * Response POJO.
8 | */
9 | @Data
10 | @AllArgsConstructor
11 | public class HandlerResponse {
12 | private String message;
13 | }
14 |
--------------------------------------------------------------------------------
/Chapter01/your-first-lambda-with-aws-cli/lambda-handler-with-pojos/src/main/java/tech/heartin/books/serverlesscookbook/domain/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Domain objects.
3 | */
4 | package tech.heartin.books.serverlesscookbook.domain;
5 |
--------------------------------------------------------------------------------
/Chapter01/your-first-lambda-with-aws-cli/lambda-handler-with-pojos/src/main/java/tech/heartin/books/serverlesscookbook/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Package for lambdas.
3 | */
4 | package tech.heartin.books.serverlesscookbook;
5 |
--------------------------------------------------------------------------------
/Chapter01/your-first-lambda-with-aws-cli/resources/basic-lambda-permissions.txt:
--------------------------------------------------------------------------------
1 | {
2 | "Version":"2012-10-17",
3 | "Statement":[
4 | {
5 | "Effect":"Allow",
6 | "Action":[
7 | "logs:CreateLogGroup",
8 | "logs:CreateLogStream",
9 | "logs:PutLogEvents"
10 | ],
11 | "Resource":[
12 | "arn:aws:logs:*:*:*"
13 | ]
14 | }
15 | ]
16 | }
--------------------------------------------------------------------------------
/Chapter01/your-first-lambda-with-aws-cli/resources/iam-role-trust-relationship.txt:
--------------------------------------------------------------------------------
1 | {
2 | "Version": "2012-10-17",
3 | "Statement": [
4 | {
5 | "Effect": "Allow",
6 | "Principal": {
7 | "Service": "lambda.amazonaws.com"
8 | },
9 | "Action": "sts:AssumeRole"
10 | }
11 | ]
12 | }
--------------------------------------------------------------------------------
/Chapter01/your-first-lambda-with-cloud-formation/resources/lambda-with-pojos-cf-stack-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws cloudformation create-stack \
2 | --stack-name myteststack \
3 | --template-body file://template-for-hello-world-lambda.yml.yml \
4 | --region us-east-1 \
5 | --profile admin
6 |
7 | aws cloudformation describe-stacks \
8 | --stack-name myteststack \
9 | --region us-east-1 \
10 | --profile admin
11 |
12 | aws cloudformation delete-stack \
13 | --stack-name myteststack \
14 | --region us-east-1 \
15 | --profile admin
--------------------------------------------------------------------------------
/Chapter01/your-first-lambda-with-cloud-formation/resources/lambda-with-pojos-cf-template.yml:
--------------------------------------------------------------------------------
1 | ---
2 | AWSTemplateFormatVersion: '2010-09-09'
3 | Description: Building Lambda with AWS CloudFormation
4 | Resources:
5 | IamRoleLambdaExecution:
6 | Type: AWS::IAM::Role
7 | Properties:
8 | AssumeRolePolicyDocument:
9 | Version: '2012-10-17'
10 | Statement:
11 | - Effect: Allow
12 | Principal:
13 | Service:
14 | - lambda.amazonaws.com
15 | Action:
16 | - sts:AssumeRole
17 | Policies:
18 | - PolicyName: 'lambda-with-cf-policy'
19 | PolicyDocument:
20 | Version: '2012-10-17'
21 | Statement:
22 | - Effect: Allow
23 | Action:
24 | - logs:CreateLogGroup
25 | - logs:CreateLogStream
26 | - logs:PutLogEvents
27 | Resource: arn:aws:logs:*:*:*
28 | Path: "/"
29 | RoleName: "lambda-with-cf-role"
30 | LambdaFunctionWithCF:
31 | Type: AWS::Lambda::Function
32 | Properties:
33 | Code:
34 | S3Bucket: 'serverless-cookbook'
35 | S3Key: lambda-handler-with-pojos-0.0.1-SNAPSHOT.jar
36 | FunctionName: first-lambda-with-cloud-formation
37 | Handler: tech.heartin.books.serverlesscookbook.MyLambdaHandler::handleRequest
38 | MemorySize: 512
39 |
40 | Role:
41 | Fn::GetAtt:
42 | - IamRoleLambdaExecution
43 | - Arn
44 |
45 | Runtime: java8
46 | Timeout: 15
47 | DependsOn:
48 | - IamRoleLambdaExecution
49 |
--------------------------------------------------------------------------------
/Chapter01/your-first-lambda-with-cloud-formation/resources/lambda-with-pojos-s3-upload-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws s3 cp \
2 | original-serverless-cookbook-lambda-handler-with-pojos-0.0.1-SNAPSHOT.jar \
3 | s3://serverless-cookbook/lambda-handler-with-pojos-0.0.1-SNAPSHOT.jar \
4 | --profile admin
--------------------------------------------------------------------------------
/Chapter02/api-with-lambda-proxy-integration/lambda-for-proxy-integration/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/Chapter02/api-with-lambda-proxy-integration/lambda-for-proxy-integration/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | tech.heartin.books.serverlesscookbook
8 | lambda-for-proxy-integration
9 | 0.0.1-SNAPSHOT
10 |
11 |
12 | tech.heartin.books.serverlesscookbook
13 | serverless-cookbook-parent-aws-java
14 | 0.0.1-SNAPSHOT
15 |
16 |
17 |
18 |
19 | com.amazonaws
20 | aws-lambda-java-core
21 | ${aws.lambda.java.core.version}
22 |
23 |
24 |
25 | com.googlecode.json-simple
26 | json-simple
27 | 1.1.1
28 |
29 |
30 |
31 |
32 | com.fasterxml.jackson.core
33 | jackson-core
34 | 2.9.6
35 |
36 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/Chapter02/api-with-lambda-proxy-integration/lambda-for-proxy-integration/src/main/java/tech/heartin/books/serverlesscookbook/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Package for lambdas.
3 | */
4 | package tech.heartin.books.serverless;
5 |
--------------------------------------------------------------------------------
/Chapter02/api-with-lambda-proxy-integration/resources/api-for-lambda-proxy-integration-cf-stack-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws cloudformation create-stack \
2 | --stack-name myapistack-1 \
3 | --template-body file://api-for-lambda-proxy-integration-cf-template.yml \
4 | --region us-east-1 \
5 | --profile admin
6 |
7 | aws cloudformation describe-stacks \
8 | --stack-name myapistack-1 \
9 | --region us-east-1 \
10 | --profile admin
11 |
12 | aws cloudformation delete-stack \
13 | --stack-name myapistack-1 \
14 | --region us-east-1 \
15 | --profile admin
16 |
--------------------------------------------------------------------------------
/Chapter02/api-with-lambda-proxy-integration/resources/lambda-for-proxy-integration-cf-stack-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws cloudformation create-stack \
2 | --stack-name mylambdaproxystack-1 \
3 | --template-body file://lambda-for-proxy-integration-cf-template.yml \
4 | --capabilities CAPABILITY_NAMED_IAM \
5 | --region us-east-1 \
6 | --profile admin
7 |
8 | aws cloudformation describe-stacks \
9 | --stack-name mylambdaproxystack-1 \
10 | --region us-east-1 \
11 | --profile admin
12 |
13 | aws cloudformation delete-stack \
14 | --stack-name mylambdaproxystack-1 \
15 | --region us-east-1 \
16 | --profile admin
17 |
--------------------------------------------------------------------------------
/Chapter02/api-with-lambda-proxy-integration/resources/lambda-for-proxy-integration-cf-template.yml:
--------------------------------------------------------------------------------
1 | ---
2 | AWSTemplateFormatVersion: '2010-09-09'
3 | Description: Building Lambda for Proxy Integration
4 | Resources:
5 | IamRoleLambdaExecution:
6 | Type: AWS::IAM::Role
7 | Properties:
8 | AssumeRolePolicyDocument:
9 | Version: '2012-10-17'
10 | Statement:
11 | - Effect: Allow
12 | Principal:
13 | Service:
14 | - lambda.amazonaws.com
15 | Action:
16 | - sts:AssumeRole
17 | Policies:
18 | - PolicyName: 'lambda-for-proxy-integration-policy'
19 | PolicyDocument:
20 | Version: '2012-10-17'
21 | Statement:
22 | - Effect: Allow
23 | Action:
24 | - logs:CreateLogGroup
25 | - logs:CreateLogStream
26 | - logs:PutLogEvents
27 | Resource: arn:aws:logs:*:*:*
28 | Path: "/"
29 | RoleName: "lambda-for-proxy-integration-role"
30 | MyLambdaFunction:
31 | Type: AWS::Lambda::Function
32 | Properties:
33 | Code:
34 | S3Bucket: 'serverless-cookbook'
35 | S3Key: lambda-for-proxy-integration-0.0.1-SNAPSHOT.jar
36 | FunctionName: 'lambda-for-proxy-integration'
37 | Handler: tech.heartin.books.serverlesscookbook.ProxyStreamHandlerLambda::handleRequest
38 | MemorySize: 512
39 | Role:
40 | Fn::GetAtt:
41 | - IamRoleLambdaExecution
42 | - Arn
43 | Runtime: java8
44 | Timeout: 15
45 | DependsOn:
46 | - IamRoleLambdaExecution
47 | Outputs:
48 | LambdaOutput:
49 | Description: 'Lambda For Proxy Integration'
50 | Value: !Ref MyLambdaFunction
51 | Export:
52 | Name: LambdaForProxyIntegration
53 |
--------------------------------------------------------------------------------
/Chapter02/api-with-lambda-proxy-integration/resources/lambda-for-proxy-integration-s3-upload-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws s3 cp \
2 | target/lambda-for-proxy-integration-0.0.1-SNAPSHOT.jar \
3 | s3://serverless-cookbook/lambda-for-proxy-integration-0.0.1-SNAPSHOT.jar \
4 | --profile admin
5 |
--------------------------------------------------------------------------------
/Chapter02/building-and-testing-your-first-post-api-method/resources/your-first-post-api-method-cf-stack-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws cloudformation create-stack \
2 | --stack-name myapistack-1 \
3 | --template-body file://your-first-post-api-method-cf-template.yml \
4 | --region us-east-1 \
5 | --profile admin
6 |
7 | aws cloudformation describe-stacks \
8 | --stack-name mylambdastack-1 \
9 | --region us-east-1 \
10 | --profile admin
11 |
12 | aws cloudformation delete-stack \
13 | --stack-name mylambdastack-1 \
14 | --region us-east-1 \
15 | --profile admin
16 |
--------------------------------------------------------------------------------
/Chapter02/mapping-requests-and-responses-using-mapping-templates/resources/api-with-mapping-templates-cf-stack-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws cloudformation create-stack \
2 | --stack-name myapistack-1 \
3 | --template-body file://api-with-mapping-templates-cf-template.yml \
4 | --region us-east-1 \
5 | --profile admin
6 |
7 | aws cloudformation describe-stacks \
8 | --stack-name myapistack-1 \
9 | --region us-east-1 \
10 | --profile admin
11 |
12 | aws cloudformation delete-stack \
13 | --stack-name myapistack-1 \
14 | --region us-east-1 \
15 | --profile admin
16 |
--------------------------------------------------------------------------------
/Chapter02/validating-input-and-output-with-models/resources/validating-payloads-cf-stack-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws cloudformation create-stack \
2 | --stack-name myapistack-1 \
3 | --template-body file://validating-payloads-cf-template.yml \
4 | --region us-east-1 \
5 | --profile admin
6 |
7 | aws cloudformation describe-stacks \
8 | --stack-name myapistack-1 \
9 | --region us-east-1 \
10 | --profile admin
11 |
12 | aws cloudformation delete-stack \
13 | --stack-name myapistack-1 \
14 | --region us-east-1 \
15 | --profile admin
16 |
--------------------------------------------------------------------------------
/Chapter02/your-first-api-using-aws-cli/resources/alternative_solutions/cli-commands-with-input-json.txt:
--------------------------------------------------------------------------------
1 | ** We can use an input JSON template using the 'generate-cli-skeleton' parameter for most of the CLI commands and then use the template as input to the command.
2 | The template can be generated as 'aws apigateway put-integration --generate-cli-skeleton'. **
3 |
4 | aws apigateway put-integration --cli-input-json file://put-integration-cli-input.json --region us-east-1 --profile admin
5 |
6 | aws apigateway put-integration-response --cli-input-json file://put-integration-response-cli-input.json --region us-east-1 --profile admin
--------------------------------------------------------------------------------
/Chapter02/your-first-api-using-aws-cli/resources/alternative_solutions/put-integration-cli-input.json:
--------------------------------------------------------------------------------
1 | {
2 | "restApiId": "ic0sd5rav5",
3 | "resourceId": "3mo727",
4 | "httpMethod": "POST",
5 | "type": "AWS",
6 | "integrationHttpMethod": "POST",
7 | "uri": "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:845886054802:function:demo-lambda-with-cli_api/invocations",
8 | "requestTemplates": {
9 | "application/json": "{ \"name\" : $input.json('$.user.name'), \"time\" : $input.json('$.greeting.time')}"
10 | },
11 | "passthroughBehavior": "WHEN_NO_TEMPLATES"
12 | }
--------------------------------------------------------------------------------
/Chapter02/your-first-api-using-aws-cli/resources/alternative_solutions/put-integration-response-cli-input.json:
--------------------------------------------------------------------------------
1 | {
2 | "restApiId": "ic0sd5rav5",
3 | "resourceId": "3mo727",
4 | "httpMethod": "POST",
5 | "statusCode": "200",
6 | "selectionPattern": "",
7 | "responseTemplates": {
8 | "application/json": "{ \"greeting\" : $input.json('$.message')}"
9 | }
10 | }
--------------------------------------------------------------------------------
/Chapter02/your-first-api-using-cloud-formation/resources/your-first-api-using-cf-create-stack-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws cloudformation create-stack \
2 | --stack-name myteststack \
3 | --template-body file://your-first-rest-api-with-api-gateway-cf.yml \
4 | --region us-east-1 \
5 | --profile admin
6 |
7 | aws cloudformation describe-stacks \
8 | --stack-name myteststack \
9 | --region us-east-1 \
10 | --profile admin
11 |
12 | aws cloudformation delete-stack \
13 | --stack-name myteststack \
14 | --region us-east-1 \
15 | --profile admin
16 |
--------------------------------------------------------------------------------
/Chapter02/your-first-api-using-cloud-formation/resources/your-first-api-using-cf.yml:
--------------------------------------------------------------------------------
1 | ---
2 | AWSTemplateFormatVersion: '2010-09-09'
3 | Description: Building API with AWS CloudFormation
4 | Resources:
5 | MyFirstRestAPI:
6 | Type: AWS::ApiGateway::RestApi
7 | Properties:
8 | Name: Greeting API
9 | Description: API for greeting an user
10 | FailOnWarnings: true
11 |
12 | GreetingResource:
13 | Type: AWS::ApiGateway::Resource
14 | Properties:
15 | RestApiId: !Ref MyFirstRestAPI
16 | ParentId: !GetAtt MyFirstRestAPI.RootResourceId
17 | PathPart: 'greeting'
18 |
19 | NamePathParamResource:
20 | Type: AWS::ApiGateway::Resource
21 | Properties:
22 | RestApiId: !Ref MyFirstRestAPI
23 | ParentId: !Ref GreetingResource
24 | PathPart: '{name}'
25 |
26 | MyMockMethod:
27 | Type: AWS::ApiGateway::Method
28 | Properties:
29 | AuthorizationType: NONE
30 | HttpMethod: GET
31 | Integration:
32 | Type: MOCK
33 | IntegrationHttpMethod: GET
34 | IntegrationResponses:
35 | - StatusCode: 200
36 | ResponseTemplates:
37 | application/json: "{\"message\": \"Hello $input.params('name')\" }"
38 | RequestTemplates:
39 | application/json: "{\"statusCode\": 200}"
40 | ResourceId: !Ref NamePathParamResource
41 | RestApiId: !Ref MyFirstRestAPI
42 | MethodResponses:
43 | - StatusCode: 200
44 |
45 | MyFirstDeployment:
46 | DependsOn: MyMockMethod
47 | Type: AWS::ApiGateway::Deployment
48 | Properties:
49 | Description: 'First Deployment'
50 | RestApiId: !Ref MyFirstRestAPI
51 | StageDescription:
52 | Description: 'Dev Stage'
53 | StageName: 'dev'
54 |
55 | Outputs:
56 | SampleEndpoint:
57 | Description: 'Sample Endpoint'
58 | Value: !Sub
59 | - https://${API_ID}.execute-api.${AWS::Region}.amazonaws.com/dev/greeting/Heartin
60 | - API_ID: !Ref MyFirstRestAPI
61 |
--------------------------------------------------------------------------------
/Chapter02/your-first-api-with-lambda-integration/lambda-for-api-gateway/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/Chapter02/your-first-api-with-lambda-integration/lambda-for-api-gateway/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | tech.heartin.books.serverlesscookbook
8 | lambda-for-api-gateway
9 | 0.0.1-SNAPSHOT
10 |
11 |
12 | tech.heartin.books.serverlesscookbook
13 | serverless-cookbook-parent-aws-java
14 | 0.0.1-SNAPSHOT
15 |
16 |
17 |
18 |
19 | com.amazonaws
20 | aws-lambda-java-core
21 | ${aws.lambda.java.core.version}
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/Chapter02/your-first-api-with-lambda-integration/lambda-for-api-gateway/src/main/java/tech/heartin/books/serverlesscookbook/MyLambdaHandler.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook;
2 |
3 | import com.amazonaws.services.lambda.runtime.Context;
4 | import com.amazonaws.services.lambda.runtime.RequestHandler;
5 | import tech.heartin.books.serverlesscookbook.domain.HandlerRequest;
6 | import tech.heartin.books.serverlesscookbook.domain.HandlerResponse;
7 |
8 | /**
9 | * RequestHandler implementation.
10 | */
11 | public final class MyLambdaHandler implements RequestHandler {
12 |
13 | /**
14 | * Handle request.
15 | *
16 | * @param request - input to lambda handler
17 | * @param context - context object
18 | * @return greeting text
19 | */
20 | public HandlerResponse handleRequest(final HandlerRequest request,
21 | final Context context) {
22 |
23 | String greeting = "";
24 |
25 | if (!isEmpty(request.getTime())) {
26 | greeting = "Good " + request.getTime() + ", ";
27 | } else {
28 | greeting = "Good Day, ";
29 | }
30 |
31 | if (!isEmpty(request.getName())) {
32 | greeting = greeting + request.getName();
33 | } else {
34 | greeting = greeting + "User";
35 | }
36 |
37 | context.getLogger().log(greeting);
38 |
39 | return new HandlerResponse(greeting);
40 | }
41 |
42 | private boolean isEmpty(final String str) {
43 | return (str == null || str.isEmpty());
44 | }
45 |
46 | }
47 |
--------------------------------------------------------------------------------
/Chapter02/your-first-api-with-lambda-integration/lambda-for-api-gateway/src/main/java/tech/heartin/books/serverlesscookbook/domain/HandlerRequest.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.domain;
2 |
3 | import lombok.Data;
4 |
5 | /**
6 | * Request POJO.
7 | */
8 | @Data
9 | public class HandlerRequest {
10 | private String name;
11 | private String time;
12 | }
13 |
--------------------------------------------------------------------------------
/Chapter02/your-first-api-with-lambda-integration/lambda-for-api-gateway/src/main/java/tech/heartin/books/serverlesscookbook/domain/HandlerResponse.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.domain;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Data;
5 |
6 | /**
7 | * Response POJO.
8 | */
9 | @Data
10 | @AllArgsConstructor
11 | public class HandlerResponse {
12 | private String message;
13 | }
14 |
--------------------------------------------------------------------------------
/Chapter02/your-first-api-with-lambda-integration/lambda-for-api-gateway/src/main/java/tech/heartin/books/serverlesscookbook/domain/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Domain objects.
3 | */
4 | package tech.heartin.books.serverlesscookbook.domain;
5 |
--------------------------------------------------------------------------------
/Chapter02/your-first-api-with-lambda-integration/lambda-for-api-gateway/src/main/java/tech/heartin/books/serverlesscookbook/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Package for lambdas.
3 | */
4 | package tech.heartin.books.serverlesscookbook;
5 |
--------------------------------------------------------------------------------
/Chapter02/your-first-api-with-lambda-integration/resources/api-gateway-for-lambda-integration-cf-stack-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws cloudformation create-stack \
2 | --stack-name myapistack-1 \
3 | --template-body file://api-gateway-for-lambda-integration-cf-template.yml \
4 | --region us-east-1 \
5 | --profile admin
6 |
7 | aws cloudformation describe-stacks \
8 | --stack-name myapistack-1 \
9 | --region us-east-1 \
10 | --profile admin
11 |
12 | aws cloudformation delete-stack \
13 | --stack-name myapistack-1 \
14 | --region us-east-1 \
15 | --profile admin
16 |
--------------------------------------------------------------------------------
/Chapter02/your-first-api-with-lambda-integration/resources/lambda-for-api-gateway-cf-stack-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws cloudformation create-stack \
2 | --stack-name mylambdastack-1 \
3 | --template-body file://lambda-for-api-gateway-cf-template.yml \
4 | --capabilities CAPABILITY_NAMED_IAM \
5 | --region us-east-1 \
6 | --profile admin
7 |
8 |
9 | aws cloudformation describe-stacks \
10 | --stack-name mylambdastack-1 \
11 | --region us-east-1 \
12 | --profile admin
13 |
14 |
15 | aws cloudformation delete-stack \
16 | --stack-name mylambdastack-1 \
17 | --region us-east-1 \
18 | --profile admin
19 |
--------------------------------------------------------------------------------
/Chapter02/your-first-api-with-lambda-integration/resources/lambda-for-api-gateway-cf-template.yml:
--------------------------------------------------------------------------------
1 | ---
2 | AWSTemplateFormatVersion: '2010-09-09'
3 | Description: Building Lambda with AWS CloudFormation
4 | Resources:
5 | IamRoleLambdaExecution:
6 | Type: AWS::IAM::Role
7 | Properties:
8 | AssumeRolePolicyDocument:
9 | Version: '2012-10-17'
10 | Statement:
11 | - Effect: Allow
12 | Principal:
13 | Service:
14 | - lambda.amazonaws.com
15 | Action:
16 | - sts:AssumeRole
17 | Policies:
18 | - PolicyName: 'lambda-with-cf-policy'
19 | PolicyDocument:
20 | Version: '2012-10-17'
21 | Statement:
22 | - Effect: Allow
23 | Action:
24 | - logs:CreateLogGroup
25 | - logs:CreateLogStream
26 | - logs:PutLogEvents
27 | Resource: arn:aws:logs:*:*:*
28 | Path: "/"
29 | RoleName: "lambda-with-cf-role"
30 | MyLambdaFunction:
31 | Type: AWS::Lambda::Function
32 | Properties:
33 | Code:
34 | S3Bucket: 'serverless-cookbook'
35 | S3Key: lambda-handler-with-pojos-0.0.1-SNAPSHOT.jar
36 | FunctionName: 'lambda-for-api-gateway'
37 | Handler: tech.heartin.books.serverlesscookbook.MyLambdaHandler::handleRequest
38 | MemorySize: 512
39 | Role:
40 | Fn::GetAtt:
41 | - IamRoleLambdaExecution
42 | - Arn
43 | Runtime: java8
44 | Timeout: 15
45 | DependsOn:
46 | - IamRoleLambdaExecution
47 | Outputs:
48 | LambdaOutput:
49 | Description: 'Lambda For API Gateway Reference'
50 | Value: !Ref MyLambdaFunction
51 | Export:
52 | Name: LambdaForApiGateway
53 |
--------------------------------------------------------------------------------
/Chapter02/your-first-api-with-lambda-integration/resources/lambda-for-api-gateway-s3-upload-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws s3 cp \
2 | target/original-serverless-cookbook-lambda-handler-with-pojos-0.0.1-SNAPSHOT.jar \
3 | s3://serverless-cookbook/lambda-handler-with-pojos-0.0.1-SNAPSHOT.jar \
4 | --profile admin
--------------------------------------------------------------------------------
/Chapter03/adding-data-items-from-lambda/lambda-dynamodb-put-item/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/Chapter03/adding-data-items-from-lambda/lambda-dynamodb-put-item/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | tech.heartin.books.serverless-cookbook
8 | lambda-dynamodb-put-item
9 | 0.0.1-SNAPSHOT
10 |
11 |
12 | tech.heartin.books.serverlesscookbook
13 | serverless-cookbook-parent-aws-java
14 | 0.0.1-SNAPSHOT
15 |
16 |
17 |
18 |
19 | com.amazonaws
20 | aws-lambda-java-core
21 | ${aws.lambda.java.core.version}
22 |
23 |
24 |
25 | com.amazonaws
26 | aws-java-sdk-dynamodb
27 | ${aws.sdk.version}
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/Chapter03/adding-data-items-from-lambda/lambda-dynamodb-put-item/src/main/java/tech/heartin/books/serverlesscookbook/MyLambdaHandler.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook;
2 |
3 | import com.amazonaws.services.lambda.runtime.Context;
4 | import com.amazonaws.services.lambda.runtime.RequestHandler;
5 | import tech.heartin.books.serverlesscookbook.domain.Request;
6 | import tech.heartin.books.serverlesscookbook.domain.Response;
7 | import tech.heartin.books.serverlesscookbook.services.DynamoDBService;
8 | import tech.heartin.books.serverlesscookbook.services.DynamoDBServiceImpl1;
9 | import tech.heartin.books.serverlesscookbook.services.DynamoDBServiceImpl2;
10 |
11 | /**
12 | * RequestHandler implementation.
13 | */
14 | public final class MyLambdaHandler implements RequestHandler {
15 |
16 | private DynamoDBService service;
17 |
18 | /**
19 | * Handle request.
20 | *
21 | * @param request - input to lambda handler
22 | * @param context - context object
23 | * @return greeting text
24 | */
25 | public Response handleRequest(final Request request, final Context context) {
26 | context.getLogger().log("Put item on table " + request.getTableName());
27 |
28 | final String version = System.getenv("API_VERSION");
29 | if (version != null && version.equals("V2")) {
30 | service = new DynamoDBServiceImpl2();
31 | } else {
32 | service = new DynamoDBServiceImpl1();
33 | }
34 |
35 | return service.putItem(request);
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/Chapter03/adding-data-items-from-lambda/lambda-dynamodb-put-item/src/main/java/tech/heartin/books/serverlesscookbook/domain/Request.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.domain;
2 |
3 | import java.util.Map;
4 |
5 | import lombok.Data;
6 |
7 | /**
8 | * Request POJO.
9 | */
10 | @Data
11 | public class Request {
12 | private String tableName;
13 | private String partitionKey;
14 | private String sortKey;
15 | private String partitionKeyValue;
16 | private Integer sortKeyValue;
17 | private boolean waitForActive;
18 | private Map stringData;
19 | private Map integerData;
20 | }
21 |
--------------------------------------------------------------------------------
/Chapter03/adding-data-items-from-lambda/lambda-dynamodb-put-item/src/main/java/tech/heartin/books/serverlesscookbook/domain/Response.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.domain;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Data;
5 |
6 | /**
7 | * Response POJO.
8 | */
9 | @Data
10 | @AllArgsConstructor
11 | public class Response {
12 | private String message;
13 | private String errorMessage;
14 | }
15 |
--------------------------------------------------------------------------------
/Chapter03/adding-data-items-from-lambda/lambda-dynamodb-put-item/src/main/java/tech/heartin/books/serverlesscookbook/domain/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Domain objects.
3 | */
4 | package tech.heartin.books.serverlesscookbook.domain;
5 |
--------------------------------------------------------------------------------
/Chapter03/adding-data-items-from-lambda/lambda-dynamodb-put-item/src/main/java/tech/heartin/books/serverlesscookbook/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Package for lambdas.
3 | */
4 | package tech.heartin.books.serverlesscookbook;
5 |
--------------------------------------------------------------------------------
/Chapter03/adding-data-items-from-lambda/lambda-dynamodb-put-item/src/main/java/tech/heartin/books/serverlesscookbook/services/DynamoDBService.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.services;
2 |
3 | import tech.heartin.books.serverlesscookbook.domain.Request;
4 | import tech.heartin.books.serverlesscookbook.domain.Response;
5 |
6 | /**
7 | * DynamoDB operations.
8 | */
9 | public interface DynamoDBService {
10 |
11 | /**
12 | * Put Item.
13 | * @param request table name.
14 | * @return Response object.
15 | */
16 | Response putItem(Request request);
17 | }
18 |
--------------------------------------------------------------------------------
/Chapter03/adding-data-items-from-lambda/lambda-dynamodb-put-item/src/main/java/tech/heartin/books/serverlesscookbook/services/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Service classes.
3 | */
4 | package tech.heartin.books.serverlesscookbook.services;
5 |
--------------------------------------------------------------------------------
/Chapter03/creating-tables-from-lambda/lambda-dynamodb-create-table/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/Chapter03/creating-tables-from-lambda/lambda-dynamodb-create-table/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | tech.heartin.books.serverless-cookbook
8 | lambda-dynamodb-create-table
9 | 0.0.1-SNAPSHOT
10 |
11 |
12 | tech.heartin.books.serverlesscookbook
13 | serverless-cookbook-parent-aws-java
14 | 0.0.1-SNAPSHOT
15 |
16 |
17 |
18 |
19 | com.amazonaws
20 | aws-lambda-java-core
21 | ${aws.lambda.java.core.version}
22 |
23 |
24 |
25 | com.amazonaws
26 | aws-java-sdk-dynamodb
27 | ${aws.sdk.version}
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/Chapter03/creating-tables-from-lambda/lambda-dynamodb-create-table/src/main/java/tech/heartin/books/serverlesscookbook/MyLambdaHandler.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook;
2 |
3 | import com.amazonaws.services.lambda.runtime.Context;
4 | import com.amazonaws.services.lambda.runtime.RequestHandler;
5 | import tech.heartin.books.serverlesscookbook.domain.Request;
6 | import tech.heartin.books.serverlesscookbook.domain.Response;
7 | import tech.heartin.books.serverlesscookbook.services.DynamoDBService;
8 | import tech.heartin.books.serverlesscookbook.services.DynamoDBServiceImpl1;
9 | import tech.heartin.books.serverlesscookbook.services.DynamoDBServiceImpl2;
10 |
11 | /**
12 | * RequestHandler implementation.
13 | */
14 | public final class MyLambdaHandler implements RequestHandler {
15 |
16 | private DynamoDBService service;
17 |
18 | /**
19 | * Handle request.
20 | *
21 | * @param request - input to lambda handler
22 | * @param context - context object
23 | * @return greeting text
24 | */
25 | public Response handleRequest(final Request request, final Context context) {
26 | context.getLogger().log("Creating table " + request.getTableName());
27 |
28 | final String version = System.getenv("API_VERSION");
29 | if (version != null && version.equals("V2")) {
30 | service = new DynamoDBServiceImpl2();
31 | } else {
32 | service = new DynamoDBServiceImpl1();
33 | }
34 | return service.createTable(request);
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/Chapter03/creating-tables-from-lambda/lambda-dynamodb-create-table/src/main/java/tech/heartin/books/serverlesscookbook/domain/Request.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.domain;
2 |
3 | import lombok.Data;
4 |
5 | /**
6 | * Request POJO.
7 | */
8 | @Data
9 | public class Request {
10 | private String tableName;
11 | private String partitionKey;
12 | private String sortKey;
13 | private long readCapacityUnits;
14 | private long writeCapacityUnits;
15 | private boolean waitForActive;
16 | }
17 |
--------------------------------------------------------------------------------
/Chapter03/creating-tables-from-lambda/lambda-dynamodb-create-table/src/main/java/tech/heartin/books/serverlesscookbook/domain/Response.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.domain;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Data;
5 |
6 | /**
7 | * Response POJO.
8 | */
9 | @Data
10 | @AllArgsConstructor
11 | public class Response {
12 | private String message;
13 | private String errorMessage;
14 | }
15 |
--------------------------------------------------------------------------------
/Chapter03/creating-tables-from-lambda/lambda-dynamodb-create-table/src/main/java/tech/heartin/books/serverlesscookbook/domain/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Domain objects.
3 | */
4 | package tech.heartin.books.serverlesscookbook.domain;
5 |
--------------------------------------------------------------------------------
/Chapter03/creating-tables-from-lambda/lambda-dynamodb-create-table/src/main/java/tech/heartin/books/serverlesscookbook/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Package for lambdas.
3 | */
4 | package tech.heartin.books.serverlesscookbook;
5 |
--------------------------------------------------------------------------------
/Chapter03/creating-tables-from-lambda/lambda-dynamodb-create-table/src/main/java/tech/heartin/books/serverlesscookbook/services/DynamoDBService.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.services;
2 |
3 | import tech.heartin.books.serverlesscookbook.domain.Request;
4 | import tech.heartin.books.serverlesscookbook.domain.Response;
5 |
6 | /**
7 | * DynamoDB operations.
8 | */
9 | public interface DynamoDBService {
10 |
11 | /**
12 | * Create table.
13 | * @param request table name.
14 | * @return Response object.
15 | */
16 | Response createTable(Request request);
17 | }
18 |
--------------------------------------------------------------------------------
/Chapter03/creating-tables-from-lambda/lambda-dynamodb-create-table/src/main/java/tech/heartin/books/serverlesscookbook/services/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Service classes.
3 | */
4 | package tech.heartin.books.serverlesscookbook.services;
5 |
--------------------------------------------------------------------------------
/Chapter03/creating-tables-from-lambda/resources/lambda-dynamodb-create-table-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws s3 cp \
2 | target/lambda-dynamodb-create-table-0.0.1-SNAPSHOT.jar \
3 | s3://serverless-cookbook/lambda-dynamodb-create-table-0.0.1-SNAPSHOT.jar \
4 | --profile admin
5 |
6 | aws cloudformation create-stack \
7 | --stack-name myteststack-c \
8 | --template-body file://lambda-dynamodb-create-table-cf-template.yml \
9 | --capabilities CAPABILITY_NAMED_IAM \
10 | --region us-east-1 \
11 | --profile admin
12 |
13 | aws cloudformation describe-stacks \
14 | --stack-name myteststack-c \
15 | --region us-east-1 \
16 | --profile admin
17 |
18 | aws cloudformation delete-stack \
19 | --stack-name myteststack-c \
20 | --region us-east-1 \
21 | --profile admin
22 |
23 | aws lambda invoke \
24 | --invocation-type RequestResponse \
25 | --function-name lambda-dynamodb-create-table \
26 | --log-type Tail \
27 | --payload '{
28 | "tableName":"my_table",
29 | "partitionKey": "id",
30 | "sortKey": "dateandtime",
31 | "readCapacityUnits": 1,
32 | "writeCapacityUnits": 1,
33 | "waitForActive": false
34 | }' \
35 | --region us-east-1 \
36 | --profile admin \
37 | outputfile.txt
38 |
39 | aws dynamodb describe-table \
40 | --table-name my_table \
41 | --region us-east-1 \
42 | --profile admin
43 |
44 | aws dynamodb delete-table \
45 | --table-name my_table \
46 | --region us-east-1 \
47 | --profile admin
48 |
49 | aws lambda update-function-configuration \
50 | --function-name lambda-dynamodb-create-table \
51 | --environment Variables={API_VERSION=V2} \
52 | --region us-east-1 \
53 | --profile admin
--------------------------------------------------------------------------------
/Chapter03/reading-data-items-from-lambda/lambda-dynamodb-read-item/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/Chapter03/reading-data-items-from-lambda/lambda-dynamodb-read-item/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | tech.heartin.books.serverless-cookbook
8 | lambda-dynamodb-read-item
9 | 0.0.1-SNAPSHOT
10 |
11 |
12 | tech.heartin.books.serverlesscookbook
13 | serverless-cookbook-parent-aws-java
14 | 0.0.1-SNAPSHOT
15 |
16 |
17 |
18 |
19 | com.amazonaws
20 | aws-lambda-java-core
21 | ${aws.lambda.java.core.version}
22 |
23 |
24 |
25 | com.amazonaws
26 | aws-java-sdk-dynamodb
27 | ${aws.sdk.version}
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/Chapter03/reading-data-items-from-lambda/lambda-dynamodb-read-item/src/main/java/tech/heartin/books/serverlesscookbook/MyLambdaHandler.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook;
2 |
3 | import com.amazonaws.services.lambda.runtime.Context;
4 | import com.amazonaws.services.lambda.runtime.RequestHandler;
5 | import tech.heartin.books.serverlesscookbook.domain.Request;
6 | import tech.heartin.books.serverlesscookbook.domain.Response;
7 | import tech.heartin.books.serverlesscookbook.services.DynamoDBService;
8 | import tech.heartin.books.serverlesscookbook.services.DynamoDBServiceImpl1;
9 | import tech.heartin.books.serverlesscookbook.services.DynamoDBServiceImpl2;
10 |
11 | /**
12 | * RequestHandler implementation.
13 | */
14 | public final class MyLambdaHandler implements RequestHandler {
15 |
16 | private DynamoDBService service;
17 |
18 | /**
19 | * Handle request.
20 | *
21 | * @param request - input to lambda handler
22 | * @param context - context object
23 | * @return greeting text
24 | */
25 | public Response handleRequest(final Request request, final Context context) {
26 | context.getLogger().log("Put item on table " + request.getTableName());
27 |
28 | final String version = System.getenv("API_VERSION");
29 | if (version != null && version.equals("V2")) {
30 | service = new DynamoDBServiceImpl2();
31 | } else {
32 | service = new DynamoDBServiceImpl1();
33 | }
34 |
35 | if (isNotEmpty(request.getPartitionKeyValue()) && isNotEmpty(request.getSortKeyValue())) {
36 | return service.getItem(request);
37 | } else if (isNotEmpty(request.getPartitionKeyValue())) {
38 | return service.query(request);
39 | } else {
40 | return service.scan(request);
41 | }
42 | }
43 |
44 | private boolean isNotEmpty(final String str) {
45 | return str != null && !str.isEmpty();
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/Chapter03/reading-data-items-from-lambda/lambda-dynamodb-read-item/src/main/java/tech/heartin/books/serverlesscookbook/domain/Request.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.domain;
2 |
3 | import java.util.Map;
4 |
5 | import lombok.Data;
6 |
7 | /**
8 | * Request POJO.
9 | */
10 | @Data
11 | public class Request {
12 | private String tableName;
13 | private String partitionKey;
14 | private String sortKey;
15 | private String partitionKeyValue;
16 | private String sortKeyValue; // Will be stored integer.
17 | private boolean waitForActive;
18 | private Map filterData;
19 | }
20 |
--------------------------------------------------------------------------------
/Chapter03/reading-data-items-from-lambda/lambda-dynamodb-read-item/src/main/java/tech/heartin/books/serverlesscookbook/domain/Response.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.domain;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Data;
5 |
6 | /**
7 | * Response POJO.
8 | */
9 | @Data
10 | @AllArgsConstructor
11 | public class Response {
12 | private String message;
13 | private String errorMessage;
14 | }
15 |
--------------------------------------------------------------------------------
/Chapter03/reading-data-items-from-lambda/lambda-dynamodb-read-item/src/main/java/tech/heartin/books/serverlesscookbook/domain/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Domain objects.
3 | */
4 | package tech.heartin.books.serverlesscookbook.domain;
5 |
--------------------------------------------------------------------------------
/Chapter03/reading-data-items-from-lambda/lambda-dynamodb-read-item/src/main/java/tech/heartin/books/serverlesscookbook/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Package for lambdas.
3 | */
4 | package tech.heartin.books.serverlesscookbook;
5 |
--------------------------------------------------------------------------------
/Chapter03/reading-data-items-from-lambda/lambda-dynamodb-read-item/src/main/java/tech/heartin/books/serverlesscookbook/services/DynamoDBService.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.services;
2 |
3 | import tech.heartin.books.serverlesscookbook.domain.Request;
4 | import tech.heartin.books.serverlesscookbook.domain.Response;
5 |
6 | /**
7 | * DynamoDB operations.
8 | */
9 | public interface DynamoDBService {
10 |
11 | /**
12 | * Put Item.
13 | * @param request table name.
14 | * @return Response object.
15 | */
16 | Response getItem(Request request);
17 |
18 | /**
19 | * Query Item.
20 | * @param request table name.
21 | * @return Response object.
22 | */
23 | Response query(Request request);
24 |
25 | /**
26 | * Scan Item.
27 | * @param request table name.
28 | * @return Response object.
29 | */
30 | Response scan(Request request);
31 | }
32 |
--------------------------------------------------------------------------------
/Chapter03/reading-data-items-from-lambda/lambda-dynamodb-read-item/src/main/java/tech/heartin/books/serverlesscookbook/services/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Service classes.
3 | */
4 | package tech.heartin.books.serverlesscookbook.services;
5 |
--------------------------------------------------------------------------------
/Chapter03/your-first-dynamodb-table/resources/cf-stack-deploy-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws cloudformation create-stack \
2 | --stack-name myteststack \
3 | --template-body file://your-first-dynamodb-table-cf-template.yml \
4 | --region us-east-1 \
5 | --profile admin
6 |
7 | aws cloudformation describe-stacks \
8 | --stack-name myteststack \
9 | --region us-east-1 \
10 | --profile admin
11 |
12 | aws cloudformation update-stack \
13 | --stack-name myteststack \
14 | --template-body file://your-first-dynamodb-table-cf-template-updated.yml \
15 | --region us-east-1 \
16 | --profile admin
17 |
18 | aws cloudformation delete-stack \
19 | --stack-name myteststack \
20 | --region us-east-1 \
21 | --profile admin
--------------------------------------------------------------------------------
/Chapter03/your-first-dynamodb-table/resources/your-first-dynamodb-table-cf-template-updated.yml:
--------------------------------------------------------------------------------
1 | ---
2 | AWSTemplateFormatVersion: '2010-09-09'
3 | Description: Your First DynamoDB Table
4 | Resources:
5 | MyFirstTable:
6 | Type: AWS::DynamoDB::Table
7 | Properties:
8 | TableName: my_table
9 | ProvisionedThroughput:
10 | ReadCapacityUnits: 5
11 | WriteCapacityUnits: 5
12 | KeySchema:
13 | -
14 | AttributeName: id
15 | KeyType: HASH
16 | -
17 | AttributeName: dateandtime
18 | KeyType: RANGE
19 | AttributeDefinitions:
20 | -
21 | AttributeName: id
22 | AttributeType: S
23 | -
24 | AttributeName: dateandtime
25 | AttributeType: N
26 |
--------------------------------------------------------------------------------
/Chapter03/your-first-dynamodb-table/resources/your-first-dynamodb-table-cf-template.yml:
--------------------------------------------------------------------------------
1 | ---
2 | AWSTemplateFormatVersion: '2010-09-09'
3 | Description: Your First DynamoDB Table
4 | Resources:
5 | MyFirstTable:
6 | Type: AWS::DynamoDB::Table
7 | Properties:
8 | TableName: my_table
9 | ProvisionedThroughput:
10 | ReadCapacityUnits: 1
11 | WriteCapacityUnits: 1
12 | KeySchema:
13 | -
14 | AttributeName: id
15 | KeyType: HASH
16 | -
17 | AttributeName: dateandtime
18 | KeyType: RANGE
19 | AttributeDefinitions:
20 | -
21 | AttributeName: id
22 | AttributeType: S
23 | -
24 | AttributeName: dateandtime
25 | AttributeType: N
26 |
--------------------------------------------------------------------------------
/Chapter03/your-first-dynamodb-table/resources/your-first-dynamodb-table-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws dynamodb create-table \
2 | --table-name my_table \
3 | --attribute-definitions 'AttributeName=id, AttributeType=S' 'AttributeName=dateandtime, AttributeType=N' \
4 | --key-schema 'AttributeName=id, KeyType=HASH' 'AttributeName=dateandtime, KeyType=RANGE' \
5 | --provisioned-throughput 'ReadCapacityUnits=5, WriteCapacityUnits=5' \
6 | --region us-east-1 \
7 | --profile admin
8 |
9 | aws dynamodb list-tables \
10 | --region us-east-1 \
11 | --profile admin
12 |
13 | aws dynamodb describe-table \
14 | --table-name my_table \
15 | --region us-east-1 \
16 | --profile admin
17 |
18 | aws dynamodb update-table \
19 | --table-name my_table \
20 | --provisioned-throughput 'ReadCapacityUnits=10, WriteCapacityUnits=10' \
21 | --region us-east-1 \
22 | --profile admin
23 |
24 | aws dynamodb delete-table \
25 | --table-name my_table \
26 | --region us-east-1 \
27 | --profile admin
28 |
29 |
--------------------------------------------------------------------------------
/Chapter04/cognito-client-side-authentication-flow/resources/cf-stack-deploy-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws cloudformation create-stack \
2 | --stack-name myclientstack \
3 | --template-body file://cognito-client-side-authentication-client-cf-template.yml \
4 | --region us-east-1 \
5 | --profile admin
6 |
7 | aws cloudformation describe-stacks \
8 | --stack-name myclientstack \
9 | --region us-east-1 \
10 | --profile admin
11 |
12 | aws cloudformation delete-stack \
13 | --stack-name myclientstack \
14 | --region us-east-1 \
15 | --profile admin
--------------------------------------------------------------------------------
/Chapter04/cognito-client-side-authentication-flow/resources/cognito-client-side-authentication-client-cf-template.yml:
--------------------------------------------------------------------------------
1 | ---
2 | AWSTemplateFormatVersion: '2010-09-09'
3 | Description: 'My First Cognito User Pool Client'
4 | Resources:
5 | MyUserPoolClient:
6 | Type: AWS::Cognito::UserPoolClient
7 | Properties:
8 | ClientName: 'My Cognito User Pool Client'
9 | ExplicitAuthFlows:
10 | - USER_PASSWORD_AUTH
11 | RefreshTokenValidity: 30
12 | UserPoolId: !ImportValue MyFirstUserPoolId
13 | Outputs:
14 | ClientId:
15 | Description: 'Cognito user pool Client'
16 | Value: !Ref MyUserPoolClient
17 |
--------------------------------------------------------------------------------
/Chapter04/cognito-server-side-authentication-flow/resources/cf-stack-deploy-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws cloudformation create-stack \
2 | --stack-name myuserpoolclientstack \
3 | --template-body file://cognito-server-side-authentication-client-cf-template.yml \
4 | --region us-east-1 \
5 | --profile admin
6 |
7 | aws cloudformation describe-stacks \
8 | --stack-name myuserpoolclientstack \
9 | --region us-east-1 \
10 | --profile admin
11 |
12 | aws cloudformation delete-stack \
13 | --stack-name myuserpoolclientstack \
14 | --region us-east-1 \
15 | --profile admin
--------------------------------------------------------------------------------
/Chapter04/cognito-server-side-authentication-flow/resources/cognito-server-side-authentication-client-cf-template.yml:
--------------------------------------------------------------------------------
1 | ---
2 | AWSTemplateFormatVersion: '2010-09-09'
3 | Description: 'My First Cognito User Pool Client'
4 | Resources:
5 | MyUserPoolClient:
6 | Type: AWS::Cognito::UserPoolClient
7 | Properties:
8 | ClientName: 'My Cognito User Pool Client'
9 | ExplicitAuthFlows:
10 | - ADMIN_NO_SRP_AUTH
11 | RefreshTokenValidity: 30
12 | UserPoolId: !ImportValue MyFirstUserPoolId
13 | Outputs:
14 | ClientId:
15 | Description: 'Cognito user pool Client'
16 | Value: !Ref MyUserPoolClient
17 |
--------------------------------------------------------------------------------
/Chapter04/creating-a-cognito-user-pool/resources/cf-stack-deploy-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws cloudformation create-stack \
2 | --stack-name myuserpoolstack \
3 | --template-body file://cognito-user-pool-cf-template.yml \
4 | --region us-east-1 \
5 | --profile admin
6 |
7 | aws cloudformation describe-stacks \
8 | --stack-name myuserpoolstack \
9 | --region us-east-1 \
10 | --profile admin
11 |
12 | aws cloudformation delete-stack \
13 | --stack-name myuserpoolstack \
14 | --region us-east-1 \
15 | --profile admin
16 |
17 | aws cloudformation update-stack \
18 | --stack-name myuserpoolstack \
19 | --template-body file://cognito-user-pool-cf-template.yml \
20 | --region us-east-1 \
21 | --profile admin
--------------------------------------------------------------------------------
/Chapter04/creating-a-cognito-user-pool/resources/cognito-user-pool-cf-template.yml:
--------------------------------------------------------------------------------
1 | ---
2 | AWSTemplateFormatVersion: '2010-09-09'
3 | Description: 'My First Cognito User Pool'
4 | Resources:
5 | MyFirstUserPool:
6 | Type: AWS::Cognito::UserPool
7 | Properties:
8 | Policies:
9 | PasswordPolicy:
10 | MinimumLength: 8
11 | RequireLowercase: true
12 | RequireNumbers: true
13 | RequireSymbols: true
14 | RequireUppercase: true
15 | AutoVerifiedAttributes:
16 | - email
17 | AliasAttributes:
18 | - email
19 | EmailVerificationMessage: 'Your verification code from MyApp is {####}.'
20 | EmailVerificationSubject: 'Your verification code from MyApp'
21 | AdminCreateUserConfig:
22 | AllowAdminCreateUserOnly: false
23 | InviteMessageTemplate:
24 | EmailMessage: 'Your username for MyApp is {username} and password is {####}.'
25 | EmailSubject: 'Your temporary password for MyApp'
26 | UnusedAccountValidityDays: 7
27 | UserPoolName: 'MyApp User Pool'
28 | UserPoolTags:
29 | Team: Dev
30 | Outputs:
31 | UserPoolId:
32 | Description: 'Cognito user pool'
33 | Value: !Ref MyFirstUserPool
34 | Export:
35 | Name: MyFirstUserPoolId
36 |
--------------------------------------------------------------------------------
/Chapter04/creating-a-cognito-user-pool/resources/congnito-user-pool-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws cognito-idp create-user-pool \
2 | --generate-cli-skeleton
3 |
4 | aws cognito-idp create-user-pool \
5 | --cli-input-json file://create-user-pool-cli-input.json \
6 | --profile admin
7 |
8 | aws cognito-idp describe-user-pool \
9 | --user-pool-id us-east-1_LccU5yCbI \
10 | --profile admin
11 |
12 | aws cognito-idp delete-user-pool \
13 | --user-pool-id us-east-1_LccU5yCbI \
14 | --profile admin
15 |
16 |
--------------------------------------------------------------------------------
/Chapter04/creating-a-cognito-user-pool/resources/create-user-pool-cli-input.json:
--------------------------------------------------------------------------------
1 | {
2 | "PoolName": "MyFirstUserPool",
3 | "Policies": {
4 | "PasswordPolicy": {
5 | "MinimumLength": 8,
6 | "RequireUppercase": true,
7 | "RequireLowercase": true,
8 | "RequireNumbers": true,
9 | "RequireSymbols": true
10 | }
11 | },
12 | "AutoVerifiedAttributes": [
13 | "email"
14 | ],
15 | "AliasAttributes": [
16 | "email"
17 | ],
18 | "EmailVerificationMessage": "Your verification code from MyApp is {####}.",
19 | "EmailVerificationSubject": "Your verification code from MyApp",
20 | "UserPoolTags": {
21 | "Team": "Dev"
22 | },
23 | "AdminCreateUserConfig": {
24 | "AllowAdminCreateUserOnly": false,
25 | "UnusedAccountValidityDays": 7,
26 | "InviteMessageTemplate": {
27 | "EmailMessage": "Your username for MyApp is {username} and password is {####}.",
28 | "EmailSubject": "Your temporary password for MyApp"
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/Chapter04/integrating-cognito-with-api-gateway/resources/cf-stack-deploy-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws cloudformation create-stack \
2 | --stack-name myapigatewaystack \
3 | --template-body file://integrating-cognito-with-api-gateway-cf-template.yml \
4 | --region us-east-1 \
5 | --profile admin
6 |
7 | aws cloudformation describe-stacks \
8 | --stack-name myapigatewaystack \
9 | --region us-east-1 \
10 | --profile admin
11 |
12 | aws cloudformation delete-stack \
13 | --stack-name myapigatewaystack \
14 | --region us-east-1 \
15 | --profile admin
16 |
--------------------------------------------------------------------------------
/Chapter04/user-sign-up-with-sms-and-mfa-verification/resources/assume-role-trust-relationship-policy-document.txt:
--------------------------------------------------------------------------------
1 | {
2 | "Version": "2012-10-17",
3 | "Statement": [
4 | {
5 | "Effect": "Allow",
6 | "Principal": {
7 | "Service": "cognito-idp.amazonaws.com"
8 | },
9 | "Action": "sts:AssumeRole"
10 | }
11 | ]
12 | }
--------------------------------------------------------------------------------
/Chapter04/user-sign-up-with-sms-and-mfa-verification/resources/cf-stack-deploy-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws cloudformation create-stack \
2 | --stack-name userpoolandclientstack \
3 | --template-body file://create-user-pool-and-client-cf-template.yml \
4 | --capabilities CAPABILITY_NAMED_IAM \
5 | --region us-east-1 \
6 | --profile admin
7 |
8 | aws cloudformation describe-stacks \
9 | --stack-name userpoolandclientstack \
10 | --region us-east-1 \
11 | --profile admin
12 |
13 | aws cloudformation delete-stack \
14 | --stack-name userpoolandclientstack \
15 | --region us-east-1 \
16 | --profile admin
17 |
--------------------------------------------------------------------------------
/Chapter04/user-sign-up-with-sms-and-mfa-verification/resources/congnito-user-and-client-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws cognito-idp create-user-pool \
2 | --generate-cli-skeleton
3 |
4 | aws cognito-idp create-user-pool \
5 | --cli-input-json file://create-user-pool-for-sms-and-mfa-verification-cli-input.json \
6 | --profile admin
7 |
8 | aws cognito-idp describe-user-pool \
9 | --user-pool-id us-east-1_ASuytZRyc \
10 | --profile admin
11 |
12 | aws cognito-idp delete-user-pool \
13 | --user-pool-id us-east-1_ASuytZRyc \
14 | --profile admin
15 |
16 | aws cognito-idp create-user-pool-client \
17 | --user-pool-id us-east-1_ASuytZRyc \
18 | --explicit-auth-flows USER_PASSWORD_AUTH \
19 | --client-name user-pool-client-signup \
20 | --profile admin
21 |
22 | aws cognito-idp describe-user-pool-client \
23 | --user-pool-id us-east-1_ASuytZRyc \
24 | --client-id 2aviajrvqgrse1s9cgk25d01ag \
25 | --profile admin
26 |
27 | aws cognito-idp delete-user-pool-client \
28 | --user-pool-id us-east-1_fYsb1Gyec \
29 | --client-id 6amm4ins1md8fo5tvhtmel183h \
30 | --profile admin
--------------------------------------------------------------------------------
/Chapter04/user-sign-up-with-sms-and-mfa-verification/resources/create-user-pool-cli-input.json:
--------------------------------------------------------------------------------
1 | {
2 | "PoolName": "QnaTime.com User Pool",
3 | "Policies": {
4 | "PasswordPolicy": {
5 | "MinimumLength": 8,
6 | "RequireUppercase": true,
7 | "RequireLowercase": true,
8 | "RequireNumbers": true,
9 | "RequireSymbols": true
10 | }
11 | },
12 | "AutoVerifiedAttributes": [
13 | "phone_number"
14 | ],
15 | "UsernameAttributes": [
16 | "phone_number"
17 | ],
18 | "SmsVerificationMessage": "Your verification code from qnatime.com is {####}.",
19 | "MfaConfiguration": "ON",
20 | "SmsConfiguration": {
21 | "SnsCallerArn": "arn:aws:iam::123456789012:role/cognito_sns_iam_role",
22 | "ExternalId": "some-unique-external-id-preferably-a-uuid"
23 | },
24 |
25 | "UserPoolTags": {
26 | "Team": "Dev"
27 | },
28 | "AdminCreateUserConfig": {
29 | "AllowAdminCreateUserOnly": false,
30 | "UnusedAccountValidityDays": 7,
31 | "InviteMessageTemplate": {
32 | "SMSMessage": "Your username for qnatime.com is {username} and password is {####}."}
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/Chapter04/user-sign-up-with-sms-and-mfa-verification/resources/creating-role-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws iam create-policy \
2 | --policy-name cognito_sns_iam_policy \
3 | --policy-document file://sns-publish-policy.txt \
4 | --profile admin
5 |
6 | aws iam create-role \
7 | --role-name cognito_sns_iam_role \
8 | --assume-role-policy-document file://assume-role-trust-relationship-policy-document.txt \
9 | --profile admin
10 |
11 | aws iam attach-role-policy \
12 | --role-name cognito_sns_iam_role \
13 | --policy-arn arn:aws:iam::123456789012:policy/cognito_sns_iam_policy \
14 | --profile admin
--------------------------------------------------------------------------------
/Chapter04/user-sign-up-with-sms-and-mfa-verification/resources/sns-publish-policy.txt:
--------------------------------------------------------------------------------
1 | {
2 | "Version": "2012-10-17",
3 | "Statement": [
4 | {
5 | "Effect": "Allow",
6 | "Action": [
7 | "sns:publish"
8 | ],
9 | "Resource": [
10 | "*"
11 | ]
12 | }
13 | ]
14 | }
--------------------------------------------------------------------------------
/Chapter04/user-sign-up-with-sms-and-mfa-verification/resources/user-sign-up-with-sms-only-verification-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws cognito-idp sign-up \
2 | --client-id 2aviajrvqgrse1s9cgk25d01ag \
3 | --username +917411174114 \
4 | --password Passw0rd$
5 |
6 | aws cognito-idp resend-confirmation-code \
7 | --client-id 2aviajrvqgrse1s9cgk25d01ag \
8 | --username +917411174114
9 |
10 | aws cognito-idp confirm-sign-up \
11 | --client-id 2aviajrvqgrse1s9cgk25d01ag \
12 | --username +917411174114 \
13 | --confirmation-code 223904
14 |
15 | aws cognito-idp initiate-auth \
16 | --client-id 2aviajrvqgrse1s9cgk25d01ag \
17 | --auth-flow USER_PASSWORD_AUTH \
18 | --auth-parameters USERNAME=+917411174114,PASSWORD=Passw0rd$
19 |
20 | aws cognito-idp delete-user \
21 | --access-token eyJraWQiOiI0VTY1ZHNqWlgyRHZoUDNwVFhnaTVkNU4zNkhmUkdOOFFVZHFvd1pmTXVnPSIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiI0MDMwYjAyYi04Nzc5LTRkNTEtYjFjNi1mZmFlOGI2Y2NiMTIiLCJldmVudF9pZCI6ImFjYzIyNGYxLWVkYjgtMTFlOC04ZTFhLWQ3OWVjYzQ1ZDhmYSIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4iLCJhdXRoX3RpbWUiOjE1NDI4MjM4MDYsImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC51cy1lYXN0LTEuYW1hem9uYXdzLmNvbVwvdXMtZWFzdC0xX2ZZc2IxR3llYyIsImV4cCI6MTU0MjgyNzQwNiwiaWF0IjoxNTQyODIzODA2LCJqdGkiOiI4M2M1YWJhYi1lYWNiLTRhN2ItYWI1NS1iYTNmZjljYjMzMzQiLCJjbGllbnRfaWQiOiI0czY5b3AwdjhlczJjb2psNW5janFsMnY0ZyIsInVzZXJuYW1lIjoidGVzdHVzZXI0In0.PoCpT2vnP3cSz4rUyIRcwl6NgQtPUlX0bLd5saTHFOnUulLl0uWMvwVEQJ86BHIGQFTunKPVPZD34Lk0-GqeMeZrc7BgQTP5fWgCTU4v_QEEyb-j2D8QJMfL3erXF3JoDZo5Cvb4bwSp6HdfRVkyqIP074hzq_JCvaegobV7xry6tWT5NcoKwn9Q0Ed49aDfj87ZPoho__oMwcuPYoTxubYQK_UVPMIHrFSBukumnTzoGUFhffp4RpLWiAgpjFezkQQlEAee-9o2Uy0AunHH98d6XiiI5gWMsntx8-AMZpT_MAN63OyHrgOeRnvnlO8vqhC97n-kVznvlTgP5KaT1Q
22 |
--------------------------------------------------------------------------------
/Chapter05/custom-domain-with-cloudfront/resources/add-route-53-record-sets.yml:
--------------------------------------------------------------------------------
1 | ---
2 | AWSTemplateFormatVersion: '2010-09-09'
3 | Description: 'CloudFront Distribution with Domain'
4 | Parameters:
5 | RootDomainName:
6 | Description: Domain name for your website (quizzercloud.com)
7 | Type: String
8 | SubDomainName:
9 | Description: Sub Domain name for your website (www.quizzercloud.com)
10 | Type: String
11 | CFHostedZoneId:
12 | Description: S3 hosted zone id for the region (Z2FDTNDATAQYW2)
13 | Type: String
14 | Resources:
15 | QuizzerCloudDNS:
16 | Type: AWS::Route53::RecordSetGroup
17 | Properties:
18 | HostedZoneName: !Sub
19 | - ${DomainName}.
20 | - DomainName: !Ref RootDomainName
21 | Comment: Zone apex alias.
22 | RecordSets:
23 | -
24 | Name: !Ref RootDomainName
25 | Type: A
26 | AliasTarget:
27 | HostedZoneId: !Ref CFHostedZoneId
28 | DNSName: !ImportValue CloudFrontDomainName
29 | -
30 | Name: !Ref SubDomainName
31 | Type: A
32 | AliasTarget:
33 | HostedZoneId: !Ref CFHostedZoneId
34 | DNSName: !ImportValue CloudFrontDomainName
35 | Outputs:
36 | RootDomainURL:
37 | Value: !Sub
38 | - http://${DomainName}
39 | - DomainName: !Ref RootDomainName
40 | Description: URL for root domain
41 | SubDomainURL:
42 | Value: !Sub
43 | - http://${DomainName}
44 | - DomainName: !Ref SubDomainName
45 | Description: URL for redirect (sub) domain
--------------------------------------------------------------------------------
/Chapter05/custom-domain-with-cloudfront/resources/cf-stack-deploy-cli-commands.txt:
--------------------------------------------------------------------------------
1 | -- Create CloudFront Distribution --
2 |
3 | aws cloudformation create-stack \
4 | --stack-name mycloudfrontstackwithdomain \
5 | --template-body file://create-cloud-front-distribution-with-domain.yml \
6 | --parameters file://create-cloud-front-parameters.json \
7 | --region ap-south-1 \
8 | --profile admin
9 |
10 | aws cloudformation describe-stacks \
11 | --stack-name mycloudfrontstackwithdomain \
12 | --region ap-south-1 \
13 | --profile admin
14 |
15 | aws cloudformation delete-stack \
16 | --stack-name mycloudfrontstackwithdomain \
17 | --region ap-south-1 \
18 | --profile admin
19 |
20 |
21 |
22 | -- Add A Records --
23 |
24 | aws cloudformation create-stack \
25 | --stack-name recordsetstack \
26 | --template-body file://add-route-53-record-sets.yml \
27 | --parameters ParameterKey=RootDomainName,ParameterValue=quizzercloud.com \
28 | ParameterKey=SubDomainName,ParameterValue=www.quizzercloud.com \
29 | ParameterKey=CFHostedZoneId,ParameterValue=Z2FDTNDATAQYW2 \
30 | --region ap-south-1 \
31 | --profile admin
32 |
33 | aws cloudformation describe-stacks \
34 | --stack-name recordsetstack \
35 | --region ap-south-1 \
36 | --profile admin
37 |
38 | aws cloudformation delete-stack \
39 | --stack-name recordsetstack \
40 | --region ap-south-1 \
41 | --profile admin
--------------------------------------------------------------------------------
/Chapter05/custom-domain-with-cloudfront/resources/change-resource-record-sets.json:
--------------------------------------------------------------------------------
1 | {
2 | "Comment": "change batch request for qnatime",
3 | "Changes": [
4 | {
5 | "Action": "CREATE",
6 | "ResourceRecordSet": {
7 | "Name": "qnatime.net",
8 | "Type": "A",
9 | "AliasTarget": {
10 | "HostedZoneId": "Z2FDTNDATAQYW2",
11 | "DNSName": "d1obzjrl8ac1no.cloudfront.net",
12 | "EvaluateTargetHealth": false
13 | }
14 | }
15 | },
16 | {
17 | "Action": "CREATE",
18 | "ResourceRecordSet": {
19 | "Name": "www.qnatime.net",
20 | "Type": "A",
21 | "AliasTarget": {
22 | "HostedZoneId": "Z2FDTNDATAQYW2",
23 | "DNSName": "d1obzjrl8ac1no.cloudfront.net",
24 | "EvaluateTargetHealth": false
25 | }
26 | }
27 | }
28 | ]
29 | }
--------------------------------------------------------------------------------
/Chapter05/custom-domain-with-cloudfront/resources/create-cloud-front-distribution-with-domain.yml:
--------------------------------------------------------------------------------
1 | ---
2 | AWSTemplateFormatVersion: '2010-09-09'
3 | Description: 'CloudFront Distribution with Domain'
4 | Parameters:
5 | DomainNameAliases:
6 | Description: Domain name aliases for your website (quizzercloud.com,www.quizzercloud.com)
7 | Type: CommaDelimitedList
8 | Resources:
9 | MyCloudFrontDistribution:
10 | Type: AWS::CloudFront::Distribution
11 | Properties:
12 | DistributionConfig:
13 | Origins:
14 | - DomainName: quizzer.cloud.s3.amazonaws.com
15 | Id: myS3Origin
16 | S3OriginConfig:
17 | OriginAccessIdentity: ''
18 | Enabled: 'true'
19 | Comment: 'CloudFront Distribution with Domain'
20 | DefaultRootObject: index.html
21 | Aliases: !Ref DomainNameAliases
22 | DefaultCacheBehavior:
23 | TargetOriginId: myS3Origin
24 | ForwardedValues:
25 | QueryString: 'false'
26 | Cookies:
27 | Forward: none
28 | ViewerProtocolPolicy: allow-all
29 | Outputs:
30 | CloudFrontDistributionId:
31 | Value: !Ref MyCloudFrontDistribution
32 | Description: 'CloudFront distribution id'
33 | CloudFrontDomain:
34 | Value: !GetAtt MyCloudFrontDistribution.DomainName
35 | Description: 'CloudFront distribution domain name'
36 | Export:
37 | Name: CloudFrontDomainName
--------------------------------------------------------------------------------
/Chapter05/custom-domain-with-cloudfront/resources/create-cloud-front-parameters.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "ParameterKey": "DomainNameAliases",
4 | "ParameterValue": "quizzercloud.com,www.quizzercloud.com"
5 | }
6 | ]
--------------------------------------------------------------------------------
/Chapter05/custom-domain-with-cloudfront/resources/custom-domain-with-cloud-front.txt:
--------------------------------------------------------------------------------
1 | aws cloudfront create-distribution \
2 | --distribution-config file://resources/distribution-config.json \
3 | --profile admin
4 |
5 | aws cloudfront get-distribution \
6 | --id E18OUP1REXZHGA \
7 | --profile admin
8 |
9 |
10 |
11 | -- Creating A records --
12 |
13 | aws route53 change-resource-record-sets \
14 | --hosted-zone-id Z3G50MON7IDA18 \
15 | --change-batch file://resources/change-resource-record-sets.json \
16 | --profile admin
17 |
18 | aws route53 get-change \
19 | --id /change/C1P0E2LUACKQ6W \
20 | --profile admin
21 |
22 |
23 |
24 | -- Disable and delete CloudFront Distribution --
25 |
26 | aws cloudfront update-distribution \
27 | --id E18OUP1REXZHGA \
28 | --if-match EV3RMCDP8DYAA \
29 | --distribution-config file://resources/distr-config-disable.json \
30 | --profile admin
31 |
32 | aws cloudfront get-distribution \
33 | --id E18OUP1REXZHGA \
34 | --profile admin
35 |
36 | aws cloudfront delete-distribution \
37 | --id E18OUP1REXZHGA \
38 | --if-match E2CDLHTOPGMT5J \
39 | --profile admin
40 |
41 |
--------------------------------------------------------------------------------
/Chapter05/custom-domain-with-cloudfront/resources/distribution-config.json:
--------------------------------------------------------------------------------
1 | {
2 | "CallerReference": "qnatime-distribution-2019-01-12-07-45",
3 | "Aliases": {
4 | "Quantity": 2,
5 | "Items": ["qnatime.net", "www.qnatime.net"]
6 | },
7 | "DefaultRootObject": "index.html",
8 | "Origins": {
9 | "Quantity": 1,
10 | "Items": [
11 | {
12 | "Id": "my-origin",
13 | "DomainName": "qnatime.com.s3.amazonaws.com",
14 | "S3OriginConfig": {
15 | "OriginAccessIdentity": ""
16 | }
17 | }
18 | ]
19 | },
20 | "DefaultCacheBehavior": {
21 | "TargetOriginId": "my-origin",
22 | "ForwardedValues": {
23 | "QueryString": true,
24 | "Cookies": {
25 | "Forward": "none"
26 | }
27 | },
28 | "TrustedSigners": {
29 | "Enabled": false,
30 | "Quantity": 0
31 | },
32 | "ViewerProtocolPolicy": "allow-all",
33 | "MinTTL": 3600
34 | },
35 | "Comment": "",
36 | "Enabled": true
37 | }
--------------------------------------------------------------------------------
/Chapter05/registering-domain-name-with-route53/resources/contact.json:
--------------------------------------------------------------------------------
1 | {
2 | "FirstName": "Heartin",
3 | "LastName": "Kanikathottu",
4 | "ContactType": "PERSON",
5 | "OrganizationName": "NA",
6 | "AddressLine1": "Innovative Aqua Front",
7 | "AddressLine2": "Lake View Road, Doddanakundi",
8 | "City": "Bengaluru",
9 | "State": "KA",
10 | "CountryCode": "IN",
11 | "ZipCode": "560037",
12 | "PhoneNumber": "+91.7411174112",
13 | "Email": "heartin@gmail.com"
14 | }
--------------------------------------------------------------------------------
/Chapter05/registering-domain-name-with-route53/resources/registering-domain-with-route53.txt:
--------------------------------------------------------------------------------
1 | aws route53domains check-domain-availability \
2 | --domain-name qnatime.com \
3 | --profile admin
4 |
5 | aws route53domains check-domain-availability \
6 | --domain-name qnatime.net \
7 | --profile admin
8 |
9 | aws route53domains register-domain \
10 | --domain-name 'qnatime.net' \
11 | --duration-in-years 1 \
12 | --no-auto-renew \
13 | --admin-contact file://resources/contact.json \
14 | --registrant-contact file://resources/contact.json \
15 | --tech-contact file://resources/contact.json \
16 | --privacy-protect-admin-contact \
17 | --privacy-protect-registrant-contact \
18 | --privacy-protect-tech-contact \
19 | --profile admin
20 |
21 | aws route53domains get-operation-detail \
22 | --operation-id ba6b494d-9e86-4acc-8904-3ba861228916 \
23 | --profile admin
--------------------------------------------------------------------------------
/Chapter05/s3-static-website-with-custom-domain/resources/cf-stack-deploy-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws cloudformation create-stack \
2 | --stack-name mys3websitestack \
3 | --template-body file://s3-static-website-with-custom-domain-cf-template.yml \
4 | --parameters ParameterKey=RootDomainName,ParameterValue=quizzer.cloud ParameterKey=SubDomainName,ParameterValue=www.quizzer.cloud \
5 | --region ap-south-1 \
6 | --profile admin
7 |
8 | aws cloudformation describe-stacks \
9 | --stack-name mys3websitestack \
10 | --region ap-south-1 \
11 | --profile admin
12 |
13 | aws cloudformation delete-stack \
14 | --stack-name mys3websitestack \
15 | --region ap-south-1 \
16 | --profile admin
--------------------------------------------------------------------------------
/Chapter05/s3-static-website-with-custom-domain/resources/change-resource-record-sets.json:
--------------------------------------------------------------------------------
1 | {
2 | "Comment": "change batch request for qnatime",
3 | "Changes": [
4 | {
5 | "Action": "CREATE",
6 | "ResourceRecordSet": {
7 | "Name": "qnatime.com",
8 | "Type": "A",
9 | "AliasTarget": {
10 | "HostedZoneId": "Z11RGJOFQNVJUP",
11 | "DNSName": "s3-website.ap-south-1.amazonaws.com",
12 | "EvaluateTargetHealth": false
13 | }
14 | }
15 | },
16 | {
17 | "Action": "CREATE",
18 | "ResourceRecordSet": {
19 | "Name": "www.qnatime.com",
20 | "Type": "A",
21 | "AliasTarget": {
22 | "HostedZoneId": "Z11RGJOFQNVJUP",
23 | "DNSName": "s3-website.ap-south-1.amazonaws.com",
24 | "EvaluateTargetHealth": false
25 | }
26 | }
27 | }
28 | ]
29 | }
--------------------------------------------------------------------------------
/Chapter05/s3-static-website-with-custom-domain/resources/error.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Q & A Time - Error Page
6 |
7 |
8 | Error Page!
9 |
10 |
--------------------------------------------------------------------------------
/Chapter05/s3-static-website-with-custom-domain/resources/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Q & A Time
6 |
7 |
8 | Welcome to Q & A Time!
9 |
10 |
--------------------------------------------------------------------------------
/Chapter05/s3-static-website-with-custom-domain/resources/s3-static-website-cli-commands.txt:
--------------------------------------------------------------------------------
1 | -- Creating Root Bucket --
2 |
3 | aws s3api create-bucket \
4 | --bucket qnatime.com \
5 | --create-bucket-configuration LocationConstraint=ap-south-1 \
6 | --region ap-south-1 \
7 | --profile admin
8 |
9 | aws s3 cp index.html s3://qnatime.com/index.html \
10 | --profile admin
11 |
12 | aws s3 cp error.html s3://qnatime.com/error.html \
13 | --profile admin
14 |
15 | aws s3api put-bucket-website \
16 | --bucket qnatime.com \
17 | --website-configuration file://s3-website-configuration.json \
18 | --profile admin
19 |
20 | aws s3api put-bucket-policy \
21 | --bucket qnatime.com \
22 | --policy file://s3-website-policy.json \
23 | --profile admin
24 |
25 | http://qnatime.com.s3-website.ap-south-1.amazonaws.com/
26 |
27 |
28 |
29 |
30 | -- Creating redirect bucket --
31 |
32 | aws s3api create-bucket \
33 | --bucket www.qnatime.com \
34 | --create-bucket-configuration LocationConstraint=ap-south-1 \
35 | --region ap-south-1 \
36 | --profile admin
37 |
38 | aws s3api put-bucket-website \
39 | --bucket www.qnatime.com \
40 | --website-configuration file://s3-website-redirect-configuration.json \
41 | --profile admin
42 |
43 |
44 |
45 |
46 | -- Creating A records --
47 |
48 | aws route53 change-resource-record-sets \
49 | --hosted-zone-id Z18ZT9JI8CNW5X \
50 | --change-batch file://change-resource-record-sets.json \
51 | --profile admin
52 |
53 |
54 | aws route53 get-change \
55 | --id /change/C1KSXLKZ4DWPPW \
56 | --profile admin
57 |
58 |
59 |
60 |
61 | -- UPLOAD FOR CloudFormation TEMPLATE --
62 |
63 | aws s3 cp index.html s3://quizzer.cloud/index.html \
64 | --profile admin
65 |
66 | aws s3 cp error.html s3://quizzer.cloud/error.html \
67 | --profile admin
--------------------------------------------------------------------------------
/Chapter05/s3-static-website-with-custom-domain/resources/s3-website-configuration.json:
--------------------------------------------------------------------------------
1 | {
2 | "IndexDocument": {
3 | "Suffix": "index.html"
4 | },
5 | "ErrorDocument": {
6 | "Key": "error.html"
7 | }
8 | }
--------------------------------------------------------------------------------
/Chapter05/s3-static-website-with-custom-domain/resources/s3-website-policy.json:
--------------------------------------------------------------------------------
1 | {
2 | "Version":"2012-10-17",
3 | "Statement":[
4 | {
5 | "Sid":"PublicReadGetObjectAccess",
6 | "Effect":"Allow",
7 | "Principal": "*",
8 | "Action":["s3:GetObject"],
9 | "Resource":["arn:aws:s3:::qnatime.com/*"]
10 | }
11 | ]
12 | }
--------------------------------------------------------------------------------
/Chapter05/s3-static-website-with-custom-domain/resources/s3-website-redirect-configuration.json:
--------------------------------------------------------------------------------
1 | {
2 | "RedirectAllRequestsTo": {
3 | "HostName": "qnatime.com",
4 | "Protocol": "http"
5 | }
6 | }
--------------------------------------------------------------------------------
/Chapter05/setting-up-cloudfront-for-s3-bucket/resources/cf-stack-deploy-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws cloudformation create-stack \
2 | --stack-name mycloudfrontstack \
3 | --template-body file://create-cloud-front-distribution.yml \
4 | --region ap-south-1 \
5 | --profile admin
6 |
7 | aws cloudformation describe-stacks \
8 | --stack-name mycloudfrontstack \
9 | --region ap-south-1 \
10 | --profile admin
11 |
12 | aws cloudformation delete-stack \
13 | --stack-name mycloudfrontstack \
14 | --region ap-south-1 \
15 | --profile admin
--------------------------------------------------------------------------------
/Chapter05/setting-up-cloudfront-for-s3-bucket/resources/create-cloud-front-distribution.yml:
--------------------------------------------------------------------------------
1 | ---
2 | AWSTemplateFormatVersion: '2010-09-09'
3 | Description: 'CloudFront Distribution for S3 Bucket'
4 | Resources:
5 | MyCloudFrontDistribution:
6 | Type: AWS::CloudFront::Distribution
7 | Properties:
8 | DistributionConfig:
9 | Origins:
10 | - DomainName: quizzer.cloud.s3.amazonaws.com
11 | Id: myS3Origin
12 | S3OriginConfig:
13 | OriginAccessIdentity: ''
14 | Enabled: 'true'
15 | Comment: 'CloudFront Distribution for S3 Bucket'
16 | DefaultRootObject: index.html
17 | DefaultCacheBehavior:
18 | TargetOriginId: myS3Origin
19 | ForwardedValues:
20 | QueryString: 'false'
21 | Cookies:
22 | Forward: none
23 | ViewerProtocolPolicy: allow-all
24 | Outputs:
25 | CloudFrontDistributionId:
26 | Value: !Ref MyCloudFrontDistribution
27 | Description: 'CloudFront distribution id'
28 | CloudFrontDomain:
29 | Value: !GetAtt MyCloudFrontDistribution.DomainName
30 | Description: 'CloudFront distribution domain name'
--------------------------------------------------------------------------------
/Chapter05/setting-up-cloudfront-for-s3-bucket/resources/setting-up-cloud-front-for-s3-bucket.txt:
--------------------------------------------------------------------------------
1 | aws cloudfront create-distribution \
2 | --origin-domain-name qnatime.s3.amazonaws.com \
3 | --default-root-object index.html \
4 | --profile admin
5 |
6 | aws cloudfront get-distribution \
7 | --id E1ZX6JAV6EDQVO \
8 | --profile admin
9 |
10 | aws cloudfront delete-distribution \
11 | --id E1ZX6JAV6EDQVO \
12 | --if-match E2D8OBE98ICCBH \
13 | --profile admin
--------------------------------------------------------------------------------
/Chapter05/setting-up-s3-static-website/resources/cf-stack-deploy-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws cloudformation create-stack \
2 | --stack-name s3websitestack \
3 | --template-body file://s3-static-website-cf-template.yml \
4 | --parameters ParameterKey=BucketName,ParameterValue=quizzercloud \
5 | --region ap-south-1 \
6 | --profile admin
7 |
8 | aws cloudformation describe-stacks \
9 | --stack-name s3websitestack \
10 | --region ap-south-1 \
11 | --profile admin
12 |
13 | aws cloudformation delete-stack \
14 | --stack-name s3websitestack \
15 | --region ap-south-1 \
16 | --profile admin
--------------------------------------------------------------------------------
/Chapter05/setting-up-s3-static-website/resources/error.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Error page for Q & A Time!
6 |
7 |
8 | Error Page!
9 |
10 |
--------------------------------------------------------------------------------
/Chapter05/setting-up-s3-static-website/resources/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Q & A Time
6 |
7 |
8 | Welcome to Q & A Time!
9 |
10 |
--------------------------------------------------------------------------------
/Chapter05/setting-up-s3-static-website/resources/s3-static-website-cf-template.yml:
--------------------------------------------------------------------------------
1 | ---
2 | AWSTemplateFormatVersion: '2010-09-09'
3 | Description: 'S3 Static Website'
4 | Parameters:
5 | BucketName:
6 | Description: Bucket name for your website
7 | Type: String
8 | Resources:
9 | MyBucket:
10 | Type: AWS::S3::Bucket
11 | Properties:
12 | BucketName: !Ref BucketName
13 | AccessControl: PublicRead
14 | WebsiteConfiguration:
15 | IndexDocument: index.html
16 | ErrorDocument: error.html
17 | WebsitePublicAccessPolicy:
18 | Type: AWS::S3::BucketPolicy
19 | Properties:
20 | Bucket: !Ref MyBucket
21 | PolicyDocument:
22 | Statement:
23 | -
24 | Action:
25 | - "s3:GetObject"
26 | Effect: "Allow"
27 | Resource:
28 | Fn::Join:
29 | - ""
30 | -
31 | - "arn:aws:s3:::"
32 | - !Ref MyBucket
33 | - "/*"
34 | Principal: "*"
35 | Outputs:
36 | S3WebsiteURL:
37 | Value: !Sub
38 | - http://${Bucket}.s3-website.${AWS::Region}.amazonaws.com
39 | - Bucket: !Ref MyBucket
40 | Description: URL for S3 static website
--------------------------------------------------------------------------------
/Chapter05/setting-up-s3-static-website/resources/s3-static-website-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws s3api create-bucket \
2 | --bucket qnatime \
3 | --create-bucket-configuration LocationConstraint=ap-south-1 \
4 | --region ap-south-1 \
5 | --profile admin
6 |
7 | aws s3 cp index.html s3://qnatime/index.html \
8 | --profile admin
9 |
10 | aws s3 cp error.html s3://qnatime/error.html \
11 | --profile admin
12 |
13 | aws s3api put-bucket-website \
14 | --bucket qnatime \
15 | --website-configuration file://s3-website-configuration.json \
16 | --profile admin
17 |
18 | aws s3api put-bucket-policy \
19 | --bucket qnatime \
20 | --policy file://s3-website-policy.json \
21 | --profile admin
22 |
23 |
24 |
25 | -- Bucket Website URL --
26 |
27 | http://qnatime.s3-website.ap-south-1.amazonaws.com/
28 |
29 |
30 |
31 | -- Cleanup --
32 | aws s3 rb s3://qnatime \
33 | --force \
34 | --profile admin
35 |
36 |
37 |
38 | -- Upload files for the CloudFormation template --
39 |
40 | aws s3 cp index.html s3://quizzercloud/index.html \
41 | --profile admin
42 |
43 | aws s3 cp error.html s3://quizzercloud/error.html \
44 | --profile admin
--------------------------------------------------------------------------------
/Chapter05/setting-up-s3-static-website/resources/s3-website-configuration.json:
--------------------------------------------------------------------------------
1 | {
2 | "IndexDocument": {
3 | "Suffix": "index.html"
4 | },
5 | "ErrorDocument": {
6 | "Key": "error.html"
7 | }
8 | }
--------------------------------------------------------------------------------
/Chapter05/setting-up-s3-static-website/resources/s3-website-policy.json:
--------------------------------------------------------------------------------
1 | {
2 | "Version":"2012-10-17",
3 | "Statement":[
4 | {
5 | "Sid":"PublicReadGetObjectAccess",
6 | "Effect":"Allow",
7 | "Principal": "*",
8 | "Action":["s3:GetObject"],
9 | "Resource":["arn:aws:s3:::qnatime/*"]
10 | }
11 | ]
12 | }
--------------------------------------------------------------------------------
/Chapter05/using-custom-ssl-certificate-with-cloudfront/resources/add-route-53-record-sets.yml:
--------------------------------------------------------------------------------
1 | ---
2 | AWSTemplateFormatVersion: '2010-09-09'
3 | Description: 'CloudFront Distribution with Domain'
4 | Parameters:
5 | RootDomainName:
6 | Description: Domain name for your website (quizzercloud.com)
7 | Type: String
8 | SubDomainName:
9 | Description: Sub Domain name for your website (www.quizzercloud.com)
10 | Type: String
11 | RecordHostedZoneId:
12 | Description: S3 hosted zone id for the region (Z2FDTNDATAQYW2)
13 | Type: String
14 | Resources:
15 | RecordSetDNS:
16 | Type: AWS::Route53::RecordSetGroup
17 | Properties:
18 | HostedZoneName: !Sub
19 | - ${DomainName}.
20 | - DomainName: !Ref RootDomainName
21 | Comment: Zone apex alias.
22 | RecordSets:
23 | -
24 | Name: !Ref RootDomainName
25 | Type: A
26 | AliasTarget:
27 | HostedZoneId: !Ref RecordHostedZoneId
28 | DNSName: !ImportValue CloudFrontDomainName
29 | -
30 | Name: !Ref SubDomainName
31 | Type: A
32 | AliasTarget:
33 | HostedZoneId: !Ref RecordHostedZoneId
34 | DNSName: !ImportValue CloudFrontDomainName
35 | Outputs:
36 | RootDomainURL:
37 | Value: !Sub
38 | - https://${DomainName}
39 | - DomainName: !Ref RootDomainName
40 | Description: URL for root domain
41 | SubDomainURL:
42 | Value: !Sub
43 | - https://${DomainName}
44 | - DomainName: !Ref SubDomainName
45 | Description: URL for redirect (sub) domain
--------------------------------------------------------------------------------
/Chapter05/using-custom-ssl-certificate-with-cloudfront/resources/cf-stack-deploy-cli-commands.txt:
--------------------------------------------------------------------------------
1 | -- Create CloudFront Distribution --
2 |
3 | aws cloudformation create-stack \
4 | --stack-name mycloudfrontstackwithssl \
5 | --template-body file://create-cloud-front-distribution-with-ssl.yml \
6 | --parameters file://create-cloud-front-parameters.json \
7 | --profile admin
8 |
9 | aws cloudformation describe-stacks \
10 | --stack-name mycloudfrontstackwithssl \
11 | --profile admin
12 |
13 | aws cloudformation delete-stack \
14 | --stack-name mycloudfrontstackwithssl \
15 | --profile admin
16 |
17 |
18 |
19 | -- Add ALIAS Records --
20 |
21 | aws cloudformation create-stack \
22 | --stack-name recordsetstack \
23 | --template-body file://add-route-53-record-sets.yml \
24 | --parameters ParameterKey=RootDomainName,ParameterValue=quizzercloud.com \
25 | ParameterKey=SubDomainName,ParameterValue=www.quizzercloud.com \
26 | ParameterKey=RecordHostedZoneId,ParameterValue=Z2FDTNDATAQYW2 \
27 | --profile admin
28 |
29 | aws cloudformation describe-stacks \
30 | --stack-name recordsetstack \
31 | --profile admin
32 |
33 | aws cloudformation delete-stack \
34 | --stack-name recordsetstack \
35 | --profile admin
--------------------------------------------------------------------------------
/Chapter05/using-custom-ssl-certificate-with-cloudfront/resources/create-cloud-front-distribution-with-ssl-import-cert.yml:
--------------------------------------------------------------------------------
1 | ---
2 | AWSTemplateFormatVersion: '2010-09-09'
3 | Description: 'CloudFront Distribution with Domain'
4 | Parameters:
5 | DomainNameAliases:
6 | Description: Domain name aliases for your website (quizzercloud.com,www.quizzercloud.com)
7 | Type: CommaDelimitedList
8 | Resources:
9 | MyCloudFrontDistribution:
10 | Type: AWS::CloudFront::Distribution
11 | Properties:
12 | DistributionConfig:
13 | Origins:
14 | - DomainName: quizzer.cloud.s3.amazonaws.com
15 | Id: myS3Origin
16 | S3OriginConfig:
17 | OriginAccessIdentity: ''
18 | Enabled: 'true'
19 | Comment: 'CloudFront Distribution with Domain'
20 | DefaultRootObject: index.html
21 | Aliases: !Ref DomainNameAliases
22 | DefaultCacheBehavior:
23 | TargetOriginId: myS3Origin
24 | ForwardedValues:
25 | QueryString: 'false'
26 | Cookies:
27 | Forward: none
28 | ViewerProtocolPolicy: redirect-to-https
29 | ViewerCertificate:
30 | AcmCertificateArn: !ImportValue DomainNameCert
31 | SslSupportMethod: sni-only
32 | Outputs:
33 | CloudFrontDistributionId:
34 | Value: !Ref MyCloudFrontDistribution
35 | Description: 'CloudFront distribution id'
36 | CloudFrontDomain:
37 | Value: !GetAtt MyCloudFrontDistribution.DomainName
38 | Description: 'CloudFront distribution domain name'
39 | Export:
40 | Name: CloudFrontDomainName
--------------------------------------------------------------------------------
/Chapter05/using-custom-ssl-certificate-with-cloudfront/resources/create-cloud-front-distribution-with-ssl.yml:
--------------------------------------------------------------------------------
1 | ---
2 | AWSTemplateFormatVersion: '2010-09-09'
3 | Description: 'CloudFront Distribution with Domain'
4 | Parameters:
5 | DomainNameAliases:
6 | Description: Domain name aliases for your website (quizzercloud.com,www.quizzercloud.com)
7 | Type: CommaDelimitedList
8 | DomainNameCert:
9 | Description: Domain name ACM certificate ARN
10 | Type: CommaDelimitedList
11 | Resources:
12 | MyCloudFrontDistribution:
13 | Type: AWS::CloudFront::Distribution
14 | Properties:
15 | DistributionConfig:
16 | Origins:
17 | - DomainName: quizzer.cloud.s3.amazonaws.com
18 | Id: myS3Origin
19 | S3OriginConfig:
20 | OriginAccessIdentity: ''
21 | Enabled: 'true'
22 | Comment: 'CloudFront Distribution with Domain'
23 | DefaultRootObject: index.html
24 | Aliases: !Ref DomainNameAliases
25 | DefaultCacheBehavior:
26 | TargetOriginId: myS3Origin
27 | ForwardedValues:
28 | QueryString: 'false'
29 | Cookies:
30 | Forward: none
31 | ViewerProtocolPolicy: redirect-to-https
32 | ViewerCertificate:
33 | AcmCertificateArn: !Ref DomainNameCert
34 | SslSupportMethod: sni-only
35 | Outputs:
36 | CloudFrontDistributionId:
37 | Value: !Ref MyCloudFrontDistribution
38 | Description: 'CloudFront distribution id'
39 | CloudFrontDomain:
40 | Value: !GetAtt MyCloudFrontDistribution.DomainName
41 | Description: 'CloudFront distribution domain name'
42 | Export:
43 | Name: CloudFrontDomainName
--------------------------------------------------------------------------------
/Chapter05/using-custom-ssl-certificate-with-cloudfront/resources/create-cloud-front-parameters.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "ParameterKey": "DomainNameAliases",
4 | "ParameterValue": "quizzercloud.com,www.quizzercloud.com"
5 | },
6 | {
7 | "ParameterKey": "DomainNameCert",
8 | "ParameterValue": "arn:aws:acm:us-east-1:218317422462:certificate/2d98d52b-376b-40c2-9d07-6954d5f132f2"
9 | }
10 | ]
--------------------------------------------------------------------------------
/Chapter05/using-custom-ssl-certificate-with-cloudfront/resources/using-custom-ssl-certificate-with-cloudfront.txt:
--------------------------------------------------------------------------------
1 | aws cloudfront -distribution \
2 | --id E18OUP1REXZHGA \
3 | --if-match EDP6N3HLLG1MK \
4 | --distribution-config file://resources/distribution-config-update.json \
5 | --profile admin
6 |
7 | aws cloudfront get-distribution \
8 | --id EFMZAV2I3L601 \
9 | --profile admin
--------------------------------------------------------------------------------
/Chapter05/using-domains-with-other-registrars/resources/cf-stack-deploy-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws cloudformation create-stack \
2 | --stack-name mydnsstack \
3 | --template-body file://create-hosted-zone.yml \
4 | --region ap-south-1 \
5 | --profile admin
6 |
7 | aws cloudformation describe-stacks \
8 | --stack-name mydnsstack \
9 | --region ap-south-1 \
10 | --profile admin
11 |
12 | aws cloudformation delete-stack \
13 | --stack-name mydnsstack \
14 | --region ap-south-1 \
15 | --profile admin
--------------------------------------------------------------------------------
/Chapter05/using-domains-with-other-registrars/resources/create-hosted-zone.yml:
--------------------------------------------------------------------------------
1 | ---
2 | AWSTemplateFormatVersion: '2010-09-09'
3 | Description: 'Route 53 HostedZone'
4 | Resources:
5 | CloudMaterialsHostedZone:
6 | Type: "AWS::Route53::HostedZone"
7 | Properties:
8 | HostedZoneConfig:
9 | Comment: HostedZone for CloudMaterials.com
10 | Name: cloudmaterials.com
11 | Outputs:
12 | HostedZoneId:
13 | Value: !Ref CloudMaterialsHostedZone
14 | Description: HostedZone for cloudmaterials.com
15 | HostedZoneNameservers:
16 | Value: !Join
17 | - ','
18 | - !GetAtt CloudMaterialsHostedZone.NameServers
19 | Description: HostedZone Nameservers for cloudmaterials.com
--------------------------------------------------------------------------------
/Chapter05/using-domains-with-other-registrars/resources/using-domains-with-other-registrars.txt:
--------------------------------------------------------------------------------
1 | aws route53 create-hosted-zone \
2 | --name quizzercloud.com \
3 | --caller-reference 2018-28-11-11:55 \
4 | --hosted-zone-config Comment="HostedZone for quizzercloud.com" \
5 | --profile admin
6 |
7 | aws route53 get-hosted-zone \
8 | --id Z1MSS6K1EB49B4 \
9 | --profile admin
10 |
--------------------------------------------------------------------------------
/Chapter06/creating-sqs-queue-and-sending-message-with-sdk/lambda-sqs-sdk-create-send/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/Chapter06/creating-sqs-queue-and-sending-message-with-sdk/lambda-sqs-sdk-create-send/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | tech.heartin.books.serverless-cookbook
8 | lambda-sqs-sdk-create-send
9 | 0.0.1-SNAPSHOT
10 |
11 |
12 | tech.heartin.books.serverlesscookbook
13 | serverless-cookbook-parent-aws-java
14 | 0.0.1-SNAPSHOT
15 |
16 |
17 |
18 |
19 | com.amazonaws
20 | aws-lambda-java-core
21 | ${aws.lambda.java.core.version}
22 |
23 |
24 |
25 | com.amazonaws
26 | aws-java-sdk-sqs
27 | ${aws.sdk.version}
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/Chapter06/creating-sqs-queue-and-sending-message-with-sdk/lambda-sqs-sdk-create-send/src/main/java/tech/heartin/books/serverlesscookbook/LambdaSqsSdkCreateSendHandler.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook;
2 |
3 | import com.amazonaws.services.lambda.runtime.Context;
4 | import com.amazonaws.services.lambda.runtime.RequestHandler;
5 | import com.amazonaws.services.sqs.AmazonSQS;
6 | import com.amazonaws.services.sqs.AmazonSQSClientBuilder;
7 |
8 | import tech.heartin.books.serverlesscookbook.domain.Request;
9 | import tech.heartin.books.serverlesscookbook.domain.Response;
10 | import tech.heartin.books.serverlesscookbook.services.SqsService;
11 | import tech.heartin.books.serverlesscookbook.services.SqsServiceImpl;
12 |
13 | /**
14 | * RequestHandler implementation.
15 | */
16 | public final class LambdaSqsSdkCreateSendHandler implements RequestHandler {
17 |
18 | private final AmazonSQS sqsClient;
19 |
20 | public LambdaSqsSdkCreateSendHandler() {
21 | this.sqsClient = AmazonSQSClientBuilder.standard()
22 | .withRegion(System.getenv("AWS_REGION"))
23 | .build();
24 | }
25 |
26 | /**
27 | * Handle request.
28 | *
29 | * @param request - input to lambda handler
30 | * @param context - context object
31 | * @return greeting text
32 | */
33 | public Response handleRequest(final Request request, final Context context) {
34 | context.getLogger().log("Received Request: " + request);
35 |
36 | final SqsService sqsService = new SqsServiceImpl(this.sqsClient);
37 | return sqsService.createQueueAndSendMessage(request, context.getLogger());
38 |
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/Chapter06/creating-sqs-queue-and-sending-message-with-sdk/lambda-sqs-sdk-create-send/src/main/java/tech/heartin/books/serverlesscookbook/domain/Request.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.domain;
2 |
3 | import lombok.Data;
4 |
5 | /**
6 | * Request POJO.
7 | */
8 | @Data
9 | public class Request {
10 | private String queueName;
11 | private String message;
12 | }
13 |
--------------------------------------------------------------------------------
/Chapter06/creating-sqs-queue-and-sending-message-with-sdk/lambda-sqs-sdk-create-send/src/main/java/tech/heartin/books/serverlesscookbook/domain/Response.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.domain;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Data;
5 |
6 | /**
7 | * Response POJO.
8 | */
9 | @Data
10 | @AllArgsConstructor
11 | public class Response {
12 | private String message;
13 | }
14 |
--------------------------------------------------------------------------------
/Chapter06/creating-sqs-queue-and-sending-message-with-sdk/lambda-sqs-sdk-create-send/src/main/java/tech/heartin/books/serverlesscookbook/domain/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Domain objects.
3 | */
4 | package tech.heartin.books.serverlesscookbook.domain;
5 |
--------------------------------------------------------------------------------
/Chapter06/creating-sqs-queue-and-sending-message-with-sdk/lambda-sqs-sdk-create-send/src/main/java/tech/heartin/books/serverlesscookbook/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Package for lambdas.
3 | */
4 | package tech.heartin.books.serverlesscookbook;
5 |
--------------------------------------------------------------------------------
/Chapter06/creating-sqs-queue-and-sending-message-with-sdk/lambda-sqs-sdk-create-send/src/main/java/tech/heartin/books/serverlesscookbook/services/SqsService.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.services;
2 |
3 | import tech.heartin.books.serverlesscookbook.domain.Request;
4 | import tech.heartin.books.serverlesscookbook.domain.Response;
5 |
6 | import com.amazonaws.services.lambda.runtime.LambdaLogger;
7 |
8 | /**
9 | * Service class interface for SQS operations.
10 | */
11 | public interface SqsService {
12 |
13 | /**
14 | * Create queue and send message to SQS queue.
15 | * @param request Request domain object.
16 | * @param logger Lambda Logger from context.
17 | * @return Response domain object.
18 | */
19 | Response createQueueAndSendMessage(Request request, LambdaLogger logger);
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter06/creating-sqs-queue-and-sending-message-with-sdk/lambda-sqs-sdk-create-send/src/main/java/tech/heartin/books/serverlesscookbook/services/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Package for service classes.
3 | */
4 | package tech.heartin.books.serverlesscookbook.services;
5 |
--------------------------------------------------------------------------------
/Chapter06/creating-sqs-queue-and-sending-message-with-sdk/resources/basic-lambda-permissions.txt:
--------------------------------------------------------------------------------
1 | {
2 | "Version":"2012-10-17",
3 | "Statement":[
4 | {
5 | "Effect":"Allow",
6 | "Action":[
7 | "logs:CreateLogGroup",
8 | "logs:CreateLogStream",
9 | "logs:PutLogEvents"
10 | ],
11 | "Resource":[
12 | "arn:aws:logs:*:*:*"
13 | ]
14 | }
15 | ]
16 | }
--------------------------------------------------------------------------------
/Chapter06/creating-sqs-queue-and-sending-message-with-sdk/resources/iam-role-trust-relationship.txt:
--------------------------------------------------------------------------------
1 | {
2 | "Version": "2012-10-17",
3 | "Statement": [
4 | {
5 | "Effect": "Allow",
6 | "Principal": {
7 | "Service": "lambda.amazonaws.com"
8 | },
9 | "Action": "sts:AssumeRole"
10 | }
11 | ]
12 | }
--------------------------------------------------------------------------------
/Chapter06/creating-sqs-queue-and-sending-message-with-sdk/resources/lambda-sqs-create-send-permissions.txt:
--------------------------------------------------------------------------------
1 | {
2 | "Version":"2012-10-17",
3 | "Statement":[
4 | {
5 | "Effect":"Allow",
6 | "Action":[
7 | sqs:CreateQueue,
8 | sqs:GetQueueUrl,
9 | "sqs:SendMessage"
10 | ],
11 | "Resource":[
12 | "arn:aws:sqs:*:*:*"
13 | ]
14 | }
15 | ]
16 | }
--------------------------------------------------------------------------------
/Chapter06/creating-sqs-queue-and-sending-message-with-sdk/resources/payload.json:
--------------------------------------------------------------------------------
1 | {
2 | "queueName" : "create-send-demo-queue",
3 | "message": "test payload 1"
4 | }
--------------------------------------------------------------------------------
/Chapter06/invoking-lambda-with-sns-event/lambda-invoke-sns-event/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/Chapter06/invoking-lambda-with-sns-event/lambda-invoke-sns-event/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | tech.heartin.books.serverless-cookbook
8 | lambda-invoke-sns-event
9 | 0.0.1-SNAPSHOT
10 |
11 |
12 | tech.heartin.books.serverlesscookbook
13 | serverless-cookbook-parent-aws-java
14 | 0.0.1-SNAPSHOT
15 |
16 |
17 |
18 |
19 | com.amazonaws
20 | aws-lambda-java-core
21 | ${aws.lambda.java.core.version}
22 |
23 |
24 |
25 | com.amazonaws
26 | aws-lambda-java-events
27 | ${aws.lambda.java.events.version}
28 |
29 |
30 |
31 | com.amazonaws
32 | aws-java-sdk-sqs
33 | ${aws.sdk.version}
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/Chapter06/invoking-lambda-with-sns-event/lambda-invoke-sns-event/src/main/java/tech/heartin/books/serverlesscookbook/LambdaSnsEventHandler.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook;
2 |
3 | import com.amazonaws.services.lambda.runtime.Context;
4 | import com.amazonaws.services.lambda.runtime.RequestHandler;
5 | import com.amazonaws.services.lambda.runtime.events.SNSEvent;
6 | import com.amazonaws.services.sqs.AmazonSQS;
7 | import com.amazonaws.services.sqs.AmazonSQSClientBuilder;
8 |
9 | import tech.heartin.books.serverlesscookbook.services.SnsService;
10 | import tech.heartin.books.serverlesscookbook.services.SnsServiceImpl;
11 |
12 | /**
13 | * RequestHandler implementation.
14 | */
15 | public final class LambdaSnsEventHandler implements RequestHandler {
16 |
17 | private final AmazonSQS sqsClient;
18 |
19 | public LambdaSnsEventHandler() {
20 | this.sqsClient = AmazonSQSClientBuilder.standard()
21 | .withRegion(System.getenv("AWS_REGION"))
22 | .build();
23 | }
24 |
25 | /**
26 | * Handle request.
27 | *
28 | * @param snsEvent - SQS Event passed as input to lambda handler
29 | * @param context - context object
30 | * @return true if success, else false.
31 | */
32 | public Boolean handleRequest(final SNSEvent snsEvent, final Context context) {
33 | context.getLogger().log("Received SQS event: " + snsEvent);
34 |
35 | final SnsService snsService = new SnsServiceImpl(this.sqsClient);
36 | // It is a good practice to prefix environment variables with a project specific prefix.
37 | // E.g. SPC is a prefix that denote Serverless Programming Cookbook.
38 | return snsService.processEvent(snsEvent, System.getenv("SPC_OUTPUT_QUEUE_URL"), context.getLogger());
39 |
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/Chapter06/invoking-lambda-with-sns-event/lambda-invoke-sns-event/src/main/java/tech/heartin/books/serverlesscookbook/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Package for lambdas.
3 | */
4 | package tech.heartin.books.serverlesscookbook;
5 |
--------------------------------------------------------------------------------
/Chapter06/invoking-lambda-with-sns-event/lambda-invoke-sns-event/src/main/java/tech/heartin/books/serverlesscookbook/services/SnsService.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.services;
2 |
3 | import com.amazonaws.services.lambda.runtime.events.SNSEvent;
4 | import com.amazonaws.services.lambda.runtime.LambdaLogger;
5 |
6 | /**
7 | * Service class interface for SNS operations.
8 | */
9 | public interface SnsService {
10 |
11 | /**
12 | * Process SNSEvent.
13 | * @param event SQS event received.
14 | * @param outputQueueURL Output queue URL.
15 | * @param logger Lambda Logger from context.
16 | * @return Response domain object.
17 | */
18 | Boolean processEvent(SNSEvent event, String outputQueueURL, LambdaLogger logger);
19 | }
20 |
--------------------------------------------------------------------------------
/Chapter06/invoking-lambda-with-sns-event/lambda-invoke-sns-event/src/main/java/tech/heartin/books/serverlesscookbook/services/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Package for service classes.
3 | */
4 | package tech.heartin.books.serverlesscookbook.services;
5 |
--------------------------------------------------------------------------------
/Chapter06/invoking-lambda-with-sns-event/resources/basic-lambda-permissions.txt:
--------------------------------------------------------------------------------
1 | {
2 | "Version":"2012-10-17",
3 | "Statement":[
4 | {
5 | "Effect":"Allow",
6 | "Action":[
7 | "logs:CreateLogGroup",
8 | "logs:CreateLogStream",
9 | "logs:PutLogEvents"
10 | ],
11 | "Resource":[
12 | "arn:aws:logs:*:*:*"
13 | ]
14 | }
15 | ]
16 | }
--------------------------------------------------------------------------------
/Chapter06/invoking-lambda-with-sns-event/resources/iam-role-trust-relationship.txt:
--------------------------------------------------------------------------------
1 | {
2 | "Version": "2012-10-17",
3 | "Statement": [
4 | {
5 | "Effect": "Allow",
6 | "Principal": {
7 | "Service": "lambda.amazonaws.com"
8 | },
9 | "Action": "sts:AssumeRole"
10 | }
11 | ]
12 | }
--------------------------------------------------------------------------------
/Chapter06/invoking-lambda-with-sns-event/resources/lambda-invoke-sns-event-permissions.txt:
--------------------------------------------------------------------------------
1 | {
2 | "Version":"2012-10-17",
3 | "Statement":[
4 | {
5 | "Effect":"Allow",
6 | "Action":[
7 | "sqs:SendMessage",
8 | "sqs:SendMessageBatch"
9 | ],
10 | "Resource":[
11 | "arn:aws:sqs:*:*:*"
12 | ]
13 | }
14 | ]
15 | }
--------------------------------------------------------------------------------
/Chapter06/invoking-lambda-with-sqs-event/lambda-invoke-sqs-event/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/Chapter06/invoking-lambda-with-sqs-event/lambda-invoke-sqs-event/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | tech.heartin.books.serverless-cookbook
8 | lambda-invoke-sqs-event
9 | 0.0.1-SNAPSHOT
10 |
11 |
12 | tech.heartin.books.serverlesscookbook
13 | serverless-cookbook-parent-aws-java
14 | 0.0.1-SNAPSHOT
15 |
16 |
17 |
18 |
19 | com.amazonaws
20 | aws-lambda-java-core
21 | ${aws.lambda.java.core.version}
22 |
23 |
24 |
25 | com.amazonaws
26 | aws-lambda-java-events
27 | ${aws.lambda.java.events.version}
28 |
29 |
30 |
31 | com.amazonaws
32 | aws-java-sdk-sqs
33 | ${aws.sdk.version}
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/Chapter06/invoking-lambda-with-sqs-event/lambda-invoke-sqs-event/src/main/java/tech/heartin/books/serverlesscookbook/LambdaSqsEventHandler.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook;
2 |
3 | import com.amazonaws.services.lambda.runtime.Context;
4 | import com.amazonaws.services.lambda.runtime.RequestHandler;
5 | import com.amazonaws.services.lambda.runtime.events.SQSEvent;
6 | import com.amazonaws.services.sqs.AmazonSQS;
7 | import com.amazonaws.services.sqs.AmazonSQSClientBuilder;
8 |
9 | import tech.heartin.books.serverlesscookbook.services.SqsService;
10 | import tech.heartin.books.serverlesscookbook.services.SqsServiceImpl;
11 |
12 | /**
13 | * RequestHandler implementation.
14 | */
15 | public final class LambdaSqsEventHandler implements RequestHandler {
16 |
17 | private final AmazonSQS sqsClient;
18 |
19 | public LambdaSqsEventHandler() {
20 | this.sqsClient = AmazonSQSClientBuilder.standard()
21 | .withRegion(System.getenv("AWS_REGION"))
22 | .build();
23 | }
24 |
25 | /**
26 | * Handle request.
27 | *
28 | * @param sqsEvent - SQS Event passed as input to lambda handler
29 | * @param context - context object
30 | * @return true if success, else false.
31 | */
32 | public Boolean handleRequest(final SQSEvent sqsEvent, final Context context) {
33 | context.getLogger().log("Received SQS event: " + sqsEvent);
34 |
35 | final SqsService sqsService = new SqsServiceImpl(this.sqsClient);
36 | // It is a good practice to prefix environment variables with a project specific prefix.
37 | // E.g. SPC is a prefix that denote Serverless Programming Cookbook.
38 | return sqsService.processEvent(sqsEvent, System.getenv("SPC_OUTPUT_QUEUE_URL"), context.getLogger());
39 |
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/Chapter06/invoking-lambda-with-sqs-event/lambda-invoke-sqs-event/src/main/java/tech/heartin/books/serverlesscookbook/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Package for lambdas.
3 | */
4 | package tech.heartin.books.serverlesscookbook;
5 |
--------------------------------------------------------------------------------
/Chapter06/invoking-lambda-with-sqs-event/lambda-invoke-sqs-event/src/main/java/tech/heartin/books/serverlesscookbook/services/SqsService.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.services;
2 |
3 | import com.amazonaws.services.lambda.runtime.events.SQSEvent;
4 |
5 | import com.amazonaws.services.lambda.runtime.LambdaLogger;
6 |
7 | /**
8 | * Service class interface for SQS operations.
9 | */
10 | public interface SqsService {
11 |
12 | /**
13 | * Process SQSEvent.
14 | * @param event SQS event received.
15 | * @param outputQueueURL Output queue URL.
16 | * @param logger Lambda Logger from context.
17 | * @return Response domain object.
18 | */
19 | Boolean processEvent(SQSEvent event, String outputQueueURL, LambdaLogger logger);
20 | }
21 |
--------------------------------------------------------------------------------
/Chapter06/invoking-lambda-with-sqs-event/lambda-invoke-sqs-event/src/main/java/tech/heartin/books/serverlesscookbook/services/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Package for service classes.
3 | */
4 | package tech.heartin.books.serverlesscookbook.services;
5 |
--------------------------------------------------------------------------------
/Chapter06/invoking-lambda-with-sqs-event/resources/basic-lambda-permissions.txt:
--------------------------------------------------------------------------------
1 | {
2 | "Version":"2012-10-17",
3 | "Statement":[
4 | {
5 | "Effect":"Allow",
6 | "Action":[
7 | "logs:CreateLogGroup",
8 | "logs:CreateLogStream",
9 | "logs:PutLogEvents"
10 | ],
11 | "Resource":[
12 | "arn:aws:logs:*:*:*"
13 | ]
14 | }
15 | ]
16 | }
--------------------------------------------------------------------------------
/Chapter06/invoking-lambda-with-sqs-event/resources/iam-role-trust-relationship.txt:
--------------------------------------------------------------------------------
1 | {
2 | "Version": "2012-10-17",
3 | "Statement": [
4 | {
5 | "Effect": "Allow",
6 | "Principal": {
7 | "Service": "lambda.amazonaws.com"
8 | },
9 | "Action": "sts:AssumeRole"
10 | }
11 | ]
12 | }
--------------------------------------------------------------------------------
/Chapter06/invoking-lambda-with-sqs-event/resources/lambda-invoke-sqs-event-permissions.txt:
--------------------------------------------------------------------------------
1 | {
2 | "Version":"2012-10-17",
3 | "Statement":[
4 | {
5 | "Effect":"Allow",
6 | "Action":[
7 | "sqs:GetQueueAttributes",
8 | "sqs:ReceiveMessage",
9 | "sqs:DeleteMessage",
10 | "sqs:SendMessage",
11 | "sqs:SendMessageBatch"
12 | ],
13 | "Resource":[
14 | "arn:aws:sqs:*:*:*"
15 | ]
16 | }
17 | ]
18 | }
--------------------------------------------------------------------------------
/Chapter06/publishing-to-sns-topic-with-sdk/lambda-sns-publish-with-sdk/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/Chapter06/publishing-to-sns-topic-with-sdk/lambda-sns-publish-with-sdk/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | tech.heartin.books.serverless-cookbook
8 | lambda-sns-publish-with-sdk
9 | 0.0.1-SNAPSHOT
10 |
11 |
12 | tech.heartin.books.serverlesscookbook
13 | serverless-cookbook-parent-aws-java
14 | 0.0.1-SNAPSHOT
15 |
16 |
17 |
18 |
19 | com.amazonaws
20 | aws-lambda-java-core
21 | ${aws.lambda.java.core.version}
22 |
23 |
24 |
25 | com.amazonaws
26 | aws-java-sdk-sns
27 | ${aws.sdk.version}
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/Chapter06/publishing-to-sns-topic-with-sdk/lambda-sns-publish-with-sdk/src/main/java/tech/heartin/books/serverlesscookbook/LambdaSnsPublishHandler.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook;
2 |
3 | import com.amazonaws.services.lambda.runtime.Context;
4 | import com.amazonaws.services.lambda.runtime.RequestHandler;
5 | import com.amazonaws.services.sns.AmazonSNS;
6 | import com.amazonaws.services.sns.AmazonSNSClientBuilder;
7 | import com.amazonaws.services.sns.model.PublishRequest;
8 | import com.amazonaws.services.sns.model.PublishResult;
9 |
10 | import tech.heartin.books.serverlesscookbook.domain.Request;
11 |
12 | /**
13 | * RequestHandler implementation.
14 | */
15 | public final class LambdaSnsPublishHandler implements RequestHandler {
16 |
17 | private final AmazonSNS snsClient;
18 |
19 | public LambdaSnsPublishHandler() {
20 | this.snsClient = AmazonSNSClientBuilder.standard()
21 | .withRegion(System.getenv("AWS_REGION"))
22 | .build();
23 | }
24 |
25 | /**
26 | * Handle request.
27 | *
28 | * @param request - input to lambda handler.
29 | * @param context - context object.
30 | * @return Message id of the published message.
31 | */
32 | public String handleRequest(final Request request, final Context context) {
33 | context.getLogger().log("Received Request: " + request);
34 |
35 | final PublishResult result;
36 | try {
37 | PublishRequest publishRequest = new PublishRequest(request.getTopicArn(), request.getMessage());
38 | result = snsClient.publish(publishRequest);
39 | } catch (Exception e) {
40 | return "Exception occurred: " + e.getMessage();
41 | }
42 |
43 | return "Message Id: " + result.getMessageId();
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/Chapter06/publishing-to-sns-topic-with-sdk/lambda-sns-publish-with-sdk/src/main/java/tech/heartin/books/serverlesscookbook/domain/Request.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.domain;
2 |
3 | import lombok.Data;
4 |
5 | /**
6 | * Request POJO.
7 | */
8 | @Data
9 | public class Request {
10 | private String topicArn;
11 | private String message;
12 | }
13 |
--------------------------------------------------------------------------------
/Chapter06/publishing-to-sns-topic-with-sdk/lambda-sns-publish-with-sdk/src/main/java/tech/heartin/books/serverlesscookbook/domain/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Domain objects.
3 | */
4 | package tech.heartin.books.serverlesscookbook.domain;
5 |
--------------------------------------------------------------------------------
/Chapter06/publishing-to-sns-topic-with-sdk/lambda-sns-publish-with-sdk/src/main/java/tech/heartin/books/serverlesscookbook/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Package for lambdas.
3 | */
4 | package tech.heartin.books.serverlesscookbook;
5 |
--------------------------------------------------------------------------------
/Chapter06/publishing-to-sns-topic-with-sdk/resources/basic-lambda-permissions.txt:
--------------------------------------------------------------------------------
1 | {
2 | "Version":"2012-10-17",
3 | "Statement":[
4 | {
5 | "Effect":"Allow",
6 | "Action":[
7 | "logs:CreateLogGroup",
8 | "logs:CreateLogStream",
9 | "logs:PutLogEvents"
10 | ],
11 | "Resource":[
12 | "arn:aws:logs:*:*:*"
13 | ]
14 | }
15 | ]
16 | }
--------------------------------------------------------------------------------
/Chapter06/publishing-to-sns-topic-with-sdk/resources/iam-role-trust-relationship.txt:
--------------------------------------------------------------------------------
1 | {
2 | "Version": "2012-10-17",
3 | "Statement": [
4 | {
5 | "Effect": "Allow",
6 | "Principal": {
7 | "Service": "lambda.amazonaws.com"
8 | },
9 | "Action": "sts:AssumeRole"
10 | }
11 | ]
12 | }
--------------------------------------------------------------------------------
/Chapter06/publishing-to-sns-topic-with-sdk/resources/lambda-sns-publish-permissions.txt:
--------------------------------------------------------------------------------
1 | {
2 | "Version":"2012-10-17",
3 | "Statement":[
4 | {
5 | "Effect":"Allow",
6 | "Action":[
7 | "sns:Publish"
8 | ],
9 | "Resource":[
10 | "arn:aws:sns:*:*:*"
11 | ]
12 | }
13 | ]
14 | }
--------------------------------------------------------------------------------
/Chapter06/publishing-to-sns-topic-with-sdk/resources/payload.json:
--------------------------------------------------------------------------------
1 | {
2 | "topicArn" : "arn:aws:sns:us-east-1:123456789012:my-first-sns-topic",
3 | "message": "test payload 1"
4 | }
--------------------------------------------------------------------------------
/Chapter06/receiving-and-sending-sqs-messages-in-batch-with-sdk/lambda-sqs-sdk-receive-send-batch/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/Chapter06/receiving-and-sending-sqs-messages-in-batch-with-sdk/lambda-sqs-sdk-receive-send-batch/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | tech.heartin.books.serverless-cookbook
8 | lambda-sqs-sdk-receive-send-batch
9 | 0.0.1-SNAPSHOT
10 |
11 |
12 | tech.heartin.books.serverlesscookbook
13 | serverless-cookbook-parent-aws-java
14 | 0.0.1-SNAPSHOT
15 |
16 |
17 |
18 |
19 | com.amazonaws
20 | aws-lambda-java-core
21 | ${aws.lambda.java.core.version}
22 |
23 |
24 |
25 | com.amazonaws
26 | aws-java-sdk-sqs
27 | ${aws.sdk.version}
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/Chapter06/receiving-and-sending-sqs-messages-in-batch-with-sdk/lambda-sqs-sdk-receive-send-batch/src/main/java/tech/heartin/books/serverlesscookbook/LambdaSqsSdkReceiveSendBatchHandler.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook;
2 |
3 | import com.amazonaws.services.lambda.runtime.Context;
4 | import com.amazonaws.services.lambda.runtime.RequestHandler;
5 |
6 | import com.amazonaws.services.sqs.AmazonSQS;
7 | import com.amazonaws.services.sqs.AmazonSQSClientBuilder;
8 | import tech.heartin.books.serverlesscookbook.domain.Request;
9 | import tech.heartin.books.serverlesscookbook.domain.Response;
10 | import tech.heartin.books.serverlesscookbook.services.SqsService;
11 | import tech.heartin.books.serverlesscookbook.services.SqsServiceImpl;
12 |
13 | /**
14 | * RequestHandler implementation.
15 | */
16 | public final class LambdaSqsSdkReceiveSendBatchHandler implements RequestHandler {
17 |
18 |
19 | private final AmazonSQS sqsClient;
20 |
21 | public LambdaSqsSdkReceiveSendBatchHandler() {
22 | this.sqsClient = AmazonSQSClientBuilder.standard()
23 | .withRegion(System.getenv("AWS_REGION"))
24 | .build();
25 | }
26 |
27 | /**
28 | * Handle request.
29 | *
30 | * @param request - input to lambda handler
31 | * @param context - context object
32 | * @return greeting text
33 | */
34 | public Response handleRequest(final Request request, final Context context) {
35 | context.getLogger().log("Received Request: " + request);
36 |
37 | final SqsService sqsService = new SqsServiceImpl(this.sqsClient);
38 | return sqsService.sendMessage(request, context.getLogger());
39 |
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/Chapter06/receiving-and-sending-sqs-messages-in-batch-with-sdk/lambda-sqs-sdk-receive-send-batch/src/main/java/tech/heartin/books/serverlesscookbook/domain/Request.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.domain;
2 |
3 | import lombok.Data;
4 |
5 | /**
6 | * Request POJO.
7 | */
8 | @Data
9 | public class Request {
10 | private String inputQueueURL;
11 | private String outputQueueURL;
12 | private int maxMessagesToReceive;
13 | private int delay;
14 | }
15 |
--------------------------------------------------------------------------------
/Chapter06/receiving-and-sending-sqs-messages-in-batch-with-sdk/lambda-sqs-sdk-receive-send-batch/src/main/java/tech/heartin/books/serverlesscookbook/domain/Response.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.domain;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Data;
5 |
6 | /**
7 | * Response POJO.
8 | */
9 | @Data
10 | @AllArgsConstructor
11 | public class Response {
12 | private String message;
13 | }
14 |
--------------------------------------------------------------------------------
/Chapter06/receiving-and-sending-sqs-messages-in-batch-with-sdk/lambda-sqs-sdk-receive-send-batch/src/main/java/tech/heartin/books/serverlesscookbook/domain/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Domain objects.
3 | */
4 | package tech.heartin.books.serverlesscookbook.domain;
5 |
--------------------------------------------------------------------------------
/Chapter06/receiving-and-sending-sqs-messages-in-batch-with-sdk/lambda-sqs-sdk-receive-send-batch/src/main/java/tech/heartin/books/serverlesscookbook/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Package for lambdas.
3 | */
4 | package tech.heartin.books.serverlesscookbook;
5 |
--------------------------------------------------------------------------------
/Chapter06/receiving-and-sending-sqs-messages-in-batch-with-sdk/lambda-sqs-sdk-receive-send-batch/src/main/java/tech/heartin/books/serverlesscookbook/services/SqsService.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.services;
2 |
3 | import tech.heartin.books.serverlesscookbook.domain.Request;
4 | import tech.heartin.books.serverlesscookbook.domain.Response;
5 |
6 | import com.amazonaws.services.lambda.runtime.LambdaLogger;
7 |
8 | /**
9 | * Service class interface for SQS operations.
10 | */
11 | public interface SqsService {
12 |
13 | /**
14 | * Send message to SQS queue.
15 | * @param request Request domain object.
16 | * @param logger Lambda Logger from context.
17 | * @return Response domain object.
18 | */
19 | Response sendMessage(Request request, LambdaLogger logger);
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter06/receiving-and-sending-sqs-messages-in-batch-with-sdk/lambda-sqs-sdk-receive-send-batch/src/main/java/tech/heartin/books/serverlesscookbook/services/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Package for service classes.
3 | */
4 | package tech.heartin.books.serverlesscookbook.services;
5 |
--------------------------------------------------------------------------------
/Chapter06/receiving-and-sending-sqs-messages-in-batch-with-sdk/resources/basic-lambda-permissions.txt:
--------------------------------------------------------------------------------
1 | {
2 | "Version":"2012-10-17",
3 | "Statement":[
4 | {
5 | "Effect":"Allow",
6 | "Action":[
7 | "logs:CreateLogGroup",
8 | "logs:CreateLogStream",
9 | "logs:PutLogEvents"
10 | ],
11 | "Resource":[
12 | "arn:aws:logs:*:*:*"
13 | ]
14 | }
15 | ]
16 | }
--------------------------------------------------------------------------------
/Chapter06/receiving-and-sending-sqs-messages-in-batch-with-sdk/resources/iam-role-trust-relationship.txt:
--------------------------------------------------------------------------------
1 | {
2 | "Version": "2012-10-17",
3 | "Statement": [
4 | {
5 | "Effect": "Allow",
6 | "Principal": {
7 | "Service": "lambda.amazonaws.com"
8 | },
9 | "Action": "sts:AssumeRole"
10 | }
11 | ]
12 | }
--------------------------------------------------------------------------------
/Chapter06/receiving-and-sending-sqs-messages-in-batch-with-sdk/resources/lambda-sqs-receive-send-batch-permissions.txt:
--------------------------------------------------------------------------------
1 | {
2 | "Version":"2012-10-17",
3 | "Statement":[
4 | {
5 | "Effect":"Allow",
6 | "Action":[
7 | "sqs:ReceiveMessage",
8 | "sqs:SendMessage",
9 | "sqs:SendMessageBatch",
10 | "sqs:DeleteQueue"
11 | ],
12 | "Resource":[
13 | "arn:aws:sqs:*:*:*"
14 | ]
15 | }
16 | ]
17 | }
--------------------------------------------------------------------------------
/Chapter06/receiving-and-sending-sqs-messages-in-batch-with-sdk/resources/payload.json:
--------------------------------------------------------------------------------
1 | {
2 | "inputQueueURL" : "https://queue.amazonaws.com/123456789012/my-input-queue",
3 | "outputQueueURL" : "https://queue.amazonaws.com/123456789012/my-output-queue",
4 | "maxMessagesToReceive" : 5,
5 | "delay": 10
6 | }
--------------------------------------------------------------------------------
/Chapter06/your-first-sns-topic/resources/cf-stack-deploy-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws cloudformation create-stack \
2 | --stack-name snsfirststack \
3 | --template-body file://sns-topic-cf-template.yml \
4 | --region us-east-1 \
5 | --profile admin
6 |
7 | aws cloudformation describe-stacks \
8 | --stack-name snsfirststack \
9 | --region us-east-1 \
10 | --profile admin
11 |
12 | aws cloudformation delete-stack \
13 | --stack-name snsfirststack \
14 | --region us-east-1 \
15 | --profile admin
16 |
--------------------------------------------------------------------------------
/Chapter06/your-first-sns-topic/resources/sns-topic-cf-template.yml:
--------------------------------------------------------------------------------
1 | ---
2 | AWSTemplateFormatVersion: '2010-09-09'
3 | Description: 'My first SNS topic'
4 |
5 | Resources:
6 | SNSTopic:
7 | Type: AWS::SNS::Topic
8 | Properties:
9 | DisplayName: 'My first SNS topic'
10 | TopicName: my-first-sns-topic-cf
11 |
12 | Outputs:
13 | SNSTopicARN:
14 | Value: !Ref SNSTopic
15 | Export:
16 | Name: "SNSTopicARN"
17 | SNSTopicName:
18 | Value: !GetAtt SNSTopic.TopicName
19 | Export:
20 | Name: "SNSTopicName"
--------------------------------------------------------------------------------
/Chapter06/your-first-sns-topic/resources/your-first-sns-topic-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws sns create-topic \
2 | --name my-first-sns-topic \
3 | --profile admin
4 |
5 | aws sns subscribe \
6 | --topic-arn arn:aws:sns:us-east-1:123456789012:my-first-sns-topic \
7 | --protocol sms \
8 | --notification-endpoint +917411174114 \
9 | --profile admin
10 |
11 | aws sns subscribe \
12 | --topic-arn arn:aws:sns:us-east-1:123456789012:my-first-sns-topic \
13 | --protocol email \
14 | --notification-endpoint serverlesscookbook@gmail.com \
15 | --profile admin
16 |
17 | aws sns list-subscriptions \
18 | --profile admin
19 |
20 | aws sns list-subscriptions-by-topic \
21 | --topic-arn arn:aws:sns:us-east-1:123456789012:my-first-sns-topic \
22 | --profile admin
23 |
24 | aws sns publish \
25 | --topic-arn arn:aws:sns:us-east-1:123456789012:my-first-sns-topic \
26 | --message "sending message to both mobile and email" \
27 | --profile admin
28 |
29 |
30 |
31 | -- Cleanup --
32 |
33 | aws sns unsubscribe \
34 | --subscription-arn arn:aws:sns:us-east-1:123456789012:my-first-sns-topic:f4adc47e-c4a4-4e9c-a8c4-e51394832de2 \
35 | --profile admin
36 |
37 | aws sns delete-topic \
38 | --topic-arn arn:aws:sns:us-east-1:123456789012:my-first-sns-topic \
39 | --profile admin
--------------------------------------------------------------------------------
/Chapter06/your-first-sqs-queue/resources/cf-stack-deploy-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws cloudformation create-stack \
2 | --stack-name sqsfirststack \
3 | --template-body file://sqs-queue-cf-template.yml \
4 | --region us-east-1 \
5 | --profile admin
6 |
7 | aws cloudformation describe-stacks \
8 | --stack-name sqsfirststack \
9 | --region us-east-1 \
10 | --profile admin
11 |
12 | aws cloudformation delete-stack \
13 | --stack-name sqsfirststack \
14 | --region us-east-1 \
15 | --profile admin
16 |
--------------------------------------------------------------------------------
/Chapter06/your-first-sqs-queue/resources/sqs-queue-cf-template.yml:
--------------------------------------------------------------------------------
1 | ---
2 | AWSTemplateFormatVersion: '2010-09-09'
3 | Description: 'My first SQS queue'
4 |
5 | Resources:
6 | SQSQueue:
7 | Type: AWS::SQS::Queue
8 | Properties:
9 | QueueName: my-first-sqs-queue-cf
10 |
11 | Outputs:
12 | SQSQueueURL:
13 | Value: !Ref SQSQueue
14 | Export:
15 | Name: "SQSQueueURL"
16 | SQSQueueArn:
17 | Value: !GetAtt SQSQueue.Arn
18 | Export:
19 | Name: "SQSQueueArn"
20 |
--------------------------------------------------------------------------------
/Chapter06/your-first-sqs-queue/resources/your-first-sqs-queue-cli-commands.txt:
--------------------------------------------------------------------------------
1 | -- Recipe steps --
2 |
3 | aws sqs create-queue \
4 | --queue-name 'my-first-queue' \
5 | --profile admin
6 |
7 | aws sqs send-message \
8 | --queue-url https://queue.amazonaws.com/123456789012/my-first-queue \
9 | --message-body 'This is a test message' \
10 | --profile admin
11 |
12 | aws sqs receive-message \
13 | --queue-url https://queue.amazonaws.com/123456789012/my-first-queue \
14 | --profile admin
15 |
16 |
17 |
18 | -- Cleanup --
19 |
20 | aws sqs delete-queue \
21 | --queue-url 'queue-url https://queue.amazonaws.com/123456789012/my-first-queue' \
22 | --profile admin
--------------------------------------------------------------------------------
/Chapter07/building-and-testing-alexa-skill/lambda-alexa-simple-intro/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/Chapter07/building-and-testing-alexa-skill/lambda-alexa-simple-intro/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | tech.heartin.books.serverless-cookbook
8 | lambda-alexa-simple-intro
9 | 0.0.1-SNAPSHOT
10 |
11 |
12 | tech.heartin.books.serverlesscookbook
13 | serverless-cookbook-parent-aws-java
14 | 0.0.1-SNAPSHOT
15 |
16 |
17 |
18 |
19 | com.amazonaws
20 | aws-lambda-java-core
21 | ${aws.lambda.java.core.version}
22 |
23 |
24 |
25 |
26 | com.amazon.alexa
27 | ask-sdk
28 | ${ask.sdk.version}
29 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/Chapter07/building-and-testing-alexa-skill/lambda-alexa-simple-intro/src/main/java/tech/heartin/books/serverlesscookbook/CancelandStopIntentHandler.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook;
2 |
3 | import com.amazon.ask.dispatcher.request.handler.HandlerInput;
4 | import com.amazon.ask.dispatcher.request.handler.RequestHandler;
5 | import com.amazon.ask.model.Response;
6 | import static com.amazon.ask.request.Predicates.intentName;
7 |
8 | import java.util.Optional;
9 |
10 | /**
11 | * RequestHandler implementation.
12 | */
13 | public class CancelandStopIntentHandler implements RequestHandler {
14 |
15 | @Override
16 | public final boolean canHandle(final HandlerInput input) {
17 | return input.matches(intentName("AMAZON.StopIntent").or(intentName("AMAZON.CancelIntent")));
18 | }
19 |
20 | @Override
21 | public final Optional handle(final HandlerInput input) {
22 | return input.getResponseBuilder()
23 | .withSpeech("Goodbye buddy")
24 | .withSimpleCard("SelfIntro", "Goodbye")
25 | .build();
26 | }
27 |
28 | }
29 |
--------------------------------------------------------------------------------
/Chapter07/building-and-testing-alexa-skill/lambda-alexa-simple-intro/src/main/java/tech/heartin/books/serverlesscookbook/FallbackIntentHandler.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook;
2 |
3 | import com.amazon.ask.dispatcher.request.handler.HandlerInput;
4 | import com.amazon.ask.dispatcher.request.handler.RequestHandler;
5 | import com.amazon.ask.model.Response;
6 |
7 | import java.util.Optional;
8 |
9 | import static com.amazon.ask.request.Predicates.intentName;
10 |
11 | /**
12 | * RequestHandler implementation.
13 | */
14 | public class FallbackIntentHandler implements RequestHandler {
15 |
16 | @Override
17 | public final boolean canHandle(final HandlerInput input) {
18 | return input.matches(intentName("AMAZON.FallbackIntent"));
19 | }
20 |
21 | @Override
22 | public final Optional handle(final HandlerInput input) {
23 | String speechText = "Sorry buddy, I don't know that. You can say try saying help!";
24 | return input.getResponseBuilder()
25 | .withSpeech(speechText)
26 | .withSimpleCard("SelfIntro", speechText)
27 | .withReprompt(speechText)
28 | .build();
29 | }
30 |
31 | }
32 |
--------------------------------------------------------------------------------
/Chapter07/building-and-testing-alexa-skill/lambda-alexa-simple-intro/src/main/java/tech/heartin/books/serverlesscookbook/HelpIntentHandler.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook;
2 |
3 | import com.amazon.ask.dispatcher.request.handler.HandlerInput;
4 | import com.amazon.ask.dispatcher.request.handler.RequestHandler;
5 | import com.amazon.ask.model.Response;
6 | import static com.amazon.ask.request.Predicates.intentName;
7 |
8 | import java.util.Optional;
9 |
10 | /**
11 | * RequestHandler implementation.
12 | */
13 | public class HelpIntentHandler implements RequestHandler {
14 |
15 | @Override
16 | public final boolean canHandle(final HandlerInput input) {
17 | return input.matches(intentName("AMAZON.HelpIntent"));
18 | }
19 |
20 | @Override
21 | public final Optional handle(final HandlerInput input) {
22 | String speechText = "You you may say 'please say intro'!";
23 | return input.getResponseBuilder()
24 | .withSpeech(speechText)
25 | .withSimpleCard("SelfIntro", speechText)
26 | .withReprompt(speechText)
27 | .build();
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/Chapter07/building-and-testing-alexa-skill/lambda-alexa-simple-intro/src/main/java/tech/heartin/books/serverlesscookbook/LaunchRequestHandler.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook;
2 |
3 | import com.amazon.ask.dispatcher.request.handler.HandlerInput;
4 | import com.amazon.ask.dispatcher.request.handler.RequestHandler;
5 | import com.amazon.ask.model.LaunchRequest;
6 | import com.amazon.ask.model.Response;
7 | import com.amazon.ask.request.Predicates;
8 |
9 | import java.util.Optional;
10 |
11 | /**
12 | * RequestHandler implementation.
13 | */
14 | public class LaunchRequestHandler implements RequestHandler {
15 |
16 | @Override
17 | public final boolean canHandle(final HandlerInput input) {
18 | return input.matches(Predicates.requestType(LaunchRequest.class));
19 | }
20 |
21 | @Override
22 | public final Optional handle(final HandlerInput input) {
23 | String speechText = "Welcome to the Self Intro Alexa Skill for Heartin, you may say 'please say intro'";
24 | return input.getResponseBuilder()
25 | .withSpeech(speechText)
26 | .withSimpleCard("SelfIntro", speechText)
27 | .withReprompt(speechText)
28 | .build();
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/Chapter07/building-and-testing-alexa-skill/lambda-alexa-simple-intro/src/main/java/tech/heartin/books/serverlesscookbook/SelfIntroIntentHandler.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook;
2 |
3 | import com.amazon.ask.dispatcher.request.handler.HandlerInput;
4 | import com.amazon.ask.dispatcher.request.handler.RequestHandler;
5 | import com.amazon.ask.model.Response;
6 | import com.amazon.ask.request.Predicates;
7 |
8 | import java.util.Optional;
9 |
10 | /**
11 | * RequestHandler implementation.
12 | */
13 | public class SelfIntroIntentHandler implements RequestHandler {
14 |
15 | @Override
16 | public final boolean canHandle(final HandlerInput input) {
17 | return input.matches(Predicates.intentName("SelfIntroIntent"));
18 | }
19 |
20 | @Override
21 | public final Optional handle(final HandlerInput input) {
22 | String speechText = "Hello, this is Alexa saying intro for Heartin Kanikathottu. "
23 | + "Heartin is a senior software engineer and blogger with around 11 years of IT experience. "
24 | + "He likes to share his technical knowledge through his blogs such as CloudMaterials.com "
25 | + "and Java J EE dot com. "
26 | + "He also likes to mentor juniors and take sessions at meetups and conferences.";
27 |
28 | return input.getResponseBuilder()
29 | .withSpeech(speechText)
30 | .withSimpleCard("SelfIntro", speechText)
31 | .build();
32 | }
33 |
34 | }
35 |
--------------------------------------------------------------------------------
/Chapter07/building-and-testing-alexa-skill/lambda-alexa-simple-intro/src/main/java/tech/heartin/books/serverlesscookbook/SelfIntroStreamHandler.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook;
2 |
3 | import com.amazon.ask.Skill;
4 | import com.amazon.ask.Skills;
5 | import com.amazon.ask.SkillStreamHandler;
6 |
7 | /**
8 | * RequestHandler implementation.
9 | */
10 | public class SelfIntroStreamHandler extends SkillStreamHandler {
11 |
12 | private static Skill skill = Skills.standard()
13 | .addRequestHandlers(
14 | new CancelandStopIntentHandler(),
15 | new SelfIntroIntentHandler(),
16 | new HelpIntentHandler(),
17 | new LaunchRequestHandler(),
18 | new SessionEndedRequestHandler())
19 | .build();
20 |
21 | public SelfIntroStreamHandler() {
22 | super(skill);
23 | }
24 |
25 | }
26 |
--------------------------------------------------------------------------------
/Chapter07/building-and-testing-alexa-skill/lambda-alexa-simple-intro/src/main/java/tech/heartin/books/serverlesscookbook/SessionEndedRequestHandler.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook;
2 |
3 | import com.amazon.ask.dispatcher.request.handler.HandlerInput;
4 | import com.amazon.ask.dispatcher.request.handler.RequestHandler;
5 | import com.amazon.ask.model.Response;
6 | import com.amazon.ask.model.SessionEndedRequest;
7 | import static com.amazon.ask.request.Predicates.requestType;
8 |
9 | import java.util.Optional;
10 |
11 | /**
12 | * RequestHandler implementation.
13 | */
14 | public class SessionEndedRequestHandler implements RequestHandler {
15 |
16 | @Override
17 | public final boolean canHandle(final HandlerInput input) {
18 | return input.matches(requestType(SessionEndedRequest.class));
19 | }
20 |
21 | @Override
22 | public final Optional handle(final HandlerInput input) {
23 | //any cleanup logic goes here
24 | return input.getResponseBuilder().build();
25 | }
26 |
27 | }
28 |
--------------------------------------------------------------------------------
/Chapter07/building-and-testing-alexa-skill/lambda-alexa-simple-intro/src/main/java/tech/heartin/books/serverlesscookbook/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Package for lambdas.
3 | */
4 | package tech.heartin.books.serverlesscookbook;
5 |
--------------------------------------------------------------------------------
/Chapter07/building-and-testing-alexa-skill/resources/alexa-skill-cli-commands.txt:
--------------------------------------------------------------------------------
1 | -- install and configure ask cli --
2 |
3 | npm install -g ask-cli
4 |
5 | ask init
6 |
7 |
8 | -- Working with Alexa skill --
9 |
10 | ask api create-skill \
11 | --file skill.json
12 |
13 | ask api update-model \
14 | --skill-id amzn1.ask.skill.a585bf93-15bb-4361-ab56-ffbdc66027fd \
15 | --file en-US.json \
16 | --locale en-US
17 |
18 | ask api update-model \
19 | --skill-id amzn1.ask.skill.a585bf93-15bb-4361-ab56-ffbdc66027fd \
20 | --file en-IN.json \
21 | --locale en-IN
22 |
23 | ask api enable-skill \
24 | --skill-id amzn1.ask.skill.a585bf93-15bb-4361-ab56-ffbdc66027fd
25 |
26 |
--------------------------------------------------------------------------------
/Chapter07/building-and-testing-alexa-skill/resources/basic-lambda-permissions.txt:
--------------------------------------------------------------------------------
1 | {
2 | "Version":"2012-10-17",
3 | "Statement":[
4 | {
5 | "Effect":"Allow",
6 | "Action":[
7 | "logs:CreateLogGroup",
8 | "logs:CreateLogStream",
9 | "logs:PutLogEvents"
10 | ],
11 | "Resource":[
12 | "arn:aws:logs:*:*:*"
13 | ]
14 | }
15 | ]
16 | }
--------------------------------------------------------------------------------
/Chapter07/building-and-testing-alexa-skill/resources/en-IN.json:
--------------------------------------------------------------------------------
1 | {
2 | "interactionModel": {
3 | "languageModel": {
4 | "invocationName": "self intro",
5 | "intents": [
6 | {
7 | "name": "AMAZON.CancelIntent",
8 | "samples": []
9 | },
10 | {
11 | "name": "AMAZON.HelpIntent",
12 | "samples": []
13 | },
14 | {
15 | "name": "AMAZON.StopIntent",
16 | "samples": []
17 | },
18 | {
19 | "name": "SelfIntroIntent",
20 | "samples": [
21 | "please say intro",
22 | "say intro",
23 | "please say intro for",
24 | "say intro for",
25 | "intro",
26 | "intro for"
27 | ]
28 | }
29 | ]
30 | }
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/Chapter07/building-and-testing-alexa-skill/resources/en-US.json:
--------------------------------------------------------------------------------
1 | {
2 | "interactionModel": {
3 | "languageModel": {
4 | "invocationName": "self intro",
5 | "intents": [
6 | {
7 | "name": "AMAZON.CancelIntent",
8 | "samples": []
9 | },
10 | {
11 | "name": "AMAZON.HelpIntent",
12 | "samples": []
13 | },
14 | {
15 | "name": "AMAZON.StopIntent",
16 | "samples": []
17 | },
18 | {
19 | "name": "SelfIntroIntent",
20 | "samples": [
21 | "please say intro",
22 | "say intro",
23 | "please say intro for",
24 | "say intro for",
25 | "intro",
26 | "intro for"
27 | ]
28 | }
29 | ]
30 | }
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/Chapter07/building-and-testing-alexa-skill/resources/iam-role-trust-relationship.txt:
--------------------------------------------------------------------------------
1 | {
2 | "Version": "2012-10-17",
3 | "Statement": [
4 | {
5 | "Effect": "Allow",
6 | "Principal": {
7 | "Service": "lambda.amazonaws.com"
8 | },
9 | "Action": "sts:AssumeRole"
10 | }
11 | ]
12 | }
--------------------------------------------------------------------------------
/Chapter07/building-and-testing-alexa-skill/resources/skill.json:
--------------------------------------------------------------------------------
1 | {
2 | "manifest": {
3 | "publishingInformation": {
4 | "locales": {
5 | "en-US": {
6 | "summary": "A simple skill to say introduction for someone",
7 | "examplePhrases": [
8 | "Alexa please say intro",
9 | "say intro",
10 | "help"
11 | ],
12 | "name": "self-intro",
13 | "description": "Simple Intro Skill"
14 | },
15 | "en-IN": {
16 | "summary": "A simple skill to say introduction for someone",
17 | "examplePhrases": [
18 | "Alexa please say intro",
19 | "say intro",
20 | "help"
21 | ],
22 | "name": "self-intro",
23 | "description": "Simple Intro Skill"
24 | }
25 | },
26 | "isAvailableWorldwide": true,
27 | "testingInstructions": "1) Say 'Alexa, say intro'.",
28 | "category": "ORGANIZERS_AND_ASSISTANTS",
29 | "distributionCountries": []
30 | },
31 | "apis": {
32 | "custom": {
33 | "endpoint": {
34 | "uri": "arn:aws:lambda:us-east-1:123456789012:function:lambda-alexa-simple-intro"
35 | }
36 | }
37 | },
38 | "manifestVersion": "1.0"
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/Chapter07/invoking-lambda-with-kinesis-event/lambda-invoke-kinesis-event/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/Chapter07/invoking-lambda-with-kinesis-event/lambda-invoke-kinesis-event/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | tech.heartin.books.serverless-cookbook
8 | lambda-invoke-kinesis-event
9 | 0.0.1-SNAPSHOT
10 |
11 |
12 | tech.heartin.books.serverlesscookbook
13 | serverless-cookbook-parent-aws-java
14 | 0.0.1-SNAPSHOT
15 |
16 |
17 |
18 |
19 | com.amazonaws
20 | aws-lambda-java-core
21 | ${aws.lambda.java.core.version}
22 |
23 |
24 |
25 | com.amazonaws
26 | aws-lambda-java-events
27 | ${aws.lambda.java.events.version}
28 |
29 |
30 |
31 | com.amazonaws
32 | aws-java-sdk-kinesis
33 | ${aws.sdk.version}
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/Chapter07/invoking-lambda-with-kinesis-event/lambda-invoke-kinesis-event/src/main/java/tech/heartin/books/serverlesscookbook/LambdaKinesisEventHandler.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook;
2 |
3 | import java.nio.charset.StandardCharsets;
4 |
5 | import com.amazonaws.services.lambda.runtime.Context;
6 | import com.amazonaws.services.lambda.runtime.LambdaLogger;
7 | import com.amazonaws.services.lambda.runtime.RequestHandler;
8 | import com.amazonaws.services.lambda.runtime.events.KinesisEvent;
9 |
10 | /**
11 | * RequestHandler implementation.
12 | */
13 | public final class LambdaKinesisEventHandler implements RequestHandler {
14 |
15 |
16 | /**
17 | * Handle request.
18 | *
19 | * @param kinesisEvent - Kinesis Event passed as input to lambda handler
20 | * @param context - context object
21 | * @return true if success, else false.
22 | */
23 | public Boolean handleRequest(final KinesisEvent kinesisEvent, final Context context) {
24 |
25 | LambdaLogger logger = context.getLogger();
26 | logger.log("Received Kinesis event: " + kinesisEvent);
27 | logger.log("Number of records: " + kinesisEvent.getRecords().size());
28 |
29 | try {
30 | kinesisEvent.getRecords().forEach(r -> {
31 | final KinesisEvent.Record kr = r.getKinesis();
32 | logger.log("Record: " + kr.toString());
33 | logger.log("Data: " + StandardCharsets.UTF_8.decode(kr.getData()).toString());
34 | });
35 | } catch (final Exception e) {
36 | logger.log("There was an exception: " + e.getMessage());
37 | return false;
38 | }
39 |
40 | return true;
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/Chapter07/invoking-lambda-with-kinesis-event/lambda-invoke-kinesis-event/src/main/java/tech/heartin/books/serverlesscookbook/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Package for lambdas.
3 | */
4 | package tech.heartin.books.serverlesscookbook;
5 |
--------------------------------------------------------------------------------
/Chapter07/invoking-lambda-with-kinesis-event/resources/basic-lambda-permissions.txt:
--------------------------------------------------------------------------------
1 | {
2 | "Version":"2012-10-17",
3 | "Statement":[
4 | {
5 | "Effect":"Allow",
6 | "Action":[
7 | "logs:CreateLogGroup",
8 | "logs:CreateLogStream",
9 | "logs:PutLogEvents"
10 | ],
11 | "Resource":[
12 | "arn:aws:logs:*:*:*"
13 | ]
14 | }
15 | ]
16 | }
--------------------------------------------------------------------------------
/Chapter07/invoking-lambda-with-kinesis-event/resources/iam-role-trust-relationship.txt:
--------------------------------------------------------------------------------
1 | {
2 | "Version": "2012-10-17",
3 | "Statement": [
4 | {
5 | "Effect": "Allow",
6 | "Principal": {
7 | "Service": "lambda.amazonaws.com"
8 | },
9 | "Action": "sts:AssumeRole"
10 | }
11 | ]
12 | }
--------------------------------------------------------------------------------
/Chapter07/invoking-lambda-with-kinesis-event/resources/lambda-invoke-kinesis-event-permissions.txt:
--------------------------------------------------------------------------------
1 | {
2 | "Version":"2012-10-17",
3 | "Statement":[
4 | {
5 | "Effect":"Allow",
6 | "Action":[
7 | "kinesis:GetRecords",
8 | "kinesis:GetShardIterator",
9 | "kinesis:DescribeStream",
10 | "kinesis:ListStreams"
11 | ],
12 | "Resource":[
13 | "arn:aws:kinesis:*:*:*"
14 | ]
15 | }
16 | ]
17 | }
--------------------------------------------------------------------------------
/Chapter07/using-amazon-ml-for-binary-classification/resources/create-data-source-from-s3-cli-input.json:
--------------------------------------------------------------------------------
1 | {
2 | "DataSourceId": "my-first-s3-ds-id",
3 | "DataSourceName": "My First S3 DataSource",
4 | "DataSpec": {
5 | "DataLocationS3": "s3://aml-sample-data/banking.csv",
6 | "DataRearrangement": "{\"splitting\":{\"percentBegin\":10,\"percentEnd\":60}}",
7 | "DataSchemaLocationS3": "s3://aml-sample-data/banking.csv.schema"
8 | },
9 | "ComputeStatistics": true
10 | }
11 |
--------------------------------------------------------------------------------
/Chapter07/writing-data-into-kinesis-stream-with-sdk/lambda-kinesis-sdk-write/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/Chapter07/writing-data-into-kinesis-stream-with-sdk/lambda-kinesis-sdk-write/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | tech.heartin.books.serverless-cookbook
8 | lambda-kinesis-sdk-write
9 | 0.0.1-SNAPSHOT
10 |
11 |
12 | tech.heartin.books.serverlesscookbook
13 | serverless-cookbook-parent-aws-java
14 | 0.0.1-SNAPSHOT
15 |
16 |
17 |
18 |
19 | com.amazonaws
20 | aws-lambda-java-core
21 | ${aws.lambda.java.core.version}
22 |
23 |
24 |
25 |
26 | com.amazonaws
27 | aws-java-sdk-kinesis
28 | ${aws.sdk.version}
29 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/Chapter07/writing-data-into-kinesis-stream-with-sdk/lambda-kinesis-sdk-write/src/main/java/tech/heartin/books/serverlesscookbook/LambdaKinesisSdkWriteHandler.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook;
2 |
3 | import com.amazonaws.services.kinesis.AmazonKinesis;
4 | import com.amazonaws.services.kinesis.AmazonKinesisClientBuilder;
5 | import com.amazonaws.services.lambda.runtime.Context;
6 | import com.amazonaws.services.lambda.runtime.RequestHandler;
7 |
8 | import tech.heartin.books.serverlesscookbook.domain.Request;
9 | import tech.heartin.books.serverlesscookbook.domain.Response;
10 | import tech.heartin.books.serverlesscookbook.services.KinesisService;
11 | import tech.heartin.books.serverlesscookbook.services.KinesisServiceImpl;
12 |
13 | /**
14 | * RequestHandler implementation.
15 | */
16 | public final class LambdaKinesisSdkWriteHandler implements RequestHandler {
17 |
18 |
19 | private final AmazonKinesis kinesisClient;
20 |
21 | public LambdaKinesisSdkWriteHandler() {
22 | this.kinesisClient = AmazonKinesisClientBuilder.standard()
23 | .withRegion(System.getenv("AWS_REGION"))
24 | .build();
25 | }
26 |
27 | /**
28 | * Handle request.
29 | *
30 | * @param request - input to lambda handler
31 | * @param context - context object
32 | * @return greeting text
33 | */
34 | public Response handleRequest(final Request request, final Context context) {
35 | context.getLogger().log("Received Request: " + request);
36 |
37 | final KinesisService kinesisService = new KinesisServiceImpl(this.kinesisClient);
38 | return kinesisService.addRecords(request, context.getLogger());
39 |
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/Chapter07/writing-data-into-kinesis-stream-with-sdk/lambda-kinesis-sdk-write/src/main/java/tech/heartin/books/serverlesscookbook/domain/Request.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.domain;
2 |
3 | import lombok.Data;
4 |
5 | /**
6 | * Request POJO.
7 | */
8 | @Data
9 | public class Request {
10 | private String streamName;
11 | private String partitionKey;
12 | private String payload;
13 | private int count;
14 | private int batchSize;
15 | }
16 |
--------------------------------------------------------------------------------
/Chapter07/writing-data-into-kinesis-stream-with-sdk/lambda-kinesis-sdk-write/src/main/java/tech/heartin/books/serverlesscookbook/domain/Response.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.domain;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Data;
5 |
6 | /**
7 | * Response POJO.
8 | */
9 | @Data
10 | @AllArgsConstructor
11 | public class Response {
12 | private String message;
13 | private int count;
14 | }
15 |
--------------------------------------------------------------------------------
/Chapter07/writing-data-into-kinesis-stream-with-sdk/lambda-kinesis-sdk-write/src/main/java/tech/heartin/books/serverlesscookbook/domain/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Domain objects.
3 | */
4 | package tech.heartin.books.serverlesscookbook.domain;
5 |
--------------------------------------------------------------------------------
/Chapter07/writing-data-into-kinesis-stream-with-sdk/lambda-kinesis-sdk-write/src/main/java/tech/heartin/books/serverlesscookbook/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Package for lambdas.
3 | */
4 | package tech.heartin.books.serverlesscookbook;
5 |
--------------------------------------------------------------------------------
/Chapter07/writing-data-into-kinesis-stream-with-sdk/lambda-kinesis-sdk-write/src/main/java/tech/heartin/books/serverlesscookbook/services/KinesisService.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook.services;
2 |
3 | import tech.heartin.books.serverlesscookbook.domain.Request;
4 | import tech.heartin.books.serverlesscookbook.domain.Response;
5 |
6 | import com.amazonaws.services.lambda.runtime.LambdaLogger;
7 |
8 | /**
9 | * Service class interface for Kinesis operations.
10 | */
11 | public interface KinesisService {
12 |
13 | /**
14 | * Add records to Kinesis Data Stream.
15 | * @param request Request domain object.
16 | * @param logger Lambda Logger from context.
17 | * @return Response domain object.
18 | */
19 | Response addRecords(Request request, LambdaLogger logger);
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/Chapter07/writing-data-into-kinesis-stream-with-sdk/lambda-kinesis-sdk-write/src/main/java/tech/heartin/books/serverlesscookbook/services/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Package for service classes.
3 | */
4 | package tech.heartin.books.serverlesscookbook.services;
5 |
--------------------------------------------------------------------------------
/Chapter07/writing-data-into-kinesis-stream-with-sdk/resources/basic-lambda-permissions.txt:
--------------------------------------------------------------------------------
1 | {
2 | "Version":"2012-10-17",
3 | "Statement":[
4 | {
5 | "Effect":"Allow",
6 | "Action":[
7 | "logs:CreateLogGroup",
8 | "logs:CreateLogStream",
9 | "logs:PutLogEvents"
10 | ],
11 | "Resource":[
12 | "arn:aws:logs:*:*:*"
13 | ]
14 | }
15 | ]
16 | }
--------------------------------------------------------------------------------
/Chapter07/writing-data-into-kinesis-stream-with-sdk/resources/iam-role-trust-relationship.txt:
--------------------------------------------------------------------------------
1 | {
2 | "Version": "2012-10-17",
3 | "Statement": [
4 | {
5 | "Effect": "Allow",
6 | "Principal": {
7 | "Service": "lambda.amazonaws.com"
8 | },
9 | "Action": "sts:AssumeRole"
10 | }
11 | ]
12 | }
--------------------------------------------------------------------------------
/Chapter07/writing-data-into-kinesis-stream-with-sdk/resources/lambda-kinesis-producer-permissions.txt:
--------------------------------------------------------------------------------
1 | {
2 | "Version":"2012-10-17",
3 | "Statement":[
4 | {
5 | "Effect":"Allow",
6 | "Action":[
7 | "kinesis:DescribeStream",
8 | "kinesis:PutRecord",
9 | "kinesis:PutRecords"
10 | ],
11 | "Resource":[
12 | "arn:aws:kinesis:*:*:*"
13 | ]
14 | }
15 | ]
16 | }
--------------------------------------------------------------------------------
/Chapter07/writing-data-into-kinesis-stream-with-sdk/resources/payload.json:
--------------------------------------------------------------------------------
1 | {
2 | "streamName" : "my-first-kinesis-stream",
3 | "partitionKey": "12345",
4 | "payload": "testpayloadfromcli",
5 | "count": 10,
6 | "batchSize" : 5
7 | }
--------------------------------------------------------------------------------
/Chapter07/your-first-kinesis-stream/resources/cf-stack-deploy-cli-commands.txt:
--------------------------------------------------------------------------------
1 | cd resources
2 |
3 | aws cloudformation create-stack \
4 | --stack-name kinesisfirststack \
5 | --template-body file://kinesis-stream-cf-template.yml \
6 | --region us-east-1 \
7 | --profile admin
8 |
9 | aws cloudformation describe-stacks \
10 | --stack-name kinesisfirststack \
11 | --region us-east-1 \
12 | --profile admin
13 |
14 | aws cloudformation delete-stack \
15 | --stack-name kinesisfirststack \
16 | --region us-east-1 \
17 | --profile admin
18 |
--------------------------------------------------------------------------------
/Chapter07/your-first-kinesis-stream/resources/kinesis-stream-cf-template.yml:
--------------------------------------------------------------------------------
1 | ---
2 | AWSTemplateFormatVersion: '2010-09-09'
3 | Description: 'My first Kinesis stream'
4 |
5 | Resources:
6 | KinesisStream:
7 | Type: AWS::Kinesis::Stream
8 | Properties:
9 | Name: my-first-kinesis-stream
10 | RetentionPeriodHours: 24
11 | ShardCount: 1
12 |
13 | Outputs:
14 | KinesisStreamId:
15 | Value: !Ref KinesisStream
16 | Export:
17 | Name: "KinesisStreamId"
18 | KinesisStreamArn:
19 | Value: !GetAtt KinesisStream.Arn
20 | Export:
21 | Name: "KinesisStreamArn"
22 |
--------------------------------------------------------------------------------
/Chapter08/cloudwatch-alarms-with-dimensions/resources/cloudwatch-alarms-with-dimensions.txt:
--------------------------------------------------------------------------------
1 | aws cloudwatch put-metric-alarm \
2 | --alarm-name FailedRequestsAlarmWithDimensions \
3 | --alarm-description 'Alarm for failed login requests' \
4 | --metric-name 'FailedLogins' \
5 | --namespace 'ServerlessProgrammingCookbook' \
6 | --statistic 'Average' \
7 | --period 10 \
8 | --threshold 5 \
9 | --comparison-operator GreaterThanOrEqualToThreshold \
10 | --evaluation-periods 1 \
11 | --dimensions Name=Device,Value=Laptop \
12 | --alarm-actions arn:aws:sns:us-east-1:123456789012:my-first-sns-topic \
13 | --region us-east-1 \
14 | --profile admin
15 |
16 | aws cloudwatch describe-alarms \
17 | --alarm-names FailedRequestsAlarmWithDimensions \
18 | --region us-east-1 \
19 | --profile admin
20 |
21 | aws cloudwatch put-metric-data \
22 | --namespace 'ServerlessProgrammingCookbook' \
23 | --metric-name 'FailedLogins' \
24 | --value 1 \
25 | --dimensions Device=Laptop \
26 | --region us-east-1 \
27 | --profile admin
28 |
29 | aws cloudwatch put-metric-data \
30 | --namespace 'ServerlessProgrammingCookbook' \
31 | --metric-name 'FailedLogins' \
32 | --value 10 \
33 | --dimensions Device=Laptop \
34 | --region us-east-1 \
35 | --profile admin
36 |
37 |
--------------------------------------------------------------------------------
/Chapter08/filtering-log-events/resources/filtering-log-events-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws logs put-metric-filter \
2 | --log-group-name /aws/lambda/demo-lambda-with-cli \
3 | --filter-name 'HelloCountFilter' \
4 | --filter-pattern 'Hello' \
5 | --metric-transformations file://metric-transformations.json \
6 | --region us-east-1 \
7 | --profile admin
8 |
9 | aws lambda invoke \
10 | --invocation-type RequestResponse \
11 | --function-name demo-lambda-with-cli \
12 | --log-type Tail \
13 | --payload '{"name": "Heartin"}' \
14 | --region us-east-1 \
15 | --profile admin \
16 | outputfile.txt
17 |
18 | aws lambda invoke \
19 | --invocation-type RequestResponse \
20 | --function-name myHelloWorldLambda \
21 | --log-type Tail \
22 | --payload '{"name":"Heartin"}' \
23 | --region us-east-1 \
24 | --profile admin \
25 | outputfile.txt
26 |
27 |
--------------------------------------------------------------------------------
/Chapter08/filtering-log-events/resources/metric-transformations.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "metricName": "HelloCountMetric",
4 | "metricNamespace": "ServerlessProgrammingCookbook",
5 | "metricValue": "1"
6 | }
7 | ]
--------------------------------------------------------------------------------
/Chapter08/setting-up-cloudwatch-alarms/resources/setting-up-cloud-watch-alarm-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws cloudwatch put-metric-alarm \
2 | --alarm-name FailedRequestsAlarm \
3 | --alarm-description 'Alarm for failed login requests' \
4 | --metric-name 'FailedLogins' \
5 | --namespace 'ServerlessProgrammingCookbook' \
6 | --statistic 'Average' \
7 | --period 60 \
8 | --threshold 5 \
9 | --comparison-operator GreaterThanOrEqualToThreshold \
10 | --evaluation-periods 1 \
11 | --alarm-actions arn:aws:sns:us-east-1:123456789012:my-first-sns-topic \
12 | --region us-east-1 \
13 | --profile admin
14 |
15 | aws cloudwatch describe-alarms \
16 | --alarm-names FailedRequestsAlarm \
17 | --region us-east-1 \
18 | --profile admin
19 |
20 | aws cloudwatch put-metric-data \
21 | --namespace 'ServerlessProgrammingCookbook' \
22 | --metric-name 'FailedLogins' \
23 | --value 1 \
24 | --region us-east-1 \
25 | --profile admin
26 |
27 | aws cloudwatch put-metric-data \
28 | --namespace 'ServerlessProgrammingCookbook' \
29 | --metric-name 'FailedLogins' \
30 | --value 10 \
31 | --region us-east-1 \
32 | --profile admin
33 |
34 |
--------------------------------------------------------------------------------
/Chapter08/your-first-custom-metric/resources/your-first-custom-metric-cli-commands.txt:
--------------------------------------------------------------------------------
1 | aws cloudwatch put-metric-data \
2 | --namespace 'ServerlessProgrammingCookbook' \
3 | --metric-name 'FailedLogins' \
4 | --value 1 \
5 | --region us-east-1 \
6 | --profile admin
7 |
8 | aws cloudwatch put-metric-data \
9 | --namespace 'ServerlessProgrammingCookbook' \
10 | --metric-name 'FailedLogins' \
11 | --value 1 \
12 | --dimensions 'Device=Mobile' \
13 | --region us-east-1 \
14 | --profile admin
15 |
16 | aws cloudwatch put-metric-data \
17 | --namespace 'ServerlessProgrammingCookbook' \
18 | --metric-name 'FailedLogins' \
19 | --value 1 \
20 | --dimensions 'Device=Laptop' \
21 | --region us-east-1 \
22 | --profile admin
23 |
24 | aws cloudwatch put-metric-data \
25 | --namespace 'ServerlessProgrammingCookbook' \
26 | --metric-name 'FailedLogins' \
27 | --value 1 \
28 | --dimensions 'Device=Laptop' \
29 | --region us-east-1 \
30 | --profile admin
--------------------------------------------------------------------------------
/Chapter09/cognito-operations-with-javascript-sdk/resources/create-user-pool-cli-input.json:
--------------------------------------------------------------------------------
1 | {
2 | "PoolName": "javscript_pool",
3 | "Policies": {
4 | "PasswordPolicy": {
5 | "MinimumLength": 8,
6 | "RequireUppercase": true,
7 | "RequireLowercase": true,
8 | "RequireNumbers": true,
9 | "RequireSymbols": true
10 | }
11 | },
12 | "AutoVerifiedAttributes": [
13 | "email"
14 | ],
15 | "AliasAttributes": [
16 | "email"
17 | ],
18 | "EmailVerificationMessage": "Your verification code from MyApp is {####}",
19 | "EmailVerificationSubject": "Your verification code from MyAp",
20 | "UserPoolTags": {
21 | "Team": "Dev"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Chapter09/cognito-operations-with-javascript-sdk/resources/s3-website-policy.json:
--------------------------------------------------------------------------------
1 | { "Version":"2012-10-17",
2 | "Statement":[
3 | { "Sid":"PublicReadGetObjectAccess",
4 | "Effect":"Allow",
5 | "Principal": "*",
6 | "Action":["s3:GetObject"],
7 | "Resource":["arn:aws:s3:::serverlesscookbook-cognito-files/*"]
8 | } ]
9 | }
--------------------------------------------------------------------------------
/Chapter09/creating-ssl-tls-certificates-with-acm/resources/certificate-validation-with-cname-record.yml:
--------------------------------------------------------------------------------
1 | ---
2 | AWSTemplateFormatVersion: '2010-09-09'
3 | Description: 'CNAME record set for verification'
4 | Parameters:
5 | HostedZone:
6 | Description: HostedZone name for your website (quizzercloud.com.)
7 | Type: String
8 | CNAMEname:
9 | Description: CNAME name
10 | Type: String
11 | CNAMEValue:
12 | Description: CNAME value
13 | Type: String
14 | Resources:
15 | CNAMERecordSetGroup:
16 | Type: AWS::Route53::RecordSetGroup
17 | Properties:
18 | HostedZoneName: !Ref HostedZone
19 | Comment: Zone apex alias.
20 | RecordSets:
21 | -
22 | Name: !Ref CNAMEname
23 | Type: CNAME
24 | TTL: 900
25 | ResourceRecords:
26 | - !Ref CNAMEValue
--------------------------------------------------------------------------------
/Chapter09/creating-ssl-tls-certificates-with-acm/resources/cf-stack-deploy-cli-commands.txt:
--------------------------------------------------------------------------------
1 | -- Create CloudFront Distribution --
2 |
3 | aws cloudformation create-stack \
4 | --stack-name mycertstack \
5 | --template-body file://creating-ssl-tls-certificates-with-acm.yml \
6 | --parameters ParameterKey=RootDomainName,ParameterValue=quizzercloud.com\
7 | --profile admin
8 |
9 | aws cloudformation describe-stack-events \
10 | --stack-name mycertstack \
11 | --profile admin
12 |
13 | aws cloudformation describe-stacks \
14 | --stack-name mycertstack \
15 | --profile admin
16 |
17 | aws cloudformation delete-stack \
18 | --stack-name mycertstack \
19 | --profile admin
20 |
21 |
22 |
23 | -- Validation record set --
24 |
25 | aws cloudformation create-stack \
26 | --stack-name cnamerecordsetstack \
27 | --template-body file://certificate-validation-with-cname-record.yml \
28 | --parameters ParameterKey=HostedZone,ParameterValue=quizzercloud.com. \
29 | ParameterKey=CNAMEname,ParameterValue=_7d2add77f3493141152bc8765e40401c.quizzercloud.com. \
30 | ParameterKey=CNAMEValue,ParameterValue=_9376279cf263f4ec3ced17d9b08122ce.tljzshvwok.acm-validations.aws. \
31 | --region ap-south-1 \
32 | --profile admin
33 |
34 | aws cloudformation describe-stacks \
35 | --stack-name cnamerecordsetstack \
36 | --region ap-south-1 \
37 | --profile admin
38 |
39 | aws cloudformation delete-stack \
40 | --stack-name cnamerecordsetstack \
41 | --region ap-south-1 \
42 | --profile admin
--------------------------------------------------------------------------------
/Chapter09/creating-ssl-tls-certificates-with-acm/resources/change-resource-record-sets-dns-validation.json:
--------------------------------------------------------------------------------
1 | {
2 | "Comment": "change batch request for dns validation www.qnatime.net",
3 | "Changes": [
4 | {
5 | "Action": "CREATE",
6 | "ResourceRecordSet": {
7 | "Name": "_f086ad8e4c10e38385c3c36394a06182.www.qnatime.net.",
8 | "Type": "CNAME",
9 | "TTL": 300,
10 | "ResourceRecords": [
11 | {
12 | "Value": "_ee9788f2dcf3eaefaa85bb096163ffd4.tljzshvwok.acm-validations.aws."
13 | }
14 | ]
15 | }
16 | }
17 | ]
18 | }
--------------------------------------------------------------------------------
/Chapter09/creating-ssl-tls-certificates-with-acm/resources/creating-ssl-tls-certificates-with-acm.txt:
--------------------------------------------------------------------------------
1 | aws acm request-certificate \
2 | --domain-name www.qnatime.net \
3 | --validation-method DNS \
4 | --profile admin
5 |
6 | aws acm describe-certificate \
7 | --certificate-arn arn:aws:acm:us-east-1::certificate/42b3ba99-66e9-4e71-8c1c-4239c1e81c84 \
8 | --profile admin
9 |
10 | aws route53 change-resource-record-sets \
11 | --hosted-zone-id Z3G50MON7IDA18 \
12 | --change-batch file://resources/change-resource-record-sets-dns-validation.json \
13 | --profile admin
14 |
15 | aws route53 get-change \
16 | --id /change/C1K3NNG2J7W6KZ \
17 | --profile admin
18 |
--------------------------------------------------------------------------------
/Chapter09/creating-ssl-tls-certificates-with-acm/resources/creating-ssl-tls-certificates-with-acm.yml:
--------------------------------------------------------------------------------
1 | ---
2 | AWSTemplateFormatVersion: '2010-09-09'
3 | Description: 'Certificate Manager'
4 | Parameters:
5 | RootDomainName:
6 | Description: Domain name for generating certificate
7 | Type: String
8 | Resources:
9 | RootDomainCert:
10 | Type: AWS::CertificateManager::Certificate
11 | Properties:
12 | DomainName: !Ref RootDomainName
13 | ValidationMethod: DNS
14 | Outputs:
15 | CertificateArn:
16 | Value: !Ref RootDomainCert
17 | Description: Root domain cert
18 | Export:
19 | Name: DomainNameCert
20 |
--------------------------------------------------------------------------------
/Chapter09/enable-cors-for-the-api/resources/enable-cors-update-cli-commands.txt:
--------------------------------------------------------------------------------
1 |
2 |
3 | Add Response Header with name Access-Control-Allow-Origin, Access-Control-Allow-Headers, Access-Control-Allow-Methods for the resource
4 |
5 | aws apigateway update-method-response \
6 | --rest-api-id lvd3vmhxaa \
7 | --resource-id in1q7f \
8 | --http-method GET \
9 | --status-code 200 \
10 | --patch-operations file://method-response.json
11 |
12 |
13 | set up the mapping value for the newly added response headers to their static value
14 |
15 | aws apigateway update-integration-response \
16 | --rest-api-id lvd3vmhxaa \
17 | --resource-id in1q7f \
18 | --http-method GET \
19 | --status-code 200 \
20 | --patch-operations file://C:/2018/AWS_Serverless/integration-response.json
21 |
22 |
23 |
--------------------------------------------------------------------------------
/Chapter09/enable-cors-for-the-api/resources/put-method-integration-get.json:
--------------------------------------------------------------------------------
1 | {
2 | "method.response.header.Access-Control-Allow-Origin": "'*'"
3 | }
--------------------------------------------------------------------------------
/Chapter09/enable-cors-for-the-api/resources/put-method-integration-response-options.json:
--------------------------------------------------------------------------------
1 | {
2 | "method.response.header.Access-Control-Allow-Origin": "'*'",
3 | "method.response.header.Access-Control-Allow-Headers": "'Content-Type,Authorization,X-Amz-Date,X-Api-Key,X-Amz-Security-Token'"
4 | }
--------------------------------------------------------------------------------
/Chapter09/enable-cors-for-the-api/resources/put-method-response-get.json:
--------------------------------------------------------------------------------
1 | {
2 | "method.response.header.Access-Control-Allow-Origin": false
3 | }
--------------------------------------------------------------------------------
/Chapter09/enable-cors-for-the-api/resources/put-method-response-options.json:
--------------------------------------------------------------------------------
1 | {
2 | "method.response.header.Access-Control-Allow-Origin": false,
3 | "method.response.header.Access-Control-Allow-Headers": false,
4 | "method.response.header.Access-Control-Allow-Methods": false
5 | }
--------------------------------------------------------------------------------
/Chapter09/enable-cors-for-the-api/resources/response-template-get.json:
--------------------------------------------------------------------------------
1 | {"application/json": "Hello $input.params('name')"}
--------------------------------------------------------------------------------
/Chapter09/federated-identity-with-amazon-cognito/resources/error.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Q & A Time - Error Page
6 |
7 |
8 | Error Page!
9 |
10 |
--------------------------------------------------------------------------------
/Chapter09/federated-identity-with-amazon-cognito/resources/federated-identity-with-amazon-cognito.txt:
--------------------------------------------------------------------------------
1 | aws cognito-identity create-identity-pool \
2 | --identity-pool-name qnatimepool \
3 | --no-allow-unauthenticated-identities \
4 | --supported-login-providers file://provider.json \
5 | --region us-east-1 \
6 | --profile admin
7 |
8 | aws iam create-policy \
9 | --policy-name identity-pool-policy \
10 | --policy-document file://role_policy.txt \
11 | --profile admin
12 |
13 | aws iam create-role \
14 | --role-name identity-pool-role \
15 | --assume-role-policy-document file://iam-role-trust-relationship.txt \
16 | --profile admin
17 |
18 | aws iam attach-role-policy \
19 | --role-name identity-pool-role \
20 | --policy-arn arn:aws:iam::855923912133:policy/identity-pool-policy \
21 | --profile admin
22 |
23 | aws cognito-identity set-identity-pool-roles \
24 | --identity-pool-id us-east-1:0f692fe2-c799-4334-b29b-54fd6544f2fb \
25 | --roles file://roles.json \
26 | --region us-east-1 \
27 | --profile admin
28 |
29 | aws s3 cp index.html s3://qnatime.com --profile admin
30 | aws s3 cp error.html s3://qnatime.com --profile admin
31 |
32 |
33 |
--------------------------------------------------------------------------------
/Chapter09/federated-identity-with-amazon-cognito/resources/iam-role-trust-relationship.txt:
--------------------------------------------------------------------------------
1 | {
2 | "Version": "2012-10-17",
3 | "Statement": [
4 | {
5 | "Effect": "Allow",
6 | "Principal": {
7 | "Federated": "cognito-identity.amazonaws.com"
8 | },
9 | "Action": "sts:AssumeRole"
10 | }
11 | ]
12 | }
--------------------------------------------------------------------------------
/Chapter09/federated-identity-with-amazon-cognito/resources/provider.json:
--------------------------------------------------------------------------------
1 | { "accounts.google.com" : "55367180174-6brhjc2v6kdllcejabnr1e46957f72te.apps.googleusercontent.com" }
--------------------------------------------------------------------------------
/Chapter09/federated-identity-with-amazon-cognito/resources/role_policy.txt:
--------------------------------------------------------------------------------
1 | {
2 | "Version": "2012-10-17",
3 | "Statement": [
4 | {
5 | "Effect": "Allow",
6 | "Action": [
7 | "mobileanalytics:PutEvents",
8 | "cognito-sync:*",
9 | "cognito-identity:*"
10 | ],
11 | "Resource": [
12 | "*"
13 | ]
14 | }
15 | ]
16 | }
17 |
--------------------------------------------------------------------------------
/Chapter09/federated-identity-with-amazon-cognito/resources/roles.json:
--------------------------------------------------------------------------------
1 | {"authenticated":"arn:aws:iam::855923912133:role/identity-pool-role"}
--------------------------------------------------------------------------------
/Chapter10/your-first-serverless-application-in-azure/helloworld-azure-fn/.gitignore:
--------------------------------------------------------------------------------
1 | # Build output
2 | target/
3 | *.class
4 |
5 | # Log file
6 | *.log
7 |
8 | # BlueJ files
9 | *.ctxt
10 |
11 | # Mobile Tools for Java (J2ME)
12 | .mtj.tmp/
13 |
14 | # Package Files #
15 | *.jar
16 | *.war
17 | *.ear
18 | *.zip
19 | *.tar.gz
20 | *.rar
21 |
22 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
23 | hs_err_pid*
24 |
25 | # IDE
26 | .idea/
27 | *.iml
28 |
29 | # macOS
30 | .DS_Store
31 |
32 | # Azure Functions
33 | local.settings.json
34 | bin/
35 | obj/
36 |
--------------------------------------------------------------------------------
/Chapter10/your-first-serverless-application-in-azure/helloworld-azure-fn/host.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "2.0"
3 | }
4 |
--------------------------------------------------------------------------------
/Chapter10/your-first-serverless-application-in-azure/helloworld-azure-fn/src/main/java/tech/heartin/books/serverlesscookbook/Function.java:
--------------------------------------------------------------------------------
1 | package tech.heartin.books.serverlesscookbook;
2 |
3 | import java.util.*;
4 | import com.microsoft.azure.functions.annotation.*;
5 | import com.microsoft.azure.functions.*;
6 |
7 | /**
8 | * Azure Functions with HTTP Trigger.
9 | */
10 | public class Function {
11 | /**
12 | * This function listens at endpoint "/api/HttpTrigger-Java". Two ways to invoke it using "curl" command in bash:
13 | * 1. curl -d "HTTP Body" {your host}/api/HttpTrigger-Java&code={your function key}
14 | * 2. curl "{your host}/api/HttpTrigger-Java?name=HTTP%20Query&code={your function key}"
15 | * Function Key is not needed when running locally, it is used to invoke function deployed to Azure.
16 | * More details: https://aka.ms/functions_authorization_keys
17 | */
18 | @FunctionName("HttpTrigger-Java")
19 | public HttpResponseMessage run(
20 | @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.FUNCTION) HttpRequestMessage> request,
21 | final ExecutionContext context) {
22 | context.getLogger().info("Java HTTP trigger processed a request.");
23 |
24 | // Parse query parameter
25 | String query = request.getQueryParameters().get("name");
26 | String name = request.getBody().orElse(query);
27 |
28 | if (name == null) {
29 | return request.createResponseBuilder(HttpStatus.BAD_REQUEST).body("Please pass a name on the query string or in the request body").build();
30 | } else {
31 | return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
32 | }
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/Chapter10/your-first-serverless-application-in-azure/resources/hello-world-azure-function-cli-commands.txt:
--------------------------------------------------------------------------------
1 |
2 | Mac / Linux
3 |
4 | mvn archetype:generate \
5 | -DarchetypeGroupId=com.microsoft.azure \
6 | -DarchetypeArtifactId=azure-functions-archetype
7 |
8 |
9 | Windows
10 |
11 | mvn archetype:generate ^
12 | -DarchetypeGroupId=com.microsoft.azure ^
13 | -DarchetypeArtifactId=azure-functions-archetype
14 |
15 |
16 |
--------------------------------------------------------------------------------
/Chapter10/your-first-serverless-application-in-gcp/resources/gcp-cli-commands.txt:
--------------------------------------------------------------------------------
1 | gcloud projects create 'heartin-gcp-project-id' --name='My First GCP Project'
2 |
3 | gcloud config set project 'heartin-gcp-project-id'
4 |
5 | gcloud services enable cloudfunctions.googleapis.com
6 |
7 | git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
8 |
9 | cd nodejs-docs-samples/functions/helloworld/
10 | gcloud functions deploy helloGET --runtime nodejs6 --trigger-http
11 |
12 | Run: https://us-central1-heartin-gcp-project-id.cloudfunctions.net/helloGET
--------------------------------------------------------------------------------
/Chapter10/your-first-serverless-application-in-ibm-cloud/resources/hello.js:
--------------------------------------------------------------------------------
1 | function main(params) {
2 | var name = params.name || 'World';
3 | return {payload: 'Hello, ' + name + '!'};
4 | }
--------------------------------------------------------------------------------
/Chapter10/your-first-serverless-application-in-ibm-cloud/resources/ibm-cloud-cli-commands.txt:
--------------------------------------------------------------------------------
1 | ibmcloud login
2 |
3 | ibmcloud target –cf
4 |
5 | ibmcloud plugin install cloud-functions
6 |
7 | ibmcloud fn action create hello hello.js
8 |
9 | ibmcloud fn action invoke helloworld --blocking --result
10 |
11 | ibmcloud fn action invoke hello --blocking --result --param name Heartin
12 |
13 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2018 Packt
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/serverless-cookbook-parent-aws-java/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/serverless-cookbook-parent-aws-java/README.md:
--------------------------------------------------------------------------------
1 | # Serverless Cookbook Parent AWS Java
2 |
3 | This is the parent project for the example projects in the book 'Serverless Programming Cookbook' (author: Heartin Kanikathottu. publisher: Packt Publishing).
4 |
5 | POM file for this project defines the versions of dependencies, but the dependencies are commented.
6 | Commented out dependency usages will help to quickly see all possible dependencies in one place.
7 |
8 | The required dependencies for each example project are defined within the child project itself.
9 | This will help us understand the right dependencies required for each use case.
10 |
11 | ## Additional dependencies
12 | https://github.com/heartin/simple-starter-parent-java
13 | https://github.com/heartin/simple-starter-build-tools
14 |
--------------------------------------------------------------------------------