github.com/mweagle/Sparta@v1.15.0/docs/reference/hybrid_topologies/index.html (about)

     1  <!DOCTYPE html>
     2  <html lang="en" class="js csstransforms3d">
     3    <head>
     4      <meta charset="utf-8">
     5      <meta name="viewport" content="width=device-width, initial-scale=1.0">
     6      <meta name="generator" content="Hugo 0.69.2" />
     7      <meta name="description" content="Sparta - AWS Lambda Microservices">
     8  <meta name="author" content="Matt Weagle">
     9  
    10      <link rel="icon" href="/images/favicon.png" type="image/png">
    11  
    12      <title>Hybrid Topologies :: Sparta - AWS Lambda Microservices</title>
    13  
    14      
    15      <link href="/css/nucleus.css?1588464711" rel="stylesheet">
    16      <link href="/css/fontawesome-all.min.css?1588464711" rel="stylesheet">
    17      <link href="/css/hybrid.css?1588464711" rel="stylesheet">
    18      <link href="/css/featherlight.min.css?1588464711" rel="stylesheet">
    19      <link href="/css/perfect-scrollbar.min.css?1588464711" rel="stylesheet">
    20      <link href="/css/auto-complete.css?1588464711" rel="stylesheet">
    21      <link href="/css/theme.css?1588464711" rel="stylesheet">
    22      <link href="/css/hugo-theme.css?1588464711" rel="stylesheet">
    23      
    24        <link href="/css/theme-sparta.css?1588464711" rel="stylesheet">
    25      
    26  
    27      <script src="/js/jquery-3.3.1.min.js?1588464711"></script>
    28      
    29      <link href="/css/vs.css?1588464711" rel="stylesheet">
    30      <script src="/js/highlight.pack.js?1588464711"></script>
    31      <script>hljs.initHighlightingOnLoad();</script>
    32      
    33  
    34      <style>
    35        :root #header + #content > #left > #rlblock_left{
    36            display:none !important;
    37        }
    38        
    39      </style>
    40      
    41  <style type="text/css">
    42  pre {
    43      padding: 2px;
    44  }
    45  </style>
    46  
    47  
    48    </head>
    49    <body class="" data-url="/reference/hybrid_topologies/">
    50      <nav id="sidebar" class="">
    51  
    52  
    53  
    54    <div id="header-wrapper">
    55      <div id="header">
    56        <a href="/"><img src="/images/SpartaLogoNoDomain.png" height="50%" width="50%"/></a>
    57      </div>
    58      
    59          <div class="searchbox">
    60      <label for="search-by"><i class="fas fa-search"></i></label>
    61      <input data-search-input id="search-by" type="search" placeholder="Search...">
    62      <span data-search-clear=""><i class="fas fa-times"></i></span>
    63  </div>
    64  
    65  <script type="text/javascript" src="/js/lunr.min.js?1588464711"></script>
    66  <script type="text/javascript" src="/js/auto-complete.js?1588464711"></script>
    67  <script type="text/javascript">
    68      
    69          var baseurl = "\/";
    70      
    71  </script>
    72  <script type="text/javascript" src="/js/search.js?1588464711"></script>
    73  
    74      
    75    </div>
    76  
    77      <div class="highlightable">
    78      <ul class="topics">
    79  
    80          
    81            
    82            
    83  
    84  
    85   
    86    
    87      
    88      <li data-nav-id="/getting_started/" title="Getting Started" class="dd-item 
    89          
    90          
    91          
    92          ">
    93        <a href="/getting_started/">
    94            Getting Started
    95            
    96        </a>
    97        
    98                
    99      </li>
   100    
   101   
   102  
   103            
   104            
   105  
   106  
   107   
   108    
   109      
   110      <li data-nav-id="/example_service/" title="Example Service" class="dd-item 
   111          
   112          
   113          
   114          ">
   115        <a href="/example_service/">
   116            Example Service
   117            
   118        </a>
   119        
   120        
   121          <ul>
   122            
   123            
   124            
   125            
   126          
   127            
   128              
   129              
   130  
   131  
   132   
   133    
   134      
   135        <li data-nav-id="/example_service/step1/" title="Overview" class="dd-item ">
   136          <a href="/example_service/step1/">
   137          Overview
   138          
   139          </a>
   140      </li>
   141       
   142    
   143   
   144  
   145              
   146            
   147              
   148              
   149  
   150  
   151   
   152    
   153      
   154        <li data-nav-id="/example_service/step2/" title="Details" class="dd-item ">
   155          <a href="/example_service/step2/">
   156          Details
   157          
   158          </a>
   159      </li>
   160       
   161    
   162   
   163  
   164              
   165            
   166          
   167          </ul>
   168                
   169      </li>
   170    
   171   
   172  
   173            
   174            
   175  
   176  
   177   
   178    
   179      
   180      <li data-nav-id="/concepts/" title="Concepts" class="dd-item 
   181          
   182          
   183          
   184          ">
   185        <a href="/concepts/">
   186            Concepts
   187            
   188        </a>
   189        
   190                
   191      </li>
   192    
   193   
   194  
   195            
   196            
   197  
   198  
   199   
   200    
   201      
   202      <li data-nav-id="/reference/" title="Reference" class="dd-item 
   203          parent
   204          
   205          
   206          ">
   207        <a href="/reference/">
   208            Reference
   209            
   210        </a>
   211        
   212        
   213          <ul>
   214            
   215            
   216              
   217            
   218            
   219            
   220          
   221            
   222              
   223              
   224  
   225  
   226   
   227    
   228      
   229      <li data-nav-id="/reference/apigateway/" title="" class="dd-item 
   230          
   231          
   232          
   233          ">
   234        <a href="/reference/apigateway/">
   235            <b>API Gateway</b>
   236            
   237        </a>
   238        
   239        
   240          <ul>
   241            
   242            
   243            
   244            
   245          
   246            
   247              
   248              
   249  
   250  
   251   
   252    
   253      
   254        <li data-nav-id="/reference/apigateway/echo_event/" title="Echo" class="dd-item ">
   255          <a href="/reference/apigateway/echo_event/">
   256          Echo
   257          
   258          </a>
   259      </li>
   260       
   261    
   262   
   263  
   264              
   265            
   266              
   267              
   268  
   269  
   270   
   271    
   272      
   273        <li data-nav-id="/reference/apigateway/request_params/" title="Request Parameters" class="dd-item ">
   274          <a href="/reference/apigateway/request_params/">
   275          Request Parameters
   276          
   277          </a>
   278      </li>
   279       
   280    
   281   
   282  
   283              
   284            
   285              
   286              
   287  
   288  
   289   
   290    
   291      
   292        <li data-nav-id="/reference/apigateway/context/" title="Request Context" class="dd-item ">
   293          <a href="/reference/apigateway/context/">
   294          Request Context
   295          
   296          </a>
   297      </li>
   298       
   299    
   300   
   301  
   302              
   303            
   304              
   305              
   306  
   307  
   308   
   309    
   310      
   311        <li data-nav-id="/reference/apigateway/cors/" title="CORS" class="dd-item ">
   312          <a href="/reference/apigateway/cors/">
   313          CORS
   314          
   315          </a>
   316      </li>
   317       
   318    
   319   
   320  
   321              
   322            
   323              
   324              
   325  
   326  
   327   
   328    
   329      
   330        <li data-nav-id="/reference/apigateway/slack/" title="Slack SlashCommand" class="dd-item ">
   331          <a href="/reference/apigateway/slack/">
   332          Slack SlashCommand
   333          
   334          </a>
   335      </li>
   336       
   337    
   338   
   339  
   340              
   341            
   342              
   343              
   344  
   345  
   346   
   347    
   348      
   349        <li data-nav-id="/reference/apigateway/s3site/" title="S3 Sites with CORS" class="dd-item ">
   350          <a href="/reference/apigateway/s3site/">
   351          S3 Sites with CORS
   352          
   353          </a>
   354      </li>
   355       
   356    
   357   
   358  
   359              
   360            
   361          
   362          </ul>
   363                
   364      </li>
   365    
   366   
   367  
   368              
   369            
   370              
   371              
   372  
   373  
   374   
   375    
   376      
   377      <li data-nav-id="/reference/apiv2gateway/" title="" class="dd-item 
   378          
   379          
   380          
   381          ">
   382        <a href="/reference/apiv2gateway/">
   383            <b>API V2 Gateway</b>
   384            
   385        </a>
   386        
   387                
   388      </li>
   389    
   390   
   391  
   392              
   393            
   394              
   395              
   396  
   397  
   398   
   399    
   400      
   401      <li data-nav-id="/reference/eventsources/" title="" class="dd-item 
   402          
   403          
   404          
   405          ">
   406        <a href="/reference/eventsources/">
   407            <b>Event Sources</b>
   408            
   409        </a>
   410        
   411        
   412          <ul>
   413            
   414            
   415            
   416            
   417          
   418            
   419              
   420              
   421  
   422  
   423   
   424    
   425      
   426        <li data-nav-id="/reference/eventsources/codecommit/" title="CodeCommit" class="dd-item ">
   427          <a href="/reference/eventsources/codecommit/">
   428          CodeCommit
   429          
   430          </a>
   431      </li>
   432       
   433    
   434   
   435  
   436              
   437            
   438              
   439              
   440  
   441  
   442   
   443    
   444      
   445        <li data-nav-id="/reference/eventsources/cloudformation/" title="CloudFormation" class="dd-item ">
   446          <a href="/reference/eventsources/cloudformation/">
   447          CloudFormation
   448          
   449          </a>
   450      </li>
   451       
   452    
   453   
   454  
   455              
   456            
   457              
   458              
   459  
   460  
   461   
   462    
   463      
   464        <li data-nav-id="/reference/eventsources/cloudwatchevents/" title="CloudWatch Events" class="dd-item ">
   465          <a href="/reference/eventsources/cloudwatchevents/">
   466          CloudWatch Events
   467          
   468          </a>
   469      </li>
   470       
   471    
   472   
   473  
   474              
   475            
   476              
   477              
   478  
   479  
   480   
   481    
   482      
   483        <li data-nav-id="/reference/eventsources/cloudwatchlogs/" title="CloudWatch Logs" class="dd-item ">
   484          <a href="/reference/eventsources/cloudwatchlogs/">
   485          CloudWatch Logs
   486          
   487          </a>
   488      </li>
   489       
   490    
   491   
   492  
   493              
   494            
   495              
   496              
   497  
   498  
   499   
   500    
   501      
   502        <li data-nav-id="/reference/eventsources/cognito/" title="Cognito" class="dd-item ">
   503          <a href="/reference/eventsources/cognito/">
   504          Cognito
   505          
   506          </a>
   507      </li>
   508       
   509    
   510   
   511  
   512              
   513            
   514              
   515              
   516  
   517  
   518   
   519    
   520      
   521        <li data-nav-id="/reference/eventsources/dynamodb/" title="DynamoDB" class="dd-item ">
   522          <a href="/reference/eventsources/dynamodb/">
   523          DynamoDB
   524          
   525          </a>
   526      </li>
   527       
   528    
   529   
   530  
   531              
   532            
   533              
   534              
   535  
   536  
   537   
   538    
   539      
   540        <li data-nav-id="/reference/eventsources/kinesis/" title="Kinesis" class="dd-item ">
   541          <a href="/reference/eventsources/kinesis/">
   542          Kinesis
   543          
   544          </a>
   545      </li>
   546       
   547    
   548   
   549  
   550              
   551            
   552              
   553              
   554  
   555  
   556   
   557    
   558      
   559        <li data-nav-id="/reference/eventsources/s3/" title="S3" class="dd-item ">
   560          <a href="/reference/eventsources/s3/">
   561          S3
   562          
   563          </a>
   564      </li>
   565       
   566    
   567   
   568  
   569              
   570            
   571              
   572              
   573  
   574  
   575   
   576    
   577      
   578        <li data-nav-id="/reference/eventsources/ses/" title="SES" class="dd-item ">
   579          <a href="/reference/eventsources/ses/">
   580          SES
   581          
   582          </a>
   583      </li>
   584       
   585    
   586   
   587  
   588              
   589            
   590              
   591              
   592  
   593  
   594   
   595    
   596      
   597        <li data-nav-id="/reference/eventsources/sns/" title="SNS" class="dd-item ">
   598          <a href="/reference/eventsources/sns/">
   599          SNS
   600          
   601          </a>
   602      </li>
   603       
   604    
   605   
   606  
   607              
   608            
   609              
   610              
   611  
   612  
   613   
   614    
   615      
   616        <li data-nav-id="/reference/eventsources/sqs/" title="SQS" class="dd-item ">
   617          <a href="/reference/eventsources/sqs/">
   618          SQS
   619          
   620          </a>
   621      </li>
   622       
   623    
   624   
   625  
   626              
   627            
   628          
   629          </ul>
   630                
   631      </li>
   632    
   633   
   634  
   635              
   636            
   637              
   638              
   639  
   640  
   641   
   642    
   643      
   644      <li data-nav-id="/reference/archetypes/" title="" class="dd-item 
   645          
   646          
   647          
   648          ">
   649        <a href="/reference/archetypes/">
   650            <b>Archetype Constructors</b>
   651            
   652        </a>
   653        
   654        
   655          <ul>
   656            
   657            
   658            
   659            
   660          
   661            
   662              
   663              
   664  
   665  
   666   
   667    
   668      
   669        <li data-nav-id="/reference/archetypes/event_bridge/" title="Event Bridge" class="dd-item ">
   670          <a href="/reference/archetypes/event_bridge/">
   671          Event Bridge
   672          
   673          </a>
   674      </li>
   675       
   676    
   677   
   678  
   679              
   680            
   681              
   682              
   683  
   684  
   685   
   686    
   687      
   688        <li data-nav-id="/reference/archetypes/codecommit/" title="CodeCommit" class="dd-item ">
   689          <a href="/reference/archetypes/codecommit/">
   690          CodeCommit
   691          
   692          </a>
   693      </li>
   694       
   695    
   696   
   697  
   698              
   699            
   700              
   701              
   702  
   703  
   704   
   705    
   706      
   707        <li data-nav-id="/reference/archetypes/cloudwatch/" title="CloudWatch" class="dd-item ">
   708          <a href="/reference/archetypes/cloudwatch/">
   709          CloudWatch
   710          
   711          </a>
   712      </li>
   713       
   714    
   715   
   716  
   717              
   718            
   719              
   720              
   721  
   722  
   723   
   724    
   725      
   726        <li data-nav-id="/reference/archetypes/dynamodb/" title="DynamoDB" class="dd-item ">
   727          <a href="/reference/archetypes/dynamodb/">
   728          DynamoDB
   729          
   730          </a>
   731      </li>
   732       
   733    
   734   
   735  
   736              
   737            
   738              
   739              
   740  
   741  
   742   
   743    
   744      
   745        <li data-nav-id="/reference/archetypes/kinesis/" title="Kinesis" class="dd-item ">
   746          <a href="/reference/archetypes/kinesis/">
   747          Kinesis
   748          
   749          </a>
   750      </li>
   751       
   752    
   753   
   754  
   755              
   756            
   757              
   758              
   759  
   760  
   761   
   762    
   763      
   764        <li data-nav-id="/reference/archetypes/kinesis_firehose/" title="Kinesis Firehose" class="dd-item ">
   765          <a href="/reference/archetypes/kinesis_firehose/">
   766          Kinesis Firehose
   767          
   768          </a>
   769      </li>
   770       
   771    
   772   
   773  
   774              
   775            
   776              
   777              
   778  
   779  
   780   
   781    
   782      
   783        <li data-nav-id="/reference/archetypes/rest/" title="REST Service" class="dd-item ">
   784          <a href="/reference/archetypes/rest/">
   785          REST Service
   786          
   787          </a>
   788      </li>
   789       
   790    
   791   
   792  
   793              
   794            
   795              
   796              
   797  
   798  
   799   
   800    
   801      
   802        <li data-nav-id="/reference/archetypes/s3/" title="S3" class="dd-item ">
   803          <a href="/reference/archetypes/s3/">
   804          S3
   805          
   806          </a>
   807      </li>
   808       
   809    
   810   
   811  
   812              
   813            
   814              
   815              
   816  
   817  
   818   
   819    
   820      
   821        <li data-nav-id="/reference/archetypes/sns/" title="SNS" class="dd-item ">
   822          <a href="/reference/archetypes/sns/">
   823          SNS
   824          
   825          </a>
   826      </li>
   827       
   828    
   829   
   830  
   831              
   832            
   833          
   834          </ul>
   835                
   836      </li>
   837    
   838   
   839  
   840              
   841            
   842              
   843              
   844  
   845  
   846   
   847    
   848      
   849      <li data-nav-id="/reference/decorators/" title="" class="dd-item 
   850          
   851          
   852          
   853          ">
   854        <a href="/reference/decorators/">
   855            <b>Build-Time Decorators</b>
   856            
   857        </a>
   858        
   859        
   860          <ul>
   861            
   862            
   863            
   864            
   865          
   866            
   867              
   868              
   869  
   870  
   871   
   872    
   873      
   874        <li data-nav-id="/reference/decorators/application_load_balancer/" title="Application Load Balancer" class="dd-item ">
   875          <a href="/reference/decorators/application_load_balancer/">
   876          Application Load Balancer
   877          
   878          </a>
   879      </li>
   880       
   881    
   882   
   883  
   884              
   885            
   886              
   887              
   888  
   889  
   890   
   891    
   892      
   893        <li data-nav-id="/reference/decorators/cloudmap/" title="CloudMap Service Discovery" class="dd-item ">
   894          <a href="/reference/decorators/cloudmap/">
   895          CloudMap Service Discovery
   896          
   897          </a>
   898      </li>
   899       
   900    
   901   
   902  
   903              
   904            
   905              
   906              
   907  
   908  
   909   
   910    
   911      
   912        <li data-nav-id="/reference/decorators/cloudfront_distribution/" title="CloudFront Distribution" class="dd-item ">
   913          <a href="/reference/decorators/cloudfront_distribution/">
   914          CloudFront Distribution
   915          
   916          </a>
   917      </li>
   918       
   919    
   920   
   921  
   922              
   923            
   924              
   925              
   926  
   927  
   928   
   929    
   930      
   931        <li data-nav-id="/reference/decorators/lambda_versioning/" title="Lambda Versioning Decorator" class="dd-item ">
   932          <a href="/reference/decorators/lambda_versioning/">
   933          Lambda Versioning Decorator
   934          
   935          </a>
   936      </li>
   937       
   938    
   939   
   940  
   941              
   942            
   943              
   944              
   945  
   946  
   947   
   948    
   949      
   950        <li data-nav-id="/reference/decorators/publish_outputs/" title="Publishing Outputs" class="dd-item ">
   951          <a href="/reference/decorators/publish_outputs/">
   952          Publishing Outputs
   953          
   954          </a>
   955      </li>
   956       
   957    
   958   
   959  
   960              
   961            
   962              
   963              
   964  
   965  
   966   
   967    
   968      
   969        <li data-nav-id="/reference/decorators/s3_artifact_publisher/" title="S3 Artifact Publisher" class="dd-item ">
   970          <a href="/reference/decorators/s3_artifact_publisher/">
   971          S3 Artifact Publisher
   972          
   973          </a>
   974      </li>
   975       
   976    
   977   
   978  
   979              
   980            
   981              
   982              
   983  
   984  
   985   
   986    
   987      
   988        <li data-nav-id="/reference/decorators/dynamic_infrastructure/" title="Dynamic Infrastructure" class="dd-item ">
   989          <a href="/reference/decorators/dynamic_infrastructure/">
   990          Dynamic Infrastructure
   991          
   992          </a>
   993      </li>
   994       
   995    
   996   
   997  
   998              
   999            
  1000          
  1001          </ul>
  1002                
  1003      </li>
  1004    
  1005   
  1006  
  1007              
  1008            
  1009              
  1010              
  1011  
  1012  
  1013   
  1014    
  1015      
  1016      <li data-nav-id="/reference/interceptors/" title="" class="dd-item 
  1017          
  1018          
  1019          
  1020          ">
  1021        <a href="/reference/interceptors/">
  1022            <b>Runtime Interceptors</b>
  1023            
  1024        </a>
  1025        
  1026        
  1027          <ul>
  1028            
  1029            
  1030            
  1031            
  1032          
  1033            
  1034              
  1035              
  1036  
  1037  
  1038   
  1039    
  1040      
  1041        <li data-nav-id="/reference/interceptors/xray_interceptor/" title="XRayInterceptor" class="dd-item ">
  1042          <a href="/reference/interceptors/xray_interceptor/">
  1043          XRayInterceptor
  1044          
  1045          </a>
  1046      </li>
  1047       
  1048    
  1049   
  1050  
  1051              
  1052            
  1053          
  1054          </ul>
  1055                
  1056      </li>
  1057    
  1058   
  1059  
  1060              
  1061            
  1062              
  1063              
  1064  
  1065  
  1066   
  1067    
  1068      
  1069      <li data-nav-id="/reference/cli_options/" title="" class="dd-item 
  1070          
  1071          
  1072          
  1073          ">
  1074        <a href="/reference/cli_options/">
  1075            <b>Command Line Options</b>
  1076            
  1077        </a>
  1078        
  1079                
  1080      </li>
  1081    
  1082   
  1083  
  1084              
  1085            
  1086              
  1087              
  1088  
  1089  
  1090   
  1091    
  1092      
  1093      <li data-nav-id="/reference/application/" title="" class="dd-item 
  1094          
  1095          
  1096          
  1097          ">
  1098        <a href="/reference/application/">
  1099            <b>Application Customization</b>
  1100            
  1101        </a>
  1102        
  1103        
  1104          <ul>
  1105            
  1106            
  1107            
  1108            
  1109          
  1110            
  1111              
  1112              
  1113  
  1114  
  1115   
  1116    
  1117      
  1118        <li data-nav-id="/reference/application/custom_commands/" title="Custom Commands" class="dd-item ">
  1119          <a href="/reference/application/custom_commands/">
  1120          Custom Commands
  1121          
  1122          </a>
  1123      </li>
  1124       
  1125    
  1126   
  1127  
  1128              
  1129            
  1130              
  1131              
  1132  
  1133  
  1134   
  1135    
  1136      
  1137        <li data-nav-id="/reference/application/custom_flags/" title="Custom Flags" class="dd-item ">
  1138          <a href="/reference/application/custom_flags/">
  1139          Custom Flags
  1140          
  1141          </a>
  1142      </li>
  1143       
  1144    
  1145   
  1146  
  1147              
  1148            
  1149              
  1150              
  1151  
  1152  
  1153   
  1154    
  1155      
  1156        <li data-nav-id="/reference/application/environments/" title="Managing Environments" class="dd-item ">
  1157          <a href="/reference/application/environments/">
  1158          Managing Environments
  1159          
  1160          </a>
  1161      </li>
  1162       
  1163    
  1164   
  1165  
  1166              
  1167            
  1168              
  1169              
  1170  
  1171  
  1172   
  1173    
  1174      
  1175        <li data-nav-id="/reference/application/custom_lambda_resources/" title="CloudFormation Resources" class="dd-item ">
  1176          <a href="/reference/application/custom_lambda_resources/">
  1177          CloudFormation Resources
  1178          
  1179          </a>
  1180      </li>
  1181       
  1182    
  1183   
  1184  
  1185              
  1186            
  1187              
  1188              
  1189  
  1190  
  1191   
  1192    
  1193      
  1194        <li data-nav-id="/reference/application/custom_resources/" title="Custom Resources" class="dd-item ">
  1195          <a href="/reference/application/custom_resources/">
  1196          Custom Resources
  1197          
  1198          </a>
  1199      </li>
  1200       
  1201    
  1202   
  1203  
  1204              
  1205            
  1206          
  1207          </ul>
  1208                
  1209      </li>
  1210    
  1211   
  1212  
  1213              
  1214            
  1215              
  1216              
  1217  
  1218  
  1219   
  1220    
  1221      
  1222      <li data-nav-id="/reference/step/" title="" class="dd-item 
  1223          
  1224          
  1225          
  1226          ">
  1227        <a href="/reference/step/">
  1228            <b>Step Functions</b>
  1229            
  1230        </a>
  1231        
  1232        
  1233          <ul>
  1234            
  1235            
  1236              
  1237            
  1238            
  1239            
  1240          
  1241            
  1242              
  1243              
  1244  
  1245  
  1246   
  1247    
  1248      
  1249        <li data-nav-id="/reference/step/lambda/" title="Lambda" class="dd-item ">
  1250          <a href="/reference/step/lambda/">
  1251          Lambda
  1252          
  1253          </a>
  1254      </li>
  1255       
  1256    
  1257   
  1258  
  1259              
  1260            
  1261              
  1262              
  1263  
  1264  
  1265   
  1266    
  1267      
  1268        <li data-nav-id="/reference/step/fargate/" title="Fargate" class="dd-item ">
  1269          <a href="/reference/step/fargate/">
  1270          Fargate
  1271          
  1272          </a>
  1273      </li>
  1274       
  1275    
  1276   
  1277  
  1278              
  1279            
  1280              
  1281              
  1282  
  1283  
  1284   
  1285    
  1286      
  1287      <li data-nav-id="/reference/step/services/" title="" class="dd-item 
  1288          
  1289          
  1290          
  1291          ">
  1292        <a href="/reference/step/services/">
  1293            <b>Service Integrations</b>
  1294            
  1295        </a>
  1296        
  1297        
  1298          <ul>
  1299            
  1300            
  1301            
  1302            
  1303          
  1304            
  1305              
  1306              
  1307  
  1308  
  1309   
  1310    
  1311      
  1312        <li data-nav-id="/reference/step/services/dynamodb/" title="Amazon DynamoDb" class="dd-item ">
  1313          <a href="/reference/step/services/dynamodb/">
  1314          Amazon DynamoDb
  1315          
  1316          </a>
  1317      </li>
  1318       
  1319    
  1320   
  1321  
  1322              
  1323            
  1324              
  1325              
  1326  
  1327  
  1328   
  1329    
  1330      
  1331        <li data-nav-id="/reference/step/services/sagemaker/" title="Amazon SageMaker" class="dd-item ">
  1332          <a href="/reference/step/services/sagemaker/">
  1333          Amazon SageMaker
  1334          
  1335          </a>
  1336      </li>
  1337       
  1338    
  1339   
  1340  
  1341              
  1342            
  1343              
  1344              
  1345  
  1346  
  1347   
  1348    
  1349      
  1350        <li data-nav-id="/reference/step/services/sns/" title="Amazon SNS" class="dd-item ">
  1351          <a href="/reference/step/services/sns/">
  1352          Amazon SNS
  1353          
  1354          </a>
  1355      </li>
  1356       
  1357    
  1358   
  1359  
  1360              
  1361            
  1362              
  1363              
  1364  
  1365  
  1366   
  1367    
  1368      
  1369        <li data-nav-id="/reference/step/services/sqs/" title="Amazon SQS" class="dd-item ">
  1370          <a href="/reference/step/services/sqs/">
  1371          Amazon SQS
  1372          
  1373          </a>
  1374      </li>
  1375       
  1376    
  1377   
  1378  
  1379              
  1380            
  1381              
  1382              
  1383  
  1384  
  1385   
  1386    
  1387      
  1388        <li data-nav-id="/reference/step/services/batch/" title="AWS Batch" class="dd-item ">
  1389          <a href="/reference/step/services/batch/">
  1390          AWS Batch
  1391          
  1392          </a>
  1393      </li>
  1394       
  1395    
  1396   
  1397  
  1398              
  1399            
  1400              
  1401              
  1402  
  1403  
  1404   
  1405    
  1406      
  1407        <li data-nav-id="/reference/step/services/fargate/" title="AWS Fargate" class="dd-item ">
  1408          <a href="/reference/step/services/fargate/">
  1409          AWS Fargate
  1410          
  1411          </a>
  1412      </li>
  1413       
  1414    
  1415   
  1416  
  1417              
  1418            
  1419              
  1420              
  1421  
  1422  
  1423   
  1424    
  1425      
  1426        <li data-nav-id="/reference/step/services/glue/" title="AWS Glue" class="dd-item ">
  1427          <a href="/reference/step/services/glue/">
  1428          AWS Glue
  1429          
  1430          </a>
  1431      </li>
  1432       
  1433    
  1434   
  1435  
  1436              
  1437            
  1438          
  1439          </ul>
  1440                
  1441      </li>
  1442    
  1443   
  1444  
  1445              
  1446            
  1447          
  1448          </ul>
  1449                
  1450      </li>
  1451    
  1452   
  1453  
  1454              
  1455            
  1456              
  1457              
  1458  
  1459  
  1460   
  1461    
  1462      
  1463        <li data-nav-id="/reference/discovery/" title="Discovery Service" class="dd-item ">
  1464          <a href="/reference/discovery/">
  1465          Discovery Service
  1466          
  1467          </a>
  1468      </li>
  1469       
  1470    
  1471   
  1472  
  1473              
  1474            
  1475              
  1476              
  1477  
  1478  
  1479   
  1480    
  1481      
  1482        <li data-nav-id="/reference/docker/" title="Docker" class="dd-item ">
  1483          <a href="/reference/docker/">
  1484          Docker
  1485          
  1486          </a>
  1487      </li>
  1488       
  1489    
  1490   
  1491  
  1492              
  1493            
  1494              
  1495              
  1496  
  1497  
  1498   
  1499    
  1500      
  1501        <li data-nav-id="/reference/hybrid_topologies/" title="Hybrid Topologies" class="dd-item active">
  1502          <a href="/reference/hybrid_topologies/">
  1503          Hybrid Topologies
  1504          
  1505          </a>
  1506      </li>
  1507       
  1508    
  1509   
  1510  
  1511              
  1512            
  1513              
  1514              
  1515  
  1516  
  1517   
  1518    
  1519      
  1520      <li data-nav-id="/reference/operations/" title="" class="dd-item 
  1521          
  1522          
  1523          
  1524          ">
  1525        <a href="/reference/operations/">
  1526            <b>Operations</b>
  1527            
  1528        </a>
  1529        
  1530        
  1531          <ul>
  1532            
  1533            
  1534            
  1535            
  1536          
  1537            
  1538              
  1539              
  1540  
  1541  
  1542   
  1543    
  1544      
  1545        <li data-nav-id="/reference/operations/magefile/" title="Magefiles" class="dd-item ">
  1546          <a href="/reference/operations/magefile/">
  1547          Magefiles
  1548          
  1549          </a>
  1550      </li>
  1551       
  1552    
  1553   
  1554  
  1555              
  1556            
  1557              
  1558              
  1559  
  1560  
  1561   
  1562    
  1563      
  1564        <li data-nav-id="/reference/operations/cloudwatch_alarms/" title="CloudWatch Alarms" class="dd-item ">
  1565          <a href="/reference/operations/cloudwatch_alarms/">
  1566          CloudWatch Alarms
  1567          
  1568          </a>
  1569      </li>
  1570       
  1571    
  1572   
  1573  
  1574              
  1575            
  1576              
  1577              
  1578  
  1579  
  1580   
  1581    
  1582      
  1583        <li data-nav-id="/reference/operations/cloudwatch_dashboard/" title="CloudWatch Dashboard" class="dd-item ">
  1584          <a href="/reference/operations/cloudwatch_dashboard/">
  1585          CloudWatch Dashboard
  1586          
  1587          </a>
  1588      </li>
  1589       
  1590    
  1591   
  1592  
  1593              
  1594            
  1595              
  1596              
  1597  
  1598  
  1599   
  1600    
  1601      
  1602        <li data-nav-id="/reference/operations/codedeploy_service_update/" title="CodeDeploy Service Update" class="dd-item ">
  1603          <a href="/reference/operations/codedeploy_service_update/">
  1604          CodeDeploy Service Update
  1605          
  1606          </a>
  1607      </li>
  1608       
  1609    
  1610   
  1611  
  1612              
  1613            
  1614              
  1615              
  1616  
  1617  
  1618   
  1619    
  1620      
  1621        <li data-nav-id="/reference/operations/cicd/" title="CI/CD" class="dd-item ">
  1622          <a href="/reference/operations/cicd/">
  1623          CI/CD
  1624          
  1625          </a>
  1626      </li>
  1627       
  1628    
  1629   
  1630  
  1631              
  1632            
  1633              
  1634              
  1635  
  1636  
  1637   
  1638    
  1639      
  1640        <li data-nav-id="/reference/operations/deployment_strategies/" title="Deployment Strategies" class="dd-item ">
  1641          <a href="/reference/operations/deployment_strategies/">
  1642          Deployment Strategies
  1643          
  1644          </a>
  1645      </li>
  1646       
  1647    
  1648   
  1649  
  1650              
  1651            
  1652              
  1653              
  1654  
  1655  
  1656   
  1657    
  1658      
  1659        <li data-nav-id="/reference/operations/metrics_publisher/" title="Metrics Publisher" class="dd-item ">
  1660          <a href="/reference/operations/metrics_publisher/">
  1661          Metrics Publisher
  1662          
  1663          </a>
  1664      </li>
  1665       
  1666    
  1667   
  1668  
  1669              
  1670            
  1671              
  1672              
  1673  
  1674  
  1675   
  1676    
  1677      
  1678        <li data-nav-id="/reference/operations/profiling/" title="Profiling" class="dd-item ">
  1679          <a href="/reference/operations/profiling/">
  1680          Profiling
  1681          
  1682          </a>
  1683      </li>
  1684       
  1685    
  1686   
  1687  
  1688              
  1689            
  1690          
  1691          </ul>
  1692                
  1693      </li>
  1694    
  1695   
  1696  
  1697              
  1698            
  1699              
  1700              
  1701  
  1702  
  1703   
  1704    
  1705      
  1706        <li data-nav-id="/reference/testing/" title="Testing" class="dd-item ">
  1707          <a href="/reference/testing/">
  1708          Testing
  1709          
  1710          </a>
  1711      </li>
  1712       
  1713    
  1714   
  1715  
  1716              
  1717            
  1718              
  1719              
  1720  
  1721  
  1722   
  1723    
  1724      
  1725        <li data-nav-id="/reference/supporting_packages/" title="Supporting Packages" class="dd-item ">
  1726          <a href="/reference/supporting_packages/">
  1727          Supporting Packages
  1728          
  1729          </a>
  1730      </li>
  1731       
  1732    
  1733   
  1734  
  1735              
  1736            
  1737              
  1738              
  1739  
  1740  
  1741   
  1742    
  1743      
  1744        <li data-nav-id="/reference/limitations/" title="Limitations" class="dd-item ">
  1745          <a href="/reference/limitations/">
  1746          Limitations
  1747          
  1748          </a>
  1749      </li>
  1750       
  1751    
  1752   
  1753  
  1754              
  1755            
  1756              
  1757              
  1758  
  1759  
  1760   
  1761    
  1762      
  1763        <li data-nav-id="/reference/faq/" title="FAQ" class="dd-item ">
  1764          <a href="/reference/faq/">
  1765          FAQ
  1766          
  1767          </a>
  1768      </li>
  1769       
  1770    
  1771   
  1772  
  1773              
  1774            
  1775          
  1776          </ul>
  1777                
  1778      </li>
  1779    
  1780   
  1781  
  1782            
  1783            
  1784  
  1785  
  1786   
  1787    
  1788      
  1789      <li data-nav-id="/presentations/" title="Presentations" class="dd-item 
  1790          
  1791          
  1792          
  1793          ">
  1794        <a href="/presentations/">
  1795            Presentations
  1796            
  1797        </a>
  1798        
  1799                
  1800      </li>
  1801    
  1802   
  1803  
  1804            
  1805            
  1806  
  1807  
  1808   
  1809    
  1810      
  1811      <li data-nav-id="/meta/" title="Meta" class="dd-item 
  1812          
  1813          
  1814          
  1815          ">
  1816        <a href="/meta/">
  1817            Meta
  1818            
  1819        </a>
  1820        
  1821                
  1822      </li>
  1823    
  1824   
  1825  
  1826            
  1827            
  1828  
  1829  
  1830   
  1831    
  1832      
  1833      <li data-nav-id="/credits/" title="Credits" class="dd-item 
  1834          
  1835          
  1836          
  1837          ">
  1838        <a href="/credits/">
  1839            Credits
  1840            
  1841        </a>
  1842        
  1843                
  1844      </li>
  1845    
  1846   
  1847  
  1848            
  1849           
  1850      </ul>
  1851  
  1852      
  1853      
  1854        <section id="shortcuts">
  1855          <h3>More</h3>
  1856          <ul>
  1857            
  1858                <li> 
  1859                    <a class="padding" href="https://github.com/mweagle/Sparta"><i class='fab fa-fw fa-github'></i> Github repo</a>
  1860                </li>
  1861            
  1862                <li> 
  1863                    <a class="padding" href="https://github.com/mweagle?utf8=%E2%9C%93&amp;tab=repositories&amp;q=Sparta&amp;type=&amp;language="><i class='fas fa-fw fa-camera'></i> Showcases</a>
  1864                </li>
  1865            
  1866                <li> 
  1867                    <a class="padding" href="https://github.com/mweagle/Sparta/blob/master/CHANGES.md"><i class='fas fa-fw fa-signal'></i> Release History</a>
  1868                </li>
  1869            
  1870          </ul>
  1871        </section>
  1872      
  1873  
  1874      
  1875      <section id="footer">
  1876        
  1877    Build: <a target="_blank" href="https://github.com/mweagle/Sparta/commit/46463572">46463572</a><p/>
  1878    Date: 2020-05-02T17:11:51-07:00
  1879  
  1880  
  1881  <p>Built with <a href="https://github.com/matcornic/hugo-theme-learn"><i class="fas fa-heart"></i></a> from <a href="http://getgrav.org">Grav</a> and <a href="http://gohugo.io/">Hugo</a></p>
  1882  
  1883      </section>
  1884    </div>
  1885  </nav>
  1886  
  1887  
  1888  
  1889  
  1890  
  1891          <section id="body">
  1892          <div id="overlay"></div>
  1893          <div class="padding highlightable">
  1894                
  1895                <div>
  1896                  <div id="top-bar">
  1897                  
  1898                    
  1899                    
  1900                    
  1901                    <div id="top-github-link">
  1902                      <a class="github-link" title='Edit this page' href="https://github.com/mweagle/Sparta/tree/docs/content/reference/hybrid_topologies.md" target="blank">
  1903                        <i class="fas fa-code-branch"></i>
  1904                        <span id="top-github-link-text">Edit this page</span>
  1905                      </a>
  1906                    </div>
  1907                    
  1908                  
  1909                  
  1910                  <div id="breadcrumbs" itemscope="" itemtype="http://data-vocabulary.org/Breadcrumb">
  1911                      <span id="sidebar-toggle-span">
  1912                          <a href="#" id="sidebar-toggle" data-sidebar-toggle="">
  1913                            <i class="fas fa-bars"></i>
  1914                          </a>
  1915                      </span>
  1916                    
  1917                    <span id="toc-menu"><i class="fas fa-list-alt"></i></span>
  1918                    
  1919                    <span class="links">
  1920                   
  1921                   
  1922                      
  1923            
  1924            
  1925              
  1926              
  1927            
  1928            
  1929              
  1930              
  1931            
  1932            
  1933              <a href='/'></a> > <a href='/reference/'>Reference</a> > Hybrid Topologies
  1934            
  1935           
  1936            
  1937           
  1938            
  1939          
  1940                   
  1941                    </span>
  1942                  </div>
  1943                  
  1944                      <div class="progress">
  1945      <div class="wrapper">
  1946  <nav id="TableOfContents">
  1947    <ul>
  1948      <li><a href="#add-custom-command-line-option">Add Custom Command Line Option</a></li>
  1949      <li><a href="#create-cloudinit-userdata">Create CloudInit Userdata</a>
  1950        <ul>
  1951          <li><a href="#notes">Notes</a></li>
  1952        </ul>
  1953      </li>
  1954      <li><a href="#decorate-toplogy">Decorate Toplogy</a></li>
  1955    </ul>
  1956  
  1957    <ul>
  1958      <li><a href="#http-access">HTTP Access</a></li>
  1959      <li><a href="#lambda-access">Lambda Access</a></li>
  1960    </ul>
  1961  </nav>
  1962      </div>
  1963  </div>
  1964  
  1965                  
  1966                </div>
  1967              </div>
  1968              
  1969          <div id="head-tags">
  1970          
  1971          </div>
  1972          
  1973          <div id="body-inner">
  1974            
  1975              <h1>
  1976                
  1977                Hybrid Topologies
  1978              </h1>
  1979            
  1980  
  1981          
  1982  
  1983  
  1984  
  1985  <p>At a broad level, AWS Lambda represents a new level of compute abstraction for services. Developers don&rsquo;t immediately concern themselves with HA topologies, configuration management, capacity planning, or many of the other areas traditionally handled by operations. These are handled by the vendor supplied execution environment.</p>
  1986  <p>However, Lambda is a relatively new technology and is not ideally suited to certain types of tasks.  For example, given the current <a href="http://docs.aws.amazon.com/lambda/latest/dg/limits.html">Lambda limits</a>, the following task types might better be handled by &ldquo;legacy&rdquo; AWS services:</p>
  1987  <ul>
  1988  <li>Long running tasks</li>
  1989  <li>Tasks with significant disk space requirements</li>
  1990  <li>Large HTTP(S) I/O tasks</li>
  1991  </ul>
  1992  <p>It may also make sense to integrate EC2 when:</p>
  1993  <ul>
  1994  <li>Applications are being gradually decomposed into Lambda functions</li>
  1995  <li>Latency-sensitive request paths can&rsquo;t afford <a href="https://aws.amazon.com/blogs/compute/container-reuse-in-lambda/">cold container</a> startup times</li>
  1996  <li>Price/performance justifies using EC2</li>
  1997  <li>Using EC2 as a failover for system-wide Lambda outages</li>
  1998  </ul>
  1999  <p>For such cases, Sparta supports running the exact same binary on EC2.  This section describes how to create a single Sparta service that publishes a function via AWS Lambda <em>and</em> EC2 as part of the same application codebase. It&rsquo;s based on the <a href="https://github.com/mweagle/SpartaOmega">SpartaOmega</a> project.</p>
  2000  <h1 id="mixed-topology">Mixed Topology</h1>
  2001  <p>Deploying your application to a mixed topology is accomplished by combining existing Sparta features. There is no &ldquo;make mixed&rdquo; command line option.</p>
  2002  <h2 id="add-custom-command-line-option">Add Custom Command Line Option</h2>
  2003  <p>The first step is to add a <a href="/reference/application/custom_commands">custom command line option</a>. This command option will be used when your binary is running in &ldquo;mixed topology&rdquo; mode.  The SpartaOmega project starts up a localhost HTTP server, so we&rsquo;ll add a <code>httpServer</code> command line option with:</p>
  2004  <div class="highlight"><pre style="background-color:#fff;-moz-tab-size:2;-o-tab-size:2;tab-size:2"><code class="language-go" data-lang="go"><span style="color:#008000">// Custom command to startup a simple HelloWorld HTTP server
  2005  </span><span style="color:#008000"></span>httpServerCommand := &amp;cobra.Command{
  2006    Use:   <span style="color:#a31515">&#34;httpServer&#34;</span>,
  2007    Short: <span style="color:#a31515">&#34;Sample HelloWorld HTTP server&#34;</span>,
  2008    Long:  <span style="color:#a31515">`Sample HelloWorld HTTP server that binds to port: `</span> + HTTPServerPort,
  2009    RunE: <span style="color:#00f">func</span>(cmd *cobra.Command, args []<span style="color:#2b91af">string</span>) <span style="color:#2b91af">error</span> {
  2010      http.HandleFunc(<span style="color:#a31515">&#34;/&#34;</span>, helloWorldResource)
  2011      <span style="color:#00f">return</span> http.ListenAndServe(fmt.Sprintf(<span style="color:#a31515">&#34;:%d&#34;</span>, HTTPServerPort), <span style="color:#00f">nil</span>)
  2012    },
  2013  }
  2014  sparta.CommandLineOptions.Root.AddCommand(httpServerCommand)
  2015  </code></pre></div><p>Our command doesn&rsquo;t accept any additional flags. If your command needs additional user flags, consider adding a <a href="https://godoc.org/github.com/mweagle/Sparta#ParseOptions">ParseOptions</a> call to validate they are properly set.</p>
  2016  <h2 id="create-cloudinit-userdata">Create CloudInit Userdata</h2>
  2017  <p>The next step is to write a <a href="http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html">user-data</a> script that will be used to configure your EC2 instance(s) at startup. Your script is likely to differ from the one below, but at a minimum it will include code to download and unzip the archive containing your Sparta binary.</p>
  2018  <div class="highlight"><pre style="background-color:#fff;-moz-tab-size:2;-o-tab-size:2;tab-size:2"><code class="language-bash" data-lang="bash"><span style="color:#00f">#!/bin/bash -xe
  2019  </span><span style="color:#00f"></span><span style="color:#008000">#!/bin/bash -xe</span>
  2020  SPARTA_OMEGA_BINARY_PATH=/home/ubuntu/{{.SpartaBinaryName}}
  2021  
  2022  <span style="color:#008000">################################################################################</span>
  2023  #
  2024  <span style="color:#008000"># Tested on Ubuntu 16.04</span>
  2025  #
  2026  <span style="color:#008000"># AMI: ubuntu/images/hvm-ssd/ubuntu-xenial-16.04-amd64-server-20160516.1 (ami-06b94666)</span>
  2027  <span style="color:#00f">if</span> [ ! -f <span style="color:#a31515">&#34;/home/ubuntu/userdata.sh&#34;</span> ]
  2028  <span style="color:#00f">then</span>
  2029    curl -vs http://169.254.169.254/latest/user-data -o /home/ubuntu/userdata.sh
  2030    chmod +x /home/ubuntu/userdata.sh
  2031  <span style="color:#00f">fi</span>
  2032  
  2033  <span style="color:#008000"># Install everything</span>
  2034  service supervisor stop || true
  2035  apt-get update -y
  2036  apt-get upgrade -y
  2037  apt-get install supervisor awscli unzip git -y
  2038  
  2039  <span style="color:#008000">################################################################################</span>
  2040  <span style="color:#008000"># Our own binary</span>
  2041  aws s3 cp s3://{{ .S3Bucket }}/{{ .S3Key }} /home/ubuntu/application.zip
  2042  unzip -o /home/ubuntu/application.zip -d /home/ubuntu
  2043  chmod +x $SPARTA_OMEGA_BINARY_PATH
  2044  
  2045  <span style="color:#008000">################################################################################</span>
  2046  <span style="color:#008000"># SUPERVISOR</span>
  2047  <span style="color:#008000"># REF: http://supervisord.org/</span>
  2048  <span style="color:#008000"># Cleanout secondary directory</span>
  2049  mkdir -pv /etc/supervisor/conf.d
  2050  
  2051  SPARTA_OMEGA_SUPERVISOR_CONF=<span style="color:#a31515">&#34;[program:spartaomega]
  2052  </span><span style="color:#a31515">command=</span>$SPARTA_OMEGA_BINARY_PATH<span style="color:#a31515"> httpServer
  2053  </span><span style="color:#a31515">numprocs=1
  2054  </span><span style="color:#a31515">directory=/tmp
  2055  </span><span style="color:#a31515">priority=999
  2056  </span><span style="color:#a31515">autostart=true
  2057  </span><span style="color:#a31515">autorestart=unexpected
  2058  </span><span style="color:#a31515">startsecs=10
  2059  </span><span style="color:#a31515">startretries=3
  2060  </span><span style="color:#a31515">exitcodes=0,2
  2061  </span><span style="color:#a31515">stopsignal=TERM
  2062  </span><span style="color:#a31515">stopwaitsecs=10
  2063  </span><span style="color:#a31515">stopasgroup=false
  2064  </span><span style="color:#a31515">killasgroup=false
  2065  </span><span style="color:#a31515">user=ubuntu
  2066  </span><span style="color:#a31515">stdout_logfile=/var/log/spartaomega.log
  2067  </span><span style="color:#a31515">stdout_logfile_maxbytes=1MB
  2068  </span><span style="color:#a31515">stdout_logfile_backups=10
  2069  </span><span style="color:#a31515">stdout_capture_maxbytes=1MB
  2070  </span><span style="color:#a31515">stdout_events_enabled=false
  2071  </span><span style="color:#a31515">redirect_stderr=false
  2072  </span><span style="color:#a31515">stderr_logfile=spartaomega.err.log
  2073  </span><span style="color:#a31515">stderr_logfile_maxbytes=1MB
  2074  </span><span style="color:#a31515">stderr_logfile_backups=10
  2075  </span><span style="color:#a31515">stderr_capture_maxbytes=1MB
  2076  </span><span style="color:#a31515">stderr_events_enabled=false
  2077  </span><span style="color:#a31515">&#34;</span>
  2078  echo <span style="color:#a31515">&#34;</span>$SPARTA_OMEGA_SUPERVISOR_CONF<span style="color:#a31515">&#34;</span> &gt; /etc/supervisor/conf.d/spartaomega.conf
  2079  
  2080  <span style="color:#008000"># Patch up the directory</span>
  2081  chown -R ubuntu:ubuntu /home/ubuntu
  2082  
  2083  <span style="color:#008000"># Startup Supervisor</span>
  2084  service supervisor restart || service supervisor start
  2085  </code></pre></div><p>The script uses the command line option (<code>command=$SPARTA_OMEGA_BINARY_PATH httpServer</code>) that was defined in the first step.</p>
  2086  <p>It also uses the <code>S3Bucket</code> and <code>S3Key</code> properties that Sparta creates during the build and provides to your decorator function (next section).</p>
  2087  <h3 id="notes">Notes</h3>
  2088  <p>The script is using <a href="https://golang.org/pkg/text/template/">text/template</a> markup to expand properties known at build time.  Because this content will be parsed by <a href="https://godoc.org/github.com/mweagle/Sparta/aws/cloudformation#ConvertToTemplateExpression">ConvertToTemplateExpression</a> (next section), it&rsquo;s also possible to use <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-join.html">Fn::Join</a> compatible JSON serializations (single line only) to reference properties that are known only during CloudFormation provision time.</p>
  2089  <p>For example, if we were also provisioning a PostgreSQL instance and needed to dynamically discover the endpoint address, a shell script variable could be assigned via:</p>
  2090  <div class="highlight"><pre style="background-color:#fff;-moz-tab-size:2;-o-tab-size:2;tab-size:2"><code class="language-bash" data-lang="bash">POSTGRES_ADDRESS={ <span style="color:#a31515">&#34;Fn::GetAtt&#34;</span> : [ <span style="color:#a31515">&#34;{{ .DBInstanceResourceName }}&#34;</span> , <span style="color:#a31515">&#34;Endpoint.Address&#34;</span> ] }
  2091  </code></pre></div><p>This expression combines both a build-time variable (<code>DBInstanceResourceName</code>: the CloudFormation resource name) and a provision time one (<code>Endpoint.Address</code>: dynamically assigned by the CloudFormation <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html">RDS Resource</a>).</p>
  2092  <h2 id="decorate-toplogy">Decorate Toplogy</h2>
  2093  <p>The final step is to use a <a href="https://godoc.org/github.com/mweagle/Sparta#TemplateDecorator">TemplateDecorator</a> to tie everything together. A decorator can annotate the CloudFormation template with any supported <a href="https://github.com/crewjam/go-cloudformation">go-cloudformation</a> resource.  For this example, we&rsquo;ll create a single AutoScalingGroup and EC2 instance that&rsquo;s bootstrapped with our custom <em>userdata.sh</em> script.</p>
  2094  <div class="highlight"><pre style="background-color:#fff;-moz-tab-size:2;-o-tab-size:2;tab-size:2"><code class="language-go" data-lang="go">
  2095  <span style="color:#008000">// The CloudFormation template decorator that inserts all the other
  2096  </span><span style="color:#008000">// AWS components we need to support this deployment...
  2097  </span><span style="color:#008000"></span><span style="color:#00f">func</span> lambdaDecorator(customResourceAMILookupName <span style="color:#2b91af">string</span>) sparta.TemplateDecorator {
  2098  
  2099    <span style="color:#00f">return</span> <span style="color:#00f">func</span>(serviceName <span style="color:#2b91af">string</span>,
  2100  	lambdaResourceName <span style="color:#2b91af">string</span>,
  2101  	lambdaResource gocf.LambdaFunction,
  2102  	resourceMetadata <span style="color:#00f">map</span>[<span style="color:#2b91af">string</span>]<span style="color:#00f">interface</span>{},
  2103  	S3Bucket <span style="color:#2b91af">string</span>,
  2104  	S3Key <span style="color:#2b91af">string</span>,
  2105  	buildID <span style="color:#2b91af">string</span>,
  2106  	cfTemplate *gocf.Template,
  2107  	context <span style="color:#00f">map</span>[<span style="color:#2b91af">string</span>]<span style="color:#00f">interface</span>{},
  2108  	logger *logrus.Logger) <span style="color:#2b91af">error</span> {
  2109  
  2110      <span style="color:#008000">// Create the launch configuration with Metadata to download the ZIP file, unzip it &amp; launch the
  2111  </span><span style="color:#008000"></span>    <span style="color:#008000">// golang binary...
  2112  </span><span style="color:#008000"></span>    ec2SecurityGroupResourceName := sparta.CloudFormationResourceName(<span style="color:#a31515">&#34;SpartaOmegaSecurityGroup&#34;</span>,
  2113        <span style="color:#a31515">&#34;SpartaOmegaSecurityGroup&#34;</span>)
  2114      asgLaunchConfigurationName := sparta.CloudFormationResourceName(<span style="color:#a31515">&#34;SpartaOmegaASGLaunchConfig&#34;</span>,
  2115        <span style="color:#a31515">&#34;SpartaOmegaASGLaunchConfig&#34;</span>)
  2116      asgResourceName := sparta.CloudFormationResourceName(<span style="color:#a31515">&#34;SpartaOmegaASG&#34;</span>,
  2117        <span style="color:#a31515">&#34;SpartaOmegaASG&#34;</span>)
  2118      ec2InstanceRoleName := sparta.CloudFormationResourceName(<span style="color:#a31515">&#34;SpartaOmegaEC2InstanceRole&#34;</span>,
  2119        <span style="color:#a31515">&#34;SpartaOmegaEC2InstanceRole&#34;</span>)
  2120      ec2InstanceProfileName := sparta.CloudFormationResourceName(<span style="color:#a31515">&#34;SpartaOmegaEC2InstanceProfile&#34;</span>,
  2121        <span style="color:#a31515">&#34;SpartaOmegaEC2InstanceProfile&#34;</span>)
  2122  
  2123      <span style="color:#008000">//////////////////////////////////////////////////////////////////////////////
  2124  </span><span style="color:#008000"></span>    <span style="color:#008000">// 1 - Create the security group for the SpartaOmega EC2 instance
  2125  </span><span style="color:#008000"></span>    ec2SecurityGroup := &amp;gocf.EC2SecurityGroup{
  2126        GroupDescription: gocf.String(<span style="color:#a31515">&#34;SpartaOmega Security Group&#34;</span>),
  2127        SecurityGroupIngress: &amp;gocf.EC2SecurityGroupRuleList{
  2128          gocf.EC2SecurityGroupRule{
  2129            CidrIp:     gocf.String(<span style="color:#a31515">&#34;0.0.0.0/0&#34;</span>),
  2130            IpProtocol: gocf.String(<span style="color:#a31515">&#34;tcp&#34;</span>),
  2131            FromPort:   gocf.Integer(HTTPServerPort),
  2132            ToPort:     gocf.Integer(HTTPServerPort),
  2133          },
  2134          gocf.EC2SecurityGroupRule{
  2135            CidrIp:     gocf.String(<span style="color:#a31515">&#34;0.0.0.0/0&#34;</span>),
  2136            IpProtocol: gocf.String(<span style="color:#a31515">&#34;tcp&#34;</span>),
  2137            FromPort:   gocf.Integer(22),
  2138            ToPort:     gocf.Integer(22),
  2139          },
  2140        },
  2141      }
  2142      template.AddResource(ec2SecurityGroupResourceName, ec2SecurityGroup)
  2143      <span style="color:#008000">//////////////////////////////////////////////////////////////////////////////
  2144  </span><span style="color:#008000"></span>    <span style="color:#008000">// 2 - Create the ASG and associate the userdata with the EC2 init
  2145  </span><span style="color:#008000"></span>    <span style="color:#008000">// EC2 Instance Role...
  2146  </span><span style="color:#008000"></span>    statements := sparta.CommonIAMStatements.Core
  2147  
  2148      <span style="color:#008000">// Add the statement that allows us to fetch the S3 object with this compiled
  2149  </span><span style="color:#008000"></span>    <span style="color:#008000">// binary
  2150  </span><span style="color:#008000"></span>    statements = append(statements, spartaIAM.PolicyStatement{
  2151        Effect:   <span style="color:#a31515">&#34;Allow&#34;</span>,
  2152        Action:   []<span style="color:#2b91af">string</span>{<span style="color:#a31515">&#34;s3:GetObject&#34;</span>},
  2153        Resource: gocf.String(fmt.Sprintf(<span style="color:#a31515">&#34;arn:aws:s3:::%s/%s&#34;</span>, S3Bucket, S3Key)),
  2154      })
  2155      iamPolicyList := gocf.IAMPoliciesList{}
  2156      iamPolicyList = append(iamPolicyList,
  2157        gocf.IAMPolicies{
  2158          PolicyDocument: sparta.ArbitraryJSONObject{
  2159            <span style="color:#a31515">&#34;Version&#34;</span>:   <span style="color:#a31515">&#34;2012-10-17&#34;</span>,
  2160            <span style="color:#a31515">&#34;Statement&#34;</span>: statements,
  2161          },
  2162          PolicyName: gocf.String(<span style="color:#a31515">&#34;EC2Policy&#34;</span>),
  2163        },
  2164      )
  2165      ec2InstanceRole := &amp;gocf.IAMRole{
  2166        AssumeRolePolicyDocument: sparta.AssumePolicyDocument,
  2167        Policies:                 &amp;iamPolicyList,
  2168      }
  2169      template.AddResource(ec2InstanceRoleName, ec2InstanceRole)
  2170  
  2171      <span style="color:#008000">// Create the instance profile
  2172  </span><span style="color:#008000"></span>    ec2InstanceProfile := &amp;gocf.IAMInstanceProfile{
  2173        Path:  gocf.String(<span style="color:#a31515">&#34;/&#34;</span>),
  2174        Roles: []gocf.Stringable{gocf.Ref(ec2InstanceRoleName).String()},
  2175      }
  2176      template.AddResource(ec2InstanceProfileName, ec2InstanceProfile)
  2177  
  2178      <span style="color:#008000">//Now setup the properties map, expand the userdata, and attach it...
  2179  </span><span style="color:#008000"></span>    userDataProps := <span style="color:#00f">map</span>[<span style="color:#2b91af">string</span>]<span style="color:#00f">interface</span>{}{
  2180        <span style="color:#a31515">&#34;S3Bucket&#34;</span>:    S3Bucket,
  2181        <span style="color:#a31515">&#34;S3Key&#34;</span>:       S3Key,
  2182        <span style="color:#a31515">&#34;ServiceName&#34;</span>: serviceName,
  2183      }
  2184  
  2185      userDataTemplateInput, userDataTemplateInputErr := resources.FSString(<span style="color:#00f">false</span>, <span style="color:#a31515">&#34;/resources/source/userdata.sh&#34;</span>)
  2186      <span style="color:#00f">if</span> <span style="color:#00f">nil</span> != userDataTemplateInputErr {
  2187        <span style="color:#00f">return</span> userDataTemplateInputErr
  2188      }
  2189      templateReader := strings.NewReader(userDataTemplateInput)
  2190      userDataExpression, userDataExpressionErr := spartaCF.ConvertToTemplateExpression(templateReader,
  2191                                                                                        userDataProps)
  2192      <span style="color:#00f">if</span> <span style="color:#00f">nil</span> != userDataExpressionErr {
  2193        <span style="color:#00f">return</span> userDataExpressionErr
  2194      }
  2195  
  2196      logger.WithFields(logrus.Fields{
  2197        <span style="color:#a31515">&#34;Parameters&#34;</span>: userDataProps,
  2198        <span style="color:#a31515">&#34;Expanded&#34;</span>:   userDataExpression,
  2199      }).Debug(<span style="color:#a31515">&#34;Expanded userdata&#34;</span>)
  2200  
  2201      asgLaunchConfigurationResource := &amp;gocf.AutoScalingLaunchConfiguration{
  2202        ImageId:            gocf.GetAtt(customResourceAMILookupName, <span style="color:#a31515">&#34;HVM&#34;</span>),
  2203        InstanceType:       gocf.String(<span style="color:#a31515">&#34;t2.micro&#34;</span>),
  2204        KeyName:            gocf.String(SSHKeyName),
  2205        IamInstanceProfile: gocf.Ref(ec2InstanceProfileName).String(),
  2206        UserData:           gocf.Base64(userDataExpression),
  2207        SecurityGroups:     gocf.StringList(gocf.GetAtt(ec2SecurityGroupResourceName, <span style="color:#a31515">&#34;GroupId&#34;</span>)),
  2208      }
  2209      launchConfigResource := template.AddResource(asgLaunchConfigurationName,
  2210        asgLaunchConfigurationResource)
  2211      launchConfigResource.DependsOn = append(launchConfigResource.DependsOn,
  2212        customResourceAMILookupName)
  2213  
  2214      <span style="color:#008000">// Create the ASG
  2215  </span><span style="color:#008000"></span>    asgResource := &amp;gocf.AutoScalingAutoScalingGroup{
  2216        <span style="color:#008000">// Empty Region is equivalent to all region AZs
  2217  </span><span style="color:#008000"></span>      <span style="color:#008000">// Ref: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getavailabilityzones.html
  2218  </span><span style="color:#008000"></span>      AvailabilityZones:       gocf.GetAZs(gocf.String(<span style="color:#a31515">&#34;&#34;</span>)),
  2219        LaunchConfigurationName: gocf.Ref(asgLaunchConfigurationName).String(),
  2220        MaxSize:                 gocf.String(<span style="color:#a31515">&#34;1&#34;</span>),
  2221        MinSize:                 gocf.String(<span style="color:#a31515">&#34;1&#34;</span>),
  2222      }
  2223      template.AddResource(asgResourceName, asgResource)
  2224      <span style="color:#00f">return</span> <span style="color:#00f">nil</span>
  2225    }
  2226  }
  2227  </code></pre></div><p>There are a few things to point out in this function:</p>
  2228  <ul>
  2229  <li><strong>Security Groups</strong> - The decorator adds an ingress rule so that the endpoint is publicly accessible:</li>
  2230  </ul>
  2231  <div class="highlight"><pre style="background-color:#fff;-moz-tab-size:2;-o-tab-size:2;tab-size:2"><code class="language-go" data-lang="go">    gocf.EC2SecurityGroupRule{
  2232            CidrIp:     gocf.String(<span style="color:#a31515">&#34;0.0.0.0/0&#34;</span>),
  2233            IpProtocol: gocf.String(<span style="color:#a31515">&#34;tcp&#34;</span>),
  2234            FromPort:   gocf.Integer(HTTPServerPort),
  2235            ToPort:     gocf.Integer(HTTPServerPort),
  2236          }
  2237  </code></pre></div><ul>
  2238  <li><strong>IAM Role</strong> - In order to download the S3 archive, the EC2 IAM Policy includes a custom privilege:</li>
  2239  </ul>
  2240  <div class="highlight"><pre style="background-color:#fff;-moz-tab-size:2;-o-tab-size:2;tab-size:2"><code class="language-go" data-lang="go">      statements = append(statements, spartaIAM.PolicyStatement{
  2241        Effect:   <span style="color:#a31515">&#34;Allow&#34;</span>,
  2242        Action:   []<span style="color:#2b91af">string</span>{<span style="color:#a31515">&#34;s3:GetObject&#34;</span>},
  2243        Resource: gocf.String(fmt.Sprintf(<span style="color:#a31515">&#34;arn:aws:s3:::%s/%s&#34;</span>, S3Bucket, S3Key)),
  2244      })
  2245  </code></pre></div><ul>
  2246  <li><strong>UserData Marshaling</strong> - Marshaling the <em>userdata.sh</em> script is handled by <code>ConvertToTemplateExpression</code>:</li>
  2247  </ul>
  2248  <div class="highlight"><pre style="background-color:#fff;-moz-tab-size:2;-o-tab-size:2;tab-size:2"><code class="language-go" data-lang="go">    <span style="color:#008000">// Now setup the properties map, expand the userdata, and attach it...
  2249  </span><span style="color:#008000"></span>    userDataProps := <span style="color:#00f">map</span>[<span style="color:#2b91af">string</span>]<span style="color:#00f">interface</span>{}{
  2250        <span style="color:#a31515">&#34;S3Bucket&#34;</span>:    S3Bucket,
  2251        <span style="color:#a31515">&#34;S3Key&#34;</span>:       S3Key,
  2252        <span style="color:#a31515">&#34;ServiceName&#34;</span>: serviceName,
  2253      }
  2254      <span style="color:#008000">// ...
  2255  </span><span style="color:#008000"></span>    templateReader := strings.NewReader(userDataTemplateInput)
  2256      userDataExpression, userDataExpressionErr := spartaCF.ConvertToTemplateExpression(templateReader,
  2257                                                                                        userDataProps)
  2258      <span style="color:#008000">// ...
  2259  </span><span style="color:#008000"></span>    asgLaunchConfigurationResource := &amp;gocf.AutoScalingLaunchConfiguration{
  2260        <span style="color:#008000">// ...
  2261  </span><span style="color:#008000"></span>      UserData:           gocf.Base64(userDataExpression),
  2262        <span style="color:#008000">// ...
  2263  </span><span style="color:#008000"></span>    }
  2264  </code></pre></div><ul>
  2265  <li><strong>Custom Command Line Flags</strong> - To externalize the SSH Key Name, the binary expects a <a href="/reference/application/custom_flags">custom flag</a> (not shown above):</li>
  2266  </ul>
  2267  <div class="highlight"><pre style="background-color:#fff;-moz-tab-size:2;-o-tab-size:2;tab-size:2"><code class="language-go" data-lang="go">  <span style="color:#008000">// And add the SSHKeyName option to the provision step
  2268  </span><span style="color:#008000"></span>  sparta.CommandLineOptions.Provision.Flags().StringVarP(&amp;SSHKeyName,
  2269      <span style="color:#a31515">&#34;key&#34;</span>,
  2270      <span style="color:#a31515">&#34;k&#34;</span>,
  2271      <span style="color:#a31515">&#34;&#34;</span>,
  2272      <span style="color:#a31515">&#34;SSH Key Name to use for EC2 instances&#34;</span>)
  2273  </code></pre></div><p>This value is used as an input to the AutoScalingLaunchConfiguration value:</p>
  2274  <div class="highlight"><pre style="background-color:#fff;-moz-tab-size:2;-o-tab-size:2;tab-size:2"><code class="language-go" data-lang="go">    asgLaunchConfigurationResource := &amp;gocf.AutoScalingLaunchConfiguration{
  2275        <span style="color:#008000">// ...
  2276  </span><span style="color:#008000"></span>      KeyName:            gocf.String(SSHKeyName),
  2277        <span style="color:#008000">// ...
  2278  </span><span style="color:#008000"></span>    }
  2279  </code></pre></div><h1 id="result">Result</h1>
  2280  <p>Deploying your Go application using a mixed topology enables your &ldquo;Lambda&rdquo; endpoint to be addressable via AWS Lambda and standard HTTP.</p>
  2281  <h2 id="http-access">HTTP Access</h2>
  2282  <div class="highlight"><pre style="background-color:#fff;-moz-tab-size:2;-o-tab-size:2;tab-size:2"><code class="language-bash" data-lang="bash">
  2283  $ curl -vs http://ec2-52-26-146-138.us-west-2.compute.amazonaws.com:9999/
  2284  *   Trying 52.26.146.138...
  2285  * Connected to ec2-52-26-146-138.us-west-2.compute.amazonaws.com (52.26.146.138) port 9999 (<span style="color:#008000">#0)</span>
  2286  &gt; GET / HTTP/1.1
  2287  &gt; Host: ec2-52-26-146-138.us-west-2.compute.amazonaws.com:9999
  2288  &gt; User-Agent: curl/7.43.0
  2289  &gt; Accept: */*
  2290  &gt;
  2291  &lt; HTTP/1.1 200 OK
  2292  &lt; Date: Fri, 10 Jun 2016 14:58:15 GMT
  2293  &lt; Content-Length: 29
  2294  &lt; Content-Type: text/plain; charset=utf-8
  2295  &lt;
  2296  * Connection <span style="color:#008000">#0 to host ec2-52-26-146-138.us-west-2.compute.amazonaws.com left intact</span>
  2297  Hello world from SpartaOmega!
  2298  </code></pre></div><h2 id="lambda-access">Lambda Access</h2>
  2299  <p><img src="/images/alternative_topology/lambda.jpg" alt="Lambda"></p>
  2300  <h1 id="conclusion">Conclusion</h1>
  2301  <p>Mixed topology deployment is a powerful feature that enables your application to choose the right set of resources.  It provides a way for services to non-destructively migrate to AWS Lambda or shift existing Lambda workloads to alternative compute resources.</p>
  2302  <h1 id="notes-1">Notes</h1>
  2303  <ul>
  2304  <li>The <a href="https://github.com/mweagle/SpartaOmega">SpartaOmega</a> sample application uses <a href="http://supervisord.org/">supervisord</a> for process monitoring.</li>
  2305  <li>The current <em>userdata.sh</em> script isn&rsquo;t sufficient to reconfigure in response to CloudFormation update events.  Production systems should also include <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-hup.html">cfn-hup</a> listeners.</li>
  2306  <li>Production deployments may consider <a href="https://aws.amazon.com/codedeploy/">CodeDeploy</a> to assist in HA binary rollover.</li>
  2307  <li>Forwarding <a href="http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/WhatIsCloudWatchLogs.html">CloudWatch Logs</a> is not handled by this sample.</li>
  2308  <li>Consider using HTTPS &amp; <a href="https://ivopetkov.com/b/let-s-encrypt-on-ec2/">Let&rsquo;s Encrypt</a> on your EC2 instances.</li>
  2309  </ul>
  2310  
  2311  
  2312  <footer class="footline">
  2313  	
  2314  </footer>
  2315  
  2316  
  2317  </div> 
  2318  
  2319  
  2320  </div>
  2321  
  2322  <div id="navigation">
  2323  
  2324  
  2325  
  2326  
  2327  
  2328  
  2329      
  2330          
  2331          
  2332      
  2333      
  2334  
  2335          
  2336          
  2337              
  2338          
  2339          
  2340  
  2341          
  2342              
  2343  
  2344  
  2345      
  2346          
  2347              
  2348              
  2349          
  2350      
  2351      
  2352  
  2353          
  2354          
  2355          
  2356  
  2357          
  2358  
  2359  
  2360          
  2361              
  2362  
  2363  
  2364      
  2365          
  2366      
  2367      
  2368  
  2369          
  2370          
  2371          
  2372  
  2373          
  2374              
  2375  
  2376  
  2377      
  2378          
  2379      
  2380      
  2381  
  2382          
  2383          
  2384          
  2385  
  2386          
  2387  
  2388  
  2389          
  2390              
  2391  
  2392  
  2393      
  2394          
  2395      
  2396      
  2397  
  2398          
  2399          
  2400          
  2401  
  2402          
  2403  
  2404  
  2405          
  2406  
  2407  
  2408          
  2409              
  2410  
  2411  
  2412      
  2413          
  2414      
  2415      
  2416  
  2417          
  2418          
  2419          
  2420  
  2421          
  2422  
  2423  
  2424          
  2425              
  2426  
  2427  
  2428      
  2429          
  2430          
  2431      
  2432      
  2433  
  2434          
  2435          
  2436              
  2437          
  2438          
  2439  
  2440          
  2441              
  2442  
  2443  
  2444      
  2445          
  2446              
  2447              
  2448          
  2449      
  2450      
  2451  
  2452          
  2453          
  2454          
  2455  
  2456          
  2457              
  2458  
  2459  
  2460      
  2461          
  2462      
  2463      
  2464  
  2465          
  2466          
  2467          
  2468  
  2469          
  2470  
  2471  
  2472          
  2473              
  2474  
  2475  
  2476      
  2477          
  2478      
  2479      
  2480  
  2481          
  2482          
  2483          
  2484  
  2485          
  2486  
  2487  
  2488          
  2489              
  2490  
  2491  
  2492      
  2493          
  2494      
  2495      
  2496  
  2497          
  2498          
  2499          
  2500  
  2501          
  2502  
  2503  
  2504          
  2505              
  2506  
  2507  
  2508      
  2509          
  2510      
  2511      
  2512  
  2513          
  2514          
  2515          
  2516  
  2517          
  2518  
  2519  
  2520          
  2521              
  2522  
  2523  
  2524      
  2525          
  2526      
  2527      
  2528  
  2529          
  2530          
  2531          
  2532  
  2533          
  2534  
  2535  
  2536          
  2537              
  2538  
  2539  
  2540      
  2541          
  2542      
  2543      
  2544  
  2545          
  2546          
  2547          
  2548  
  2549          
  2550  
  2551  
  2552          
  2553  
  2554  
  2555          
  2556              
  2557  
  2558  
  2559      
  2560          
  2561      
  2562      
  2563  
  2564          
  2565          
  2566          
  2567  
  2568          
  2569  
  2570  
  2571          
  2572              
  2573  
  2574  
  2575      
  2576          
  2577      
  2578      
  2579  
  2580          
  2581          
  2582          
  2583  
  2584          
  2585              
  2586  
  2587  
  2588      
  2589          
  2590      
  2591      
  2592  
  2593          
  2594          
  2595          
  2596  
  2597          
  2598  
  2599  
  2600          
  2601              
  2602  
  2603  
  2604      
  2605          
  2606      
  2607      
  2608  
  2609          
  2610          
  2611          
  2612  
  2613          
  2614  
  2615  
  2616          
  2617              
  2618  
  2619  
  2620      
  2621          
  2622      
  2623      
  2624  
  2625          
  2626          
  2627          
  2628  
  2629          
  2630  
  2631  
  2632          
  2633              
  2634  
  2635  
  2636      
  2637          
  2638      
  2639      
  2640  
  2641          
  2642          
  2643          
  2644  
  2645          
  2646  
  2647  
  2648          
  2649              
  2650  
  2651  
  2652      
  2653          
  2654      
  2655      
  2656  
  2657          
  2658          
  2659          
  2660  
  2661          
  2662  
  2663  
  2664          
  2665              
  2666  
  2667  
  2668      
  2669          
  2670      
  2671      
  2672  
  2673          
  2674          
  2675          
  2676  
  2677          
  2678  
  2679  
  2680          
  2681              
  2682  
  2683  
  2684      
  2685          
  2686      
  2687      
  2688  
  2689          
  2690          
  2691          
  2692  
  2693          
  2694  
  2695  
  2696          
  2697              
  2698  
  2699  
  2700      
  2701          
  2702      
  2703      
  2704  
  2705          
  2706          
  2707          
  2708  
  2709          
  2710  
  2711  
  2712          
  2713              
  2714  
  2715  
  2716      
  2717          
  2718      
  2719      
  2720  
  2721          
  2722          
  2723          
  2724  
  2725          
  2726  
  2727  
  2728          
  2729              
  2730  
  2731  
  2732      
  2733          
  2734      
  2735      
  2736  
  2737          
  2738          
  2739          
  2740  
  2741          
  2742  
  2743  
  2744          
  2745              
  2746  
  2747  
  2748      
  2749          
  2750      
  2751      
  2752  
  2753          
  2754          
  2755          
  2756  
  2757          
  2758  
  2759  
  2760          
  2761  
  2762  
  2763          
  2764              
  2765  
  2766  
  2767      
  2768          
  2769      
  2770      
  2771  
  2772          
  2773          
  2774          
  2775  
  2776          
  2777              
  2778  
  2779  
  2780      
  2781          
  2782      
  2783      
  2784  
  2785          
  2786          
  2787          
  2788  
  2789          
  2790  
  2791  
  2792          
  2793              
  2794  
  2795  
  2796      
  2797          
  2798      
  2799      
  2800  
  2801          
  2802          
  2803          
  2804  
  2805          
  2806  
  2807  
  2808          
  2809              
  2810  
  2811  
  2812      
  2813          
  2814      
  2815      
  2816  
  2817          
  2818          
  2819          
  2820  
  2821          
  2822  
  2823  
  2824          
  2825              
  2826  
  2827  
  2828      
  2829          
  2830      
  2831      
  2832  
  2833          
  2834          
  2835          
  2836  
  2837          
  2838  
  2839  
  2840          
  2841              
  2842  
  2843  
  2844      
  2845          
  2846      
  2847      
  2848  
  2849          
  2850          
  2851          
  2852  
  2853          
  2854  
  2855  
  2856          
  2857              
  2858  
  2859  
  2860      
  2861          
  2862      
  2863      
  2864  
  2865          
  2866          
  2867          
  2868  
  2869          
  2870  
  2871  
  2872          
  2873              
  2874  
  2875  
  2876      
  2877          
  2878      
  2879      
  2880  
  2881          
  2882          
  2883          
  2884  
  2885          
  2886  
  2887  
  2888          
  2889              
  2890  
  2891  
  2892      
  2893          
  2894      
  2895      
  2896  
  2897          
  2898          
  2899          
  2900  
  2901          
  2902  
  2903  
  2904          
  2905              
  2906  
  2907  
  2908      
  2909          
  2910      
  2911      
  2912  
  2913          
  2914          
  2915          
  2916  
  2917          
  2918  
  2919  
  2920          
  2921  
  2922  
  2923          
  2924              
  2925  
  2926  
  2927      
  2928          
  2929      
  2930      
  2931  
  2932          
  2933          
  2934          
  2935  
  2936          
  2937              
  2938  
  2939  
  2940      
  2941          
  2942      
  2943      
  2944  
  2945          
  2946          
  2947          
  2948  
  2949          
  2950  
  2951  
  2952          
  2953              
  2954  
  2955  
  2956      
  2957          
  2958      
  2959      
  2960  
  2961          
  2962          
  2963          
  2964  
  2965          
  2966  
  2967  
  2968          
  2969              
  2970  
  2971  
  2972      
  2973          
  2974      
  2975      
  2976  
  2977          
  2978          
  2979          
  2980  
  2981          
  2982  
  2983  
  2984          
  2985              
  2986  
  2987  
  2988      
  2989          
  2990      
  2991      
  2992  
  2993          
  2994          
  2995          
  2996  
  2997          
  2998  
  2999  
  3000          
  3001              
  3002  
  3003  
  3004      
  3005          
  3006      
  3007      
  3008  
  3009          
  3010          
  3011          
  3012  
  3013          
  3014  
  3015  
  3016          
  3017              
  3018  
  3019  
  3020      
  3021          
  3022      
  3023      
  3024  
  3025          
  3026          
  3027          
  3028  
  3029          
  3030  
  3031  
  3032          
  3033              
  3034  
  3035  
  3036      
  3037          
  3038      
  3039      
  3040  
  3041          
  3042          
  3043          
  3044  
  3045          
  3046  
  3047  
  3048          
  3049  
  3050  
  3051          
  3052              
  3053  
  3054  
  3055      
  3056          
  3057      
  3058      
  3059  
  3060          
  3061          
  3062          
  3063  
  3064          
  3065              
  3066  
  3067  
  3068      
  3069          
  3070      
  3071      
  3072  
  3073          
  3074          
  3075          
  3076  
  3077          
  3078  
  3079  
  3080          
  3081  
  3082  
  3083          
  3084              
  3085  
  3086  
  3087      
  3088          
  3089      
  3090      
  3091  
  3092          
  3093          
  3094          
  3095  
  3096          
  3097  
  3098  
  3099          
  3100              
  3101  
  3102  
  3103      
  3104          
  3105      
  3106      
  3107  
  3108          
  3109          
  3110          
  3111  
  3112          
  3113              
  3114  
  3115  
  3116      
  3117          
  3118      
  3119      
  3120  
  3121          
  3122          
  3123          
  3124  
  3125          
  3126  
  3127  
  3128          
  3129              
  3130  
  3131  
  3132      
  3133          
  3134      
  3135      
  3136  
  3137          
  3138          
  3139          
  3140  
  3141          
  3142  
  3143  
  3144          
  3145              
  3146  
  3147  
  3148      
  3149          
  3150      
  3151      
  3152  
  3153          
  3154          
  3155          
  3156  
  3157          
  3158  
  3159  
  3160          
  3161              
  3162  
  3163  
  3164      
  3165          
  3166      
  3167      
  3168  
  3169          
  3170          
  3171          
  3172  
  3173          
  3174  
  3175  
  3176          
  3177              
  3178  
  3179  
  3180      
  3181          
  3182      
  3183      
  3184  
  3185          
  3186          
  3187          
  3188  
  3189          
  3190  
  3191  
  3192          
  3193  
  3194  
  3195          
  3196              
  3197  
  3198  
  3199      
  3200          
  3201      
  3202      
  3203  
  3204          
  3205          
  3206              
  3207          
  3208          
  3209  
  3210          
  3211              
  3212  
  3213  
  3214      
  3215          
  3216      
  3217      
  3218  
  3219          
  3220          
  3221          
  3222  
  3223          
  3224  
  3225  
  3226          
  3227              
  3228  
  3229  
  3230      
  3231          
  3232      
  3233      
  3234  
  3235          
  3236          
  3237          
  3238  
  3239          
  3240  
  3241  
  3242          
  3243              
  3244  
  3245  
  3246      
  3247          
  3248      
  3249      
  3250  
  3251          
  3252          
  3253          
  3254  
  3255          
  3256              
  3257  
  3258  
  3259      
  3260          
  3261      
  3262      
  3263  
  3264          
  3265          
  3266          
  3267  
  3268          
  3269  
  3270  
  3271          
  3272              
  3273  
  3274  
  3275      
  3276          
  3277      
  3278      
  3279  
  3280          
  3281          
  3282          
  3283  
  3284          
  3285  
  3286  
  3287          
  3288              
  3289  
  3290  
  3291      
  3292          
  3293      
  3294      
  3295  
  3296          
  3297          
  3298          
  3299  
  3300          
  3301  
  3302  
  3303          
  3304              
  3305  
  3306  
  3307      
  3308          
  3309      
  3310      
  3311  
  3312          
  3313          
  3314          
  3315  
  3316          
  3317  
  3318  
  3319          
  3320              
  3321  
  3322  
  3323      
  3324          
  3325      
  3326      
  3327  
  3328          
  3329          
  3330          
  3331  
  3332          
  3333  
  3334  
  3335          
  3336              
  3337  
  3338  
  3339      
  3340          
  3341      
  3342      
  3343  
  3344          
  3345          
  3346          
  3347  
  3348          
  3349  
  3350  
  3351          
  3352              
  3353  
  3354  
  3355      
  3356          
  3357      
  3358      
  3359  
  3360          
  3361          
  3362          
  3363  
  3364          
  3365  
  3366  
  3367          
  3368  
  3369  
  3370          
  3371  
  3372  
  3373          
  3374              
  3375  
  3376  
  3377      
  3378          
  3379      
  3380      
  3381  
  3382          
  3383          
  3384          
  3385  
  3386          
  3387  
  3388  
  3389          
  3390              
  3391  
  3392  
  3393      
  3394          
  3395      
  3396      
  3397  
  3398          
  3399          
  3400          
  3401  
  3402          
  3403  
  3404  
  3405          
  3406              
  3407  
  3408  
  3409      
  3410          
  3411          
  3412      
  3413      
  3414  
  3415          
  3416          
  3417          
  3418  
  3419          
  3420  
  3421  
  3422          
  3423              
  3424  
  3425  
  3426      
  3427          
  3428              
  3429              
  3430          
  3431      
  3432      
  3433  
  3434          
  3435          
  3436          
  3437  
  3438          
  3439              
  3440  
  3441  
  3442      
  3443          
  3444      
  3445      
  3446  
  3447          
  3448          
  3449          
  3450  
  3451          
  3452  
  3453  
  3454          
  3455              
  3456  
  3457  
  3458      
  3459          
  3460      
  3461      
  3462  
  3463          
  3464          
  3465          
  3466  
  3467          
  3468  
  3469  
  3470          
  3471              
  3472  
  3473  
  3474      
  3475          
  3476      
  3477      
  3478  
  3479          
  3480          
  3481          
  3482  
  3483          
  3484  
  3485  
  3486          
  3487              
  3488  
  3489  
  3490      
  3491          
  3492      
  3493      
  3494  
  3495          
  3496          
  3497          
  3498  
  3499          
  3500  
  3501  
  3502          
  3503              
  3504  
  3505  
  3506      
  3507          
  3508      
  3509      
  3510  
  3511          
  3512          
  3513          
  3514  
  3515          
  3516  
  3517  
  3518          
  3519              
  3520  
  3521  
  3522      
  3523          
  3524      
  3525      
  3526  
  3527          
  3528          
  3529          
  3530  
  3531          
  3532  
  3533  
  3534          
  3535              
  3536  
  3537  
  3538      
  3539          
  3540      
  3541      
  3542  
  3543          
  3544          
  3545          
  3546  
  3547          
  3548  
  3549  
  3550          
  3551              
  3552  
  3553  
  3554      
  3555          
  3556      
  3557      
  3558  
  3559          
  3560          
  3561          
  3562  
  3563          
  3564  
  3565  
  3566          
  3567  
  3568  
  3569          
  3570              
  3571  
  3572  
  3573      
  3574          
  3575      
  3576      
  3577  
  3578          
  3579          
  3580          
  3581  
  3582          
  3583  
  3584  
  3585          
  3586              
  3587  
  3588  
  3589      
  3590          
  3591      
  3592      
  3593  
  3594          
  3595          
  3596          
  3597  
  3598          
  3599  
  3600  
  3601          
  3602              
  3603  
  3604  
  3605      
  3606          
  3607      
  3608      
  3609  
  3610          
  3611          
  3612          
  3613  
  3614          
  3615  
  3616  
  3617          
  3618              
  3619  
  3620  
  3621      
  3622          
  3623      
  3624      
  3625  
  3626          
  3627          
  3628          
  3629  
  3630          
  3631  
  3632  
  3633          
  3634  
  3635  
  3636          
  3637              
  3638  
  3639  
  3640      
  3641          
  3642      
  3643      
  3644  
  3645          
  3646          
  3647          
  3648  
  3649          
  3650  
  3651  
  3652          
  3653              
  3654  
  3655  
  3656      
  3657          
  3658      
  3659      
  3660  
  3661          
  3662          
  3663          
  3664  
  3665          
  3666  
  3667  
  3668          
  3669              
  3670  
  3671  
  3672      
  3673          
  3674      
  3675      
  3676  
  3677          
  3678          
  3679          
  3680  
  3681          
  3682  
  3683  
  3684          
  3685  
  3686  
  3687  
  3688  
  3689  
  3690  
  3691  
  3692  
  3693  
  3694  <a class="nav nav-prev" href="/reference/docker/" title="Docker"> <i class="fa fa-chevron-left"></i></a>
  3695  
  3696  
  3697  <a class="nav nav-next" href="/reference/operations/" title="" style="margin-right: 0px;"><i class="fa fa-chevron-right"></i></a>
  3698  
  3699  
  3700  </div>
  3701  
  3702  </section>
  3703  
  3704  <div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
  3705  <div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
  3706  </div>
  3707  <script src="/js/clipboard.min.js?1588464711"></script>
  3708  <script src="/js/perfect-scrollbar.min.js?1588464711"></script>
  3709  <script src="/js/perfect-scrollbar.jquery.min.js?1588464711"></script>
  3710  <script src="/js/jquery.sticky.js?1588464711"></script>
  3711  <script src="/js/featherlight.min.js?1588464711"></script>
  3712  <script src="/js/html5shiv-printshiv.min.js?1588464711"></script>
  3713  <script src="/js/modernizr.custom-3.6.0.js?1588464711"></script>
  3714  <script src="/js/learn.js?1588464711"></script>
  3715  <script src="/js/hugo-learn.js?1588464711"></script>
  3716  
  3717  <link href="/mermaid/mermaid.css?1588464711" rel="stylesheet" />
  3718  <script src="/mermaid/mermaid.js?1588464711"></script>
  3719  <script>
  3720  mermaid.initialize({ startOnLoad: true });
  3721  </script>
  3722  
  3723  <script async src="https://www.googletagmanager.com/gtag/js?id=UA-70794971-2"></script>
  3724  <script>
  3725    window.dataLayer = window.dataLayer || [];
  3726    function gtag(){dataLayer.push(arguments);}
  3727    gtag('js', new Date());
  3728  
  3729    gtag('config', 'UA-70794971-2');
  3730  </script>
  3731  </body>
  3732  </html>
  3733