├── .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 | --------------------------------------------------------------------------------