--- AWSTemplateFormatVersion: 2010-09-09 Description: > This template deploys the Retail Demo Store Services. Conditions: UseDefaultIVSStreams: !Equals - !Ref UseDefaultIVSStreams - 'Yes' Parameters: ResourceBucket: Type: String Description: S3Bucket Bucket where the Resources are stored (cloudformation, images, lambda code) ResourceBucketRelativePath: Type: String Description: S3Bucket Path where the Resources are stored (cloudformation, images, lambda code) (i.e. path/path2), can be empty if resources are at the root of the bucket. MUST contain trailing / WebRootUrl: Type: String Description: Public facing root URL where the Retail Demo Store web user interface is served. Used when building fully qualified URLs for the web user interface. AllowedPattern: "^https?://[^\\s/$.?#].[^\\s]*$" ConstraintDescription: Must be a valid URL referring to the root domain where web assets are located ImageRootUrl: Type: String Description: URL where Retail Demo Store images such as product images are located AllowedPattern: "^https?://[^\\s/$.?#].[^\\s]*$" ConstraintDescription: Must be a valid URL referring to the root path where images are located SourceDeploymentType: Type: String Description: Retail Demo Store source deployment type AllowedValues: - 'GitHub' - 'CodeCommit' Default: 'CodeCommit' GitHubRepo: Type: String Default: retaildemostore GitHubBranch: Type: String Default: master GitHubToken: Type: String NoEcho: true GitHubUser: Type: String UserPoolId: Type: String UserPoolClientId: Type: String IdentityPoolId: Type: String StackBucketName: Type: String Subnets: Type: String VpcId: Type: String VpcCidr: Type: String Description: CIDR of the VPC (used for security groups) ClusterName: Type: String ServiceDiscoveryNamespace: Type: String EnvOpenSearchDomainEndpoint: Type: String Default: none PinpointAppId: Type: String ProductsTable: Type: String Default: none CategoriesTable: Type: String Default: none ExperimentStrategyTable: Type: String Default: none ParameterPersonalizeEventTrackerId: Type: String Description: SSM parameter name for the Personalize event tracking ID ParameterAmplitudeApiKey: Type: String Description: SSM parameter name for the Amplitude API key ParameterOptimizelySdkKey: Type: String Description: SSM parameter name for the Optimizely SDK key ParameterIVSVideoChannelMap: Type: String Description: SSM parameter name for video to IVS stream map CleanupBucketLambdaArn: Type: String Description: Lambda Arn for cleanup function UseDefaultIVSStreams: Type: String Description: Whether to use created IVS streams or those hosted by AWS. ParentStackName: Type: String Description: Parent stack name EvidentlyProjectName: Type: String Description: Evidently project name LoggingBucketName: Type: String Description: S3 Bucket For logging LambdaVpcSecurityGroup: Type: String Resources: ProductsService: Type: AWS::CloudFormation::Stack Properties: TemplateURL: !Sub https://s3.amazonaws.com/${ResourceBucket}/${ResourceBucketRelativePath}cloudformation-templates/services/service/_template.yaml Parameters: ServiceName: products ServicePath: src/products ResourceBucket: !Ref ResourceBucket ResourceBucketRelativePath: !Ref ResourceBucketRelativePath SourceDeploymentType: !Ref SourceDeploymentType GitHubRepo: !Ref GitHubRepo GitHubBranch: !Ref GitHubBranch GitHubToken: !Ref GitHubToken GitHubUser: !Ref GitHubUser UserPoolId: !Ref UserPoolId UserPoolClientId: !Ref UserPoolClientId IdentityPoolId: !Ref IdentityPoolId StackBucketName: !Ref StackBucketName Subnets: !Ref Subnets VpcId: !Ref VpcId VpcCidr: !Ref VpcCidr ClusterName: !Ref ClusterName ServiceDiscoveryNamespace: !Ref ServiceDiscoveryNamespace ProductsTable: !Ref ProductsTable CategoriesTable: !Ref CategoriesTable ExperimentStrategyTable: !Ref ExperimentStrategyTable ParameterPersonalizeEventTrackerId: !Ref ParameterPersonalizeEventTrackerId ParameterAmplitudeApiKey: !Ref ParameterAmplitudeApiKey ParameterOptimizelySdkKey: !Ref ParameterOptimizelySdkKey CleanupBucketLambdaArn: !Ref CleanupBucketLambdaArn DeleteRepositoryLambdaArn: !GetAtt DeleteRepositoryLambdaFunction.Arn WebRootUrl: !Ref WebRootUrl ImageRootUrl: !Ref ImageRootUrl Uid: !Sub ${ParentStackName}-${AWS::Region} EvidentlyProjectName: !Ref EvidentlyProjectName LoggingBucketName: !Ref LoggingBucketName UsersService: Type: AWS::CloudFormation::Stack Properties: TemplateURL: !Sub https://s3.amazonaws.com/${ResourceBucket}/${ResourceBucketRelativePath}cloudformation-templates/services/service/_template.yaml Parameters: ServiceName: users ServicePath: src/users ResourceBucket: !Ref ResourceBucket ResourceBucketRelativePath: !Ref ResourceBucketRelativePath SourceDeploymentType: !Ref SourceDeploymentType GitHubRepo: !Ref GitHubRepo GitHubBranch: !Ref GitHubBranch GitHubToken: !Ref GitHubToken GitHubUser: !Ref GitHubUser UserPoolId: !Ref UserPoolId UserPoolClientId: !Ref UserPoolClientId IdentityPoolId: !Ref IdentityPoolId StackBucketName: !Ref StackBucketName Subnets: !Ref Subnets VpcId: !Ref VpcId VpcCidr: !Ref VpcCidr ClusterName: !Ref ClusterName ServiceDiscoveryNamespace: !Ref ServiceDiscoveryNamespace ParameterPersonalizeEventTrackerId: !Ref ParameterPersonalizeEventTrackerId ParameterAmplitudeApiKey: !Ref ParameterAmplitudeApiKey ParameterOptimizelySdkKey: !Ref ParameterOptimizelySdkKey PinpointAppId: !Ref PinpointAppId CleanupBucketLambdaArn: !Ref CleanupBucketLambdaArn DeleteRepositoryLambdaArn: !GetAtt DeleteRepositoryLambdaFunction.Arn WebRootUrl: !Ref WebRootUrl ImageRootUrl: !Ref ImageRootUrl Uid: !Sub ${ParentStackName}-${AWS::Region} EvidentlyProjectName: !Ref EvidentlyProjectName LoggingBucketName: !Ref LoggingBucketName CartsService: Type: AWS::CloudFormation::Stack Properties: TemplateURL: !Sub https://s3.amazonaws.com/${ResourceBucket}/${ResourceBucketRelativePath}cloudformation-templates/services/service/_template.yaml Parameters: ServiceName: carts ServicePath: src/carts ResourceBucket: !Ref ResourceBucket ResourceBucketRelativePath: !Ref ResourceBucketRelativePath SourceDeploymentType: !Ref SourceDeploymentType GitHubRepo: !Ref GitHubRepo GitHubBranch: !Ref GitHubBranch GitHubToken: !Ref GitHubToken GitHubUser: !Ref GitHubUser UserPoolId: !Ref UserPoolId UserPoolClientId: !Ref UserPoolClientId IdentityPoolId: !Ref IdentityPoolId StackBucketName: !Ref StackBucketName Subnets: !Ref Subnets VpcId: !Ref VpcId VpcCidr: !Ref VpcCidr ClusterName: !Ref ClusterName ServiceDiscoveryNamespace: !Ref ServiceDiscoveryNamespace ParameterPersonalizeEventTrackerId: !Ref ParameterPersonalizeEventTrackerId ParameterAmplitudeApiKey: !Ref ParameterAmplitudeApiKey ParameterOptimizelySdkKey: !Ref ParameterOptimizelySdkKey CleanupBucketLambdaArn: !Ref CleanupBucketLambdaArn DeleteRepositoryLambdaArn: !GetAtt DeleteRepositoryLambdaFunction.Arn WebRootUrl: !Ref WebRootUrl ImageRootUrl: !Ref ImageRootUrl Uid: !Sub ${ParentStackName}-${AWS::Region} EvidentlyProjectName: !Ref EvidentlyProjectName LoggingBucketName: !Ref LoggingBucketName OrdersService: Type: AWS::CloudFormation::Stack Properties: TemplateURL: !Sub https://s3.amazonaws.com/${ResourceBucket}/${ResourceBucketRelativePath}cloudformation-templates/services/service/_template.yaml Parameters: ServiceName: orders ServicePath: src/orders ResourceBucket: !Ref ResourceBucket ResourceBucketRelativePath: !Ref ResourceBucketRelativePath SourceDeploymentType: !Ref SourceDeploymentType GitHubRepo: !Ref GitHubRepo GitHubBranch: !Ref GitHubBranch GitHubToken: !Ref GitHubToken GitHubUser: !Ref GitHubUser UserPoolId: !Ref UserPoolId UserPoolClientId: !Ref UserPoolClientId IdentityPoolId: !Ref IdentityPoolId StackBucketName: !Ref StackBucketName Subnets: !Ref Subnets VpcId: !Ref VpcId VpcCidr: !Ref VpcCidr ClusterName: !Ref ClusterName ServiceDiscoveryNamespace: !Ref ServiceDiscoveryNamespace ParameterPersonalizeEventTrackerId: !Ref ParameterPersonalizeEventTrackerId ParameterAmplitudeApiKey: !Ref ParameterAmplitudeApiKey ParameterOptimizelySdkKey: !Ref ParameterOptimizelySdkKey CleanupBucketLambdaArn: !Ref CleanupBucketLambdaArn DeleteRepositoryLambdaArn: !GetAtt DeleteRepositoryLambdaFunction.Arn WebRootUrl: !Ref WebRootUrl ImageRootUrl: !Ref ImageRootUrl Uid: !Sub ${ParentStackName}-${AWS::Region} EvidentlyProjectName: !Ref EvidentlyProjectName LoggingBucketName: !Ref LoggingBucketName SearchService: Type: AWS::CloudFormation::Stack Properties: TemplateURL: !Sub https://s3.amazonaws.com/${ResourceBucket}/${ResourceBucketRelativePath}cloudformation-templates/services/service/_template.yaml Parameters: ServiceName: search ServicePath: src/search ResourceBucket: !Ref ResourceBucket ResourceBucketRelativePath: !Ref ResourceBucketRelativePath SourceDeploymentType: !Ref SourceDeploymentType GitHubRepo: !Ref GitHubRepo GitHubBranch: !Ref GitHubBranch GitHubToken: !Ref GitHubToken GitHubUser: !Ref GitHubUser UserPoolId: !Ref UserPoolId UserPoolClientId: !Ref UserPoolClientId IdentityPoolId: !Ref IdentityPoolId StackBucketName: !Ref StackBucketName Subnets: !Ref Subnets VpcId: !Ref VpcId VpcCidr: !Ref VpcCidr ClusterName: !Ref ClusterName ServiceDiscoveryNamespace: !Ref ServiceDiscoveryNamespace EnvOpenSearchDomainEndpoint: !Ref EnvOpenSearchDomainEndpoint ParameterPersonalizeEventTrackerId: !Ref ParameterPersonalizeEventTrackerId ParameterAmplitudeApiKey: !Ref ParameterAmplitudeApiKey ParameterOptimizelySdkKey: !Ref ParameterOptimizelySdkKey CleanupBucketLambdaArn: !Ref CleanupBucketLambdaArn DeleteRepositoryLambdaArn: !GetAtt DeleteRepositoryLambdaFunction.Arn WebRootUrl: !Ref WebRootUrl ImageRootUrl: !Ref ImageRootUrl Uid: !Sub ${ParentStackName}-${AWS::Region} EvidentlyProjectName: !Ref EvidentlyProjectName LoggingBucketName: !Ref LoggingBucketName LocationService: Type: AWS::CloudFormation::Stack Properties: TemplateURL: !Sub https://s3.amazonaws.com/${ResourceBucket}/${ResourceBucketRelativePath}cloudformation-templates/services/service/_template.yaml Parameters: ServiceName: location ServicePath: src/location ResourceBucket: !Ref ResourceBucket ResourceBucketRelativePath: !Ref ResourceBucketRelativePath SourceDeploymentType: !Ref SourceDeploymentType GitHubRepo: !Ref GitHubRepo GitHubBranch: !Ref GitHubBranch GitHubToken: !Ref GitHubToken GitHubUser: !Ref GitHubUser UserPoolId: !Ref UserPoolId UserPoolClientId: !Ref UserPoolClientId IdentityPoolId: !Ref IdentityPoolId StackBucketName: !Ref StackBucketName Subnets: !Ref Subnets VpcId: !Ref VpcId VpcCidr: !Ref VpcCidr ClusterName: !Ref ClusterName ServiceDiscoveryNamespace: !Ref ServiceDiscoveryNamespace EnvOpenSearchDomainEndpoint: !Ref EnvOpenSearchDomainEndpoint ParameterPersonalizeEventTrackerId: !Ref ParameterPersonalizeEventTrackerId ParameterAmplitudeApiKey: !Ref ParameterAmplitudeApiKey ParameterOptimizelySdkKey: !Ref ParameterOptimizelySdkKey CleanupBucketLambdaArn: !Ref CleanupBucketLambdaArn DeleteRepositoryLambdaArn: !GetAtt DeleteRepositoryLambdaFunction.Arn WebRootUrl: !Ref WebRootUrl ImageRootUrl: !Ref ImageRootUrl Uid: !Sub ${ParentStackName}-${AWS::Region} EvidentlyProjectName: !Ref EvidentlyProjectName LoggingBucketName: !Ref LoggingBucketName OffersService: Type: AWS::CloudFormation::Stack Properties: TemplateURL: !Sub https://s3.amazonaws.com/${ResourceBucket}/${ResourceBucketRelativePath}cloudformation-templates/services/service/_template.yaml Parameters: ServiceName: offers ServicePath: src/offers ResourceBucket: !Ref ResourceBucket ResourceBucketRelativePath: !Ref ResourceBucketRelativePath SourceDeploymentType: !Ref SourceDeploymentType GitHubRepo: !Ref GitHubRepo GitHubBranch: !Ref GitHubBranch GitHubToken: !Ref GitHubToken GitHubUser: !Ref GitHubUser UserPoolId: !Ref UserPoolId UserPoolClientId: !Ref UserPoolClientId IdentityPoolId: !Ref IdentityPoolId StackBucketName: !Ref StackBucketName Subnets: !Ref Subnets VpcId: !Ref VpcId VpcCidr: !Ref VpcCidr ClusterName: !Ref ClusterName ServiceDiscoveryNamespace: !Ref ServiceDiscoveryNamespace EnvOpenSearchDomainEndpoint: !Ref EnvOpenSearchDomainEndpoint ParameterPersonalizeEventTrackerId: !Ref ParameterPersonalizeEventTrackerId ParameterAmplitudeApiKey: !Ref ParameterAmplitudeApiKey ParameterOptimizelySdkKey: !Ref ParameterOptimizelySdkKey CleanupBucketLambdaArn: !Ref CleanupBucketLambdaArn DeleteRepositoryLambdaArn: !GetAtt DeleteRepositoryLambdaFunction.Arn WebRootUrl: !Ref WebRootUrl ImageRootUrl: !Ref ImageRootUrl Uid: !Sub ${ParentStackName}-${AWS::Region} EvidentlyProjectName: !Ref EvidentlyProjectName LoggingBucketName: !Ref LoggingBucketName RecommendationsService: Type: AWS::CloudFormation::Stack Properties: TemplateURL: !Sub https://s3.amazonaws.com/${ResourceBucket}/${ResourceBucketRelativePath}cloudformation-templates/services/service/_template.yaml Parameters: ServiceName: recommendations ServicePath: src/recommendations ResourceBucket: !Ref ResourceBucket ResourceBucketRelativePath: !Ref ResourceBucketRelativePath SourceDeploymentType: !Ref SourceDeploymentType GitHubRepo: !Ref GitHubRepo GitHubBranch: !Ref GitHubBranch GitHubToken: !Ref GitHubToken GitHubUser: !Ref GitHubUser UserPoolId: !Ref UserPoolId UserPoolClientId: !Ref UserPoolClientId IdentityPoolId: !Ref IdentityPoolId StackBucketName: !Ref StackBucketName Subnets: !Ref Subnets VpcId: !Ref VpcId VpcCidr: !Ref VpcCidr ClusterName: !Ref ClusterName ServiceDiscoveryNamespace: !Ref ServiceDiscoveryNamespace ProductsTable: !Ref ProductsTable CategoriesTable: !Ref CategoriesTable ExperimentStrategyTable: !Ref ExperimentStrategyTable ParameterPersonalizeEventTrackerId: !Ref ParameterPersonalizeEventTrackerId ParameterAmplitudeApiKey: !Ref ParameterAmplitudeApiKey ParameterOptimizelySdkKey: !Ref ParameterOptimizelySdkKey CleanupBucketLambdaArn: !Ref CleanupBucketLambdaArn DeleteRepositoryLambdaArn: !GetAtt DeleteRepositoryLambdaFunction.Arn WebRootUrl: !Ref WebRootUrl ImageRootUrl: !Ref ImageRootUrl Uid: !Sub ${ParentStackName}-${AWS::Region} EvidentlyProjectName: !Ref EvidentlyProjectName LoggingBucketName: !Ref LoggingBucketName VideosService: Type: AWS::CloudFormation::Stack Properties: TemplateURL: !Sub https://s3.amazonaws.com/${ResourceBucket}/${ResourceBucketRelativePath}cloudformation-templates/services/service/_template.yaml Parameters: ServiceName: videos ServicePath: src/videos ResourceBucket: !Ref ResourceBucket ResourceBucketRelativePath: !Ref ResourceBucketRelativePath SourceDeploymentType: !Ref SourceDeploymentType GitHubRepo: !Ref GitHubRepo GitHubBranch: !Ref GitHubBranch GitHubToken: !Ref GitHubToken GitHubUser: !Ref GitHubUser UserPoolId: !Ref UserPoolId UserPoolClientId: !Ref UserPoolClientId IdentityPoolId: !Ref IdentityPoolId StackBucketName: !Ref StackBucketName Subnets: !Ref Subnets VpcId: !Ref VpcId VpcCidr: !Ref VpcCidr ClusterName: !Ref ClusterName ServiceDiscoveryNamespace: !Ref ServiceDiscoveryNamespace ParameterPersonalizeEventTrackerId: !Ref ParameterPersonalizeEventTrackerId ParameterAmplitudeApiKey: !Ref ParameterAmplitudeApiKey ParameterOptimizelySdkKey: !Ref ParameterOptimizelySdkKey ParameterIVSVideoChannelMap: !Ref ParameterIVSVideoChannelMap CleanupBucketLambdaArn: !Ref CleanupBucketLambdaArn DeleteRepositoryLambdaArn: !GetAtt DeleteRepositoryLambdaFunction.Arn UseDefaultIVSStreams: !If [UseDefaultIVSStreams, true, false] WebRootUrl: !Ref WebRootUrl ImageRootUrl: !Ref ImageRootUrl Uid: !Sub ${ParentStackName}-${AWS::Region} EvidentlyProjectName: !Ref EvidentlyProjectName LoggingBucketName: !Ref LoggingBucketName # Pinpoint personalized messaging customization PinpointPersonalize: Type: AWS::CloudFormation::Stack Properties: TemplateURL: !Sub https://s3.amazonaws.com/${ResourceBucket}/${ResourceBucketRelativePath}cloudformation-templates/services/pinpoint-personalize.yaml Parameters: ResourceBucket: !Ref ResourceBucket ResourceBucketRelativePath: !Ref ResourceBucketRelativePath ProductsServiceDNSName: !GetAtt ProductsService.Outputs.ServiceDNSName RecommendationsServiceDNSName: !GetAtt RecommendationsService.Outputs.ServiceDNSName OffersServiceDNSName: !GetAtt OffersService.Outputs.ServiceDNSName PinpointAppId: !Ref PinpointAppId Uid: !Sub ${ParentStackName}-${AWS::Region} LambdaVpcSecurityGroup: !Ref LambdaVpcSecurityGroup LambdaVpcSubnets: !Ref Subnets # Custom resources CustomResources: Type: AWS::CloudFormation::Stack Properties: TemplateURL: !Sub https://s3.amazonaws.com/${ResourceBucket}/${ResourceBucketRelativePath}cloudformation-templates/services/ProductsCustom.yaml Parameters: ResourceBucket: !Ref ResourceBucket ResourceBucketRelativePath: !Ref ResourceBucketRelativePath ProductsTable: !Ref ProductsTable CategoriesTable: !Ref CategoriesTable ####################### Delete Repository Custom Resource ####################### DeleteRepositoryLambdaFunction: Type: 'AWS::Lambda::Function' Properties: Description: 'Retail Demo Store deployment utility function that deletes an Amazon ECR repository when the CloudFormation stack is deleted' Code: ZipFile: | import boto3 import cfnresponse def handler(event, context): print(event) responseData = {} responseStatus = cfnresponse.SUCCESS try: registryId = event['ResourceProperties']['RegistryId'] repositoryName = event['ResourceProperties']['RepositoryName'] if event['RequestType'] == 'Create': responseData['Message'] = "Repository creation succeeded" elif event['RequestType'] == 'Update': responseData['Message'] = "Repository update succeeded" elif event['RequestType'] == 'Delete': # Delete the registry ecr = boto3.client('ecr') ecr.delete_repository( registryId=registryId, repositoryName=repositoryName, force=True ) responseData['Message'] = "Repository deletion succeeded" except Exception as e: print("Error: " + str(e)) responseStatus = cfnresponse.FAILED responseData['Message'] = "Repository {} failed: {}".format(event['RequestType'], e) cfnresponse.send(event, context, responseStatus, responseData) Handler: index.handler Runtime: python3.7 Timeout: 30 Role: !GetAtt DeleteRepositoryLambdaExecutionRole.Arn DeleteRepositoryLambdaExecutionRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: - lambda.amazonaws.com Action: - sts:AssumeRole Path: "/" Policies: - PolicyName: root PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - logs:CreateLogGroup - logs:CreateLogStream - logs:PutLogEvents Resource: arn:aws:logs:*:*:* - Effect: Allow Action: - ecr:DeleteRepository Resource: !Sub 'arn:aws:ecr:${AWS::Region}:${AWS::AccountId}:repository/retaildemostore*' Outputs: ProductsServiceUrl: Description: Products load balancer URL. Value: !GetAtt ProductsService.Outputs.ServiceUrl ProductsServiceELBListener: Description: Products Service ELB Arn Value: !GetAtt ProductsService.Outputs.ServiceELBListener UsersServiceUrl: Description: Users load balancer URL. Value: !GetAtt UsersService.Outputs.ServiceUrl UsersServiceELBListener: Description: Users Service ELB Arn Value: !GetAtt UsersService.Outputs.ServiceELBListener CartsServiceUrl: Description: Carts load balancer URL. Value: !GetAtt CartsService.Outputs.ServiceUrl CartsServiceELBListener: Description: Carts ELB Arn Value: !GetAtt CartsService.Outputs.ServiceELBListener OrdersServiceUrl: Description: Orders load balancer URL. Value: !GetAtt OrdersService.Outputs.ServiceUrl OrdersServiceELBListener: Description: Orders ELB Arn Value: !GetAtt OrdersService.Outputs.ServiceELBListener LocationServiceUrl: Description: Location load balancer URL. Value: !GetAtt LocationService.Outputs.ServiceUrl LocationServiceELBListener: Description: Location ELB Arn Value: !GetAtt LocationService.Outputs.ServiceELBListener RecommendationsServiceUrl: Description: Recommendations load balancer URL. Value: !GetAtt RecommendationsService.Outputs.ServiceUrl RecommendationsServiceELBListener: Description: Recommendations ELB Arn Value: !GetAtt RecommendationsService.Outputs.ServiceELBListener VideosServiceUrl: Description: Videos load balancer URL. Value: !GetAtt VideosService.Outputs.ServiceUrl VideosServiceELBListener: Description: Videos ELB Arn Value: !GetAtt VideosService.Outputs.ServiceELBListener SearchServiceUrl: Description: Search load balancer URL. Value: !GetAtt SearchService.Outputs.ServiceUrl SearchServiceELBListener: Description: Search ELB Arn Value: !GetAtt SearchService.Outputs.ServiceELBListener OffersServiceUrl: Description: Offers service load balancer URL. Value: !GetAtt OffersService.Outputs.ServiceUrl OffersServiceELBListener: Description: Offers ELB Arn Value: !GetAtt OffersService.Outputs.ServiceELBListener PinpointPersonalizeRoleArn: Value: !GetAtt PinpointPersonalize.Outputs.PinpointPersonalizeRoleArn CustomizeRecommendationsFunctionArn: Value: !GetAtt PinpointPersonalize.Outputs.CustomizeRecommendationsFunctionArn CustomizeOffersRecommendationsFunctionArn: Value: !GetAtt PinpointPersonalize.Outputs.CustomizeOffersRecommendationsFunctionArn