AWSTemplateFormatVersion: 2010-09-09 Metadata: 'AWS::CloudFormation::Designer': 6892b949-4601-47eb-af8d-f584c12bc81b: size: width: 60 height: 60 position: x: 82 'y': 299 z: 0 embeds: [] 80500ba5-1749-47bc-8cfa-3e9a0f0d0572: size: width: 60 height: 60 position: x: 200 'y': 300 z: 0 embeds: [] 13c58f7b-60f4-4942-8731-d2b12e056e39: size: width: 60 height: 60 position: x: 340 'y': 180 z: 0 embeds: [] isassociatedwith: - d6f4bd86-a7e4-46c2-abab-2fd987e6a4f1 - 792d4352-869b-4732-a0d2-d4bcc40a6b96 dependson: - d6f4bd86-a7e4-46c2-abab-2fd987e6a4f1 - 13c58f7b-60f4-4942-8731-d2b12e056e39 792d4352-869b-4732-a0d2-d4bcc40a6b96: size: width: 60 height: 60 position: x: 460 'y': 180 z: 0 embeds: [] dependson: - 13c58f7b-60f4-4942-8731-d2b12e056e39 3cf5efd5-85be-4593-b08b-bc3d4a6091b4: size: width: 60 height: 60 position: x: 340 'y': 350 z: 0 embeds: [] 161bd476-b869-4c2e-968b-05cd0b73052f: size: width: 60 height: 60 position: x: 80 'y': 220 z: 0 embeds: [] isassociatedwith: - 80500ba5-1749-47bc-8cfa-3e9a0f0d0572 d701293c-6494-4f90-b758-31f57f52e379: size: width: 60 height: 60 position: x: -190 'y': 250 z: 0 embeds: [] 7d399dae-9f6c-4026-9286-d33113777902: size: width: 60 height: 60 position: x: -360 'y': 250 z: 0 embeds: [] b27ea063-d0ac-40c1-8c49-9147a53ea072: size: width: 60 height: 60 position: x: -270 'y': 380 z: 0 embeds: [] 88fe53b7-5e96-416e-ad00-9ebe8d04269a: size: width: 60 height: 60 position: x: -200 'y': 140 z: 0 embeds: [] dependson: - 80500ba5-1749-47bc-8cfa-3e9a0f0d0572 badaa010-8776-4159-8720-9ee8be16806e: size: width: 60 height: 60 position: x: 80 'y': 380 z: 0 embeds: [] isassociatedwith: - 80500ba5-1749-47bc-8cfa-3e9a0f0d0572 Resources: URL: Type: 'AWS::Lambda::Url' Properties: AuthType: NONE TargetFunctionArn: !GetAtt - Server - Arn Metadata: 'AWS::CloudFormation::Designer': id: 6892b949-4601-47eb-af8d-f584c12bc81b DependsOn: - Server Server: Type: 'AWS::Lambda::Function' Properties: FunctionName: Server Handler: index.handler Runtime: nodejs16.x Code: S3Bucket: '${bucketname}' S3Key: index.zip Role: !GetAtt SiteRole.Arn Metadata: 'AWS::CloudFormation::Designer': id: 80500ba5-1749-47bc-8cfa-3e9a0f0d0572 DependsOn: - SiteRole SiteRole: Type: 'AWS::IAM::Role' Properties: AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: - lambda.amazonaws.com Action: 'sts:AssumeRole' ManagedPolicyArns: - 'arn:aws:iam::aws:policy/AmazonDynamoDBFullAccess' RoleName: SiteRole Metadata: 'AWS::CloudFormation::Designer': id: 13c58f7b-60f4-4942-8731-d2b12e056e39 ExecPolicy: Type: 'AWS::IAM::Policy' Properties: PolicyName: LambdaExcecutionPolicy PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: - 'logs:CreateLogGroup' - 'logs:CreateLogStream' - 'logs:PutLogEvents' Resource: '*' Roles: - !Ref SiteRole Metadata: 'AWS::CloudFormation::Designer': id: 792d4352-869b-4732-a0d2-d4bcc40a6b96 DependsOn: - SiteRole MusicTable: Type: 'AWS::DynamoDB::Table' Properties: KeySchema: - AttributeName: id KeyType: HASH AttributeDefinitions: - AttributeName: id AttributeType: S BillingMode: PAY_PER_REQUEST TableName: MusicTable Metadata: 'AWS::CloudFormation::Designer': id: 3cf5efd5-85be-4593-b08b-bc3d4a6091b4 Permission: Type: 'AWS::Lambda::Permission' Properties: Action: 'lambda:invokeFunctionUrl' FunctionUrlAuthType: NONE FunctionName: !Ref Server Principal: '*' Metadata: 'AWS::CloudFormation::Designer': id: 161bd476-b869-4c2e-968b-05cd0b73052f MusicAPI: Type: 'AWS::ApiGatewayV2::Api' Properties: Target: !GetAtt Server.Arn Name: MusicAPI ProtocolType: HTTP Metadata: 'AWS::CloudFormation::Designer': id: d701293c-6494-4f90-b758-31f57f52e379 HomeRoute: Type: 'AWS::ApiGatewayV2::Route' Properties: ApiId: !Ref MusicAPI RouteKey: Get / Target: !Join - / - - integrations - !Ref APIIntegration Metadata: 'AWS::CloudFormation::Designer': id: 7d399dae-9f6c-4026-9286-d33113777902 DependsOn: - MusicAPI AddRoute: Type: 'AWS::ApiGatewayV2::Route' Properties: ApiId: !Ref MusicAPI RouteKey: POST /add Target: !Join - / - - integrations - !Ref APIIntegration Metadata: 'AWS::CloudFormation::Designer': id: b27ea063-d0ac-40c1-8c49-9147a53ea072 DependsOn: - MusicAPI APIIntegration: Type: 'AWS::ApiGatewayV2::Integration' Properties: ApiId: !Ref MusicAPI IntegrationType: AWS_PROXY PayloadFormatVersion: 2.0 IntegrationUri: 'Fn::Sub': >- arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${Server.Arn}/invocations Metadata: 'AWS::CloudFormation::Designer': id: 88fe53b7-5e96-416e-ad00-9ebe8d04269a DependsOn: - Server APIPermission: Type: 'AWS::Lambda::Permission' Properties: Action: 'lambda:InvokeFunction' FunctionName: !Ref Server Principal: apigateway.amazonaws.com SourceArn: !Sub 'arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${MusicAPI}/*/*/' Metadata: 'AWS::CloudFormation::Designer': id: badaa010-8776-4159-8720-9ee8be16806e