Asgard: Using Grails to Deploy Netflix to AWS (Extended Slides)

  • 2,757 views
Uploaded on

Overview and technical exploration of Asgard, an open source, Grails-based, graphical web console created by Netflix for application deployment and cloud management in the Amazon cloud. Presented at …

Overview and technical exploration of Asgard, an open source, Grails-based, graphical web console created by Netflix for application deployment and cloud management in the Amazon cloud. Presented at the GR8 Conference in Minneapolis, MN, July 30, 2012.

PDF version: https://github.com/joesondow/GR8-US-2012/blob/master/Asgard-JoeSondow/Asgard-GR8Conf-US-2012-07.pdf

More in: Technology , Business
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
2,757
On Slideshare
0
From Embeds
0
Number of Embeds
3

Actions

Shares
Downloads
71
Comments
0
Likes
9

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n

Transcript

  • 1. // Feed your brain GR8Conf US 2012 gr8.technologies.each{ July 30-31 yourBrain << it Minneapolis, MN, US }The Grails App that Deploys Netflix to the CloudExtended Edition SlidesJoe Sondow, Netflix @joesondow #gr8conf
  • 2. Slides onlinehttp://slideshare.net/joesondow @joesondow #gr8conf
  • 3. Who am I? @joesondow #gr8conf
  • 4. Who am I?Still time to sneak out to another session @joesondow #gr8conf
  • 5. Who am I? @joesondow #gr8conf
  • 6. Who am I?Joe Sondow @joesondow #gr8conf
  • 7. Who am I?Joe SondowNetflix since 2010 @joesondow #gr8conf
  • 8. Who am I?Joe SondowNetflix since 2010Asgard lead @joesondow #gr8conf
  • 9. Who am I?Joe SondowNetflix since 2010Asgard leadGrails @joesondow #gr8conf
  • 10. Who am I?Joe SondowNetflix since 2010Asgard leadGrailsjQuery @joesondow #gr8conf
  • 11. Why am I here? @joesondow #gr8conf
  • 12. Why am I here?
  • 13. Why am I here?Sell you something
  • 14. Why am I here?Sell you somethingDiscuss business plans
  • 15. Why am I here?Sell you somethingDiscuss business plansAnswer technical questions
  • 16. Why am I here?Sell you somethingDiscuss business plansAnswer technical questionsBe a smaller fish in AWS
  • 17. Why am I here?Sell you somethingDiscuss business plansAnswer technical questionsBe a smaller fish in AWSGive back to community
  • 18. Why am I here?Sell you somethingDiscuss business plansAnswer technical questionsBe a smaller fish in AWSGive back to communitySteal your engineers
  • 19. Asgard
  • 20. Asgard
  • 21. AsgardScreen shots
  • 22. AsgardApplication list
  • 23. AsgardAuto Scaling Group list
  • 24. AsgardCluster deployment, ready for fast rollback
  • 25. Asgard
  • 26. AsgardApplication deployment
  • 27. AsgardApplication deploymentCloud management
  • 28. AsgardApplication deploymentCloud managementStarted 2010
  • 29. AsgardApplication deploymentCloud managementStarted 2010Open source June 2012
  • 30. AsgardApplication deploymentCloud managementStarted 2010Open source June 2012http://netflix.github.com
  • 31. AsgardApplication deploymentCloud managementStarted 2010Open source June 2012http://netflix.github.com100’s of Jira tickets
  • 32. AsgardApplication deploymentCloud managementStarted 2010Open source June 2012http://netflix.github.com100’s of Jira ticketsActively developed
  • 33. User forumhttps://groups.google.com/group/AsgardUsers
  • 34. Source code and downloadhttps://github.com/Netflix/asgard
  • 35. Joe Sondow Clay McCoy Jason Gritman @joesondow @claymccoy @jgritmanAsgard TeamJuly 2012
  • 36. With more than 25 million streaming members in theUnited States, Canada, Latin America, the UnitedKingdom and Ireland, Netflix, Inc. (NASDAQ: NFLX) isthe worlds leading internet subscription service forenjoying movies and TV programs.(from http://ir.netflix.com)
  • 37. Freedom and Responsibility
  • 38. Freedom and ResponsibilityCorporate culture and the Cloud
  • 39. Freedom and Responsibility
  • 40. Freedom and ResponsibilityCloud SOA
  • 41. Freedom and ResponsibilityCloud SOA100’s of services
  • 42. Freedom and ResponsibilityCloud SOA100’s of servicesSmall teams
  • 43. Freedom and ResponsibilityCloud SOA100’s of servicesSmall teamsIndependent releases
  • 44. Freedom and ResponsibilityCloud SOA100’s of servicesSmall teamsIndependent releasesControlled chaos
  • 45. Regional URLs
  • 46. Regional URLsLet’s see some code
  • 47. Regional URLsCloud object URLs were unique, conventional, intuitiveDefault Grails URL mapping is excellent
  • 48. Regional URLsLater, Netflix needed to use multiple Amazon regions
  • 49. Regional URLsRegion is another URL dimensionAdd URL mapping, but don’t break existing links
  • 50. Regional URLsRegionService.groovy
  • 51. Regional URLsRegionService.groovy
  • 52. Regional URLsRegionService.groovyGrails may soon provide a better hook
  • 53. Regional URLsSome controllers should never be regionalRegionService detects RegionAgnostic annotation
  • 54. Cloud deployment model
  • 55. Cloud deployment modelApplications and Clusters
  • 56. Cloud deployment model
  • 57. Cloud deployment model Auto Scaling Group
  • 58. Cloud deployment model Auto Scaling Group Launch Configuration
  • 59. Cloud deployment model Elastic Load Balancer Auto Scaling Group Launch Configuration
  • 60. Cloud deployment model Elastic Load Balancer Auto Scaling Group Launch Configuration Amazon Machine Image
  • 61. Cloud deployment model Elastic Load Balancer Auto Scaling Group Security Group Launch Configuration Amazon Machine Image
  • 62. Cloud deployment model Elastic Load Balancer Auto Scaling Group Security Instances Group Launch Configuration Amazon Machine Image
  • 63. Cloud deployment model Elastic Load Balancer Auto Scaling Group Security Instances Group Launch Configuration Amazon Machine Image
  • 64. Cloud deployment model Elastic Load Balancer Auto Scaling Group Security Instances Group Launch Configuration Amazon Machine Image
  • 65. Cloud deployment model Elastic Load Balancer Auto Scaling Group Security Instances Group Launch Configuration Amazon Machine Image
  • 66. Cloud deployment model
  • 67. Cloud deployment model Search
  • 68. Cloud deployment model API Search
  • 69. Cloud deployment model Ratings API Search
  • 70. Cloud deployment modelStreaming Starts Ratings API Search
  • 71. Cloud deployment model Streaming Starts RatingsAutocomplete API Search
  • 72. Cloud deployment model Sign Up Streaming Starts RatingsAutocomplete API Search
  • 73. Cloud deployment model Sign Up Streaming Starts Ratings Application Application ApplicationAutocomplete API Search Application Application Application
  • 74. Inventing the Application
  • 75. Inventing the Application Problem: Application is not an Amazon concept
  • 76. Inventing the Application Problem: Application is not an Amazon concept Solution: Create an Application domain in SimpleDB Enforce naming conventions on Amazon objects
  • 77. Fast Rollback
  • 78. Fast RollbackOptimism causes outages
  • 79. Fast RollbackOptimism causes outagesProduction traffic is unique
  • 80. Fast RollbackOptimism causes outagesProduction traffic is uniqueKeep old version running
  • 81. Fast RollbackOptimism causes outagesProduction traffic is uniqueKeep old version runningSwitch traffic to new version
  • 82. Fast RollbackOptimism causes outagesProduction traffic is uniqueKeep old version runningSwitch traffic to new versionMonitor results
  • 83. Fast RollbackOptimism causes outagesProduction traffic is uniqueKeep old version runningSwitch traffic to new versionMonitor resultsRevert traffic quickly
  • 84. Fast Rollback
  • 85. Fast Rollback api-frontend api-usprod-v007
  • 86. Fast Rollback api-frontend api-usprod-v007 api-usprod-v008
  • 87. Fast Rollback api-frontend api-usprod-v007 api-usprod-v008
  • 88. Fast Rollback api-frontend api-usprod-v007 api-usprod-v008
  • 89. Fast Rollback api-frontend api-usprod-v007 api-usprod-v008
  • 90. Fast Rollback api-frontend api-usprod-v007
  • 91. Inventing the Cluster
  • 92. Inventing the Cluster Problem: Two ASGs with one function but different names
  • 93. Inventing the Cluster Problem: Two ASGs with one function but different names Solution: Append version number in reserved format Parse ASG name to determine long-term “cluster”
  • 94. Inventing the ClusterInstead of keeping a database in sync, use namingconventions to store the source in truth in Amazon’s APIapi Applicationapi-usprod Clusterapi-usprod-v007 Auto Scaling Groupapi-usprod-v008 Auto Scaling Group
  • 95. Database Aversion
  • 96. Database AversionStoring metadata on cloud objects
  • 97. Database Aversion
  • 98. Database Aversion Naming conventions
  • 99. Database Aversion Naming conventions Tagging conventions
  • 100. Database Aversion Naming conventions Tagging conventions No GORM domain objects
  • 101. Database Aversion Naming conventions Tagging conventions No GORM domain objects AWS Java SDK
  • 102. Database Aversion Naming conventions Tagging conventions No GORM domain objects AWS Java SDK Less to go out of sync
  • 103. Database Aversion Naming conventions Tagging conventions No GORM domain objects AWS Java SDK Less to go out of sync Shared source of truth
  • 104. Open Source, Closed Config
  • 105. Open Source, Closed ConfigPull company-specific details out of Asgard
  • 106. Open Source, Closed Config
  • 107. Open Source, Closed Config
  • 108. Open Source, Closed Config Asgard for Netflix is configured to use company- specific extension points such as standard utility links for instances
  • 109. Open Source, Closed Config Out-of-the-box Asgard installation has no instance utility links
  • 110. Open Source, Closed Config Netflix specific $ASGARD_HOME/Config.groovylink {    // Avoid GStrings here because these Strings are stored dynamic templates for arbitrary server names.    String logUrlStart = http://${server}:7777    String configUrlStart = http://${server}:9999/AdminConfig    instanceLinkGroupingsToLinkTemplateLists = [            Logs: [                    new TextLinkTemplate(logUrlStart + /Admin/list?view=tomcat/catalina.out, catalina.out),                    new TextLinkTemplate(logUrlStart + /Admin/list, Log File Archive),                    new TextLinkTemplate(logUrlStart + /Admin/threaddumps, Thread Dumps),                    new TextLinkTemplate(logUrlStart + /AdminProxy, Admin Proxy Info),                    new TextLinkTemplate(logUrlStart + /AdminStatus, Admin Proxy Status),                    new TextLinkTemplate(logUrlStart + /GC/index, GC Visualization)            ],            Netflix Configuration: [                    new TextLinkTemplate(configUrlStart + /prop.html, NetflixConfiguration Properties Console),                    new TextLinkTemplate(configUrlStart + /libs.html, Libraries Console),                    new TextLinkTemplate(configUrlStart + /machineProps, Machine Readable Properties),                    new TextLinkTemplate(configUrlStart + /webapp/META-INF/MANIFEST.MF, Manifest),            ]    ]}
  • 111. Open Source, Closed Config grails-app/conf/Config.groovy references external configuration file ~/.asgard/Config.groovy https://github.com/Netflix/asgard/blob/master/grails-app/conf/Config.groovyasgardHome = System.getenv(ASGARD_HOME) ?: System.getProperty(ASGARD_HOME) ?:        "${System.getProperty(user.home)}/.asgard"// Locations to search for config files that get merged into the main config.// Config files can either be Java properties files or ConfigSlurper scripts.grails.config.locations = [        "file:${asgardHome}/Config.groovy",        classpath:sourceVersion.properties]
  • 112. Open Source, Closed Config External Config.groovy also hold the AWS account credentials, or references for finding them.grails {    awsAccounts=["178123456789"]    awsAccountNames=["178123456789":"prod"]}secret {    accessId="AKIAILAND0E3TMSJA8BA"    secretKey="Od0AMY/dEC3P0/wZQjpmRtm2MVZc9330epDk+pwm"}cloud {    accountName="prod"    publicResourceAccounts=["amazon"]}
  • 113. Caching the Cloud
  • 114. Caching the CloudResponsive, massive, multi-region metadata
  • 115. Caching the Cloud
  • 116. Caching the Cloud Large counts
  • 117. Caching the Cloud Large counts Many types
  • 118. Caching the Cloud Large counts Many types Complex relationships
  • 119. Caching the Cloud Large counts Many types Complex relationships Multiple regions
  • 120. Caching the Cloud Large counts Many types Complex relationships Multiple regions Consistent single objects
  • 121. Caching the Cloud Large counts Many types Complex relationships Multiple regions Consistent single objects Eventually consistent lists
  • 122. Caching the Cloudclass Caches {    final CachedMap<AppRegistration> allApplications    final CachedMap<ApplicationMetrics> allApplicationMetrics    final CachedMap<HardwareProfile> allHardwareProfiles    final MultiRegionCachedMap<MetricAlarm> allAlarms    final MultiRegionCachedMap<ApplicationInstance> allApplicationInstances    final MultiRegionCachedMap<AutoScalingGroup> allAutoScalingGroups    final MultiRegionCachedMap<AvailabilityZone> allAvailabilityZones    final MultiRegionCachedMap<Cluster> allClusters    final MultiRegionCachedMap<DBInstance> allDBInstances    final MultiRegionCachedMap<DBSecurityGroup> allDBSecurityGroups    final MultiRegionCachedMap<DBSnapshot> allDBSnapshots    final MultiRegionCachedMap<String> allDomains    final MultiRegionCachedMap<FastProperty> allFastProperties    final MultiRegionCachedMap<Image> allImages    final MultiRegionCachedMap<Instance> allInstances    final MultiRegionCachedMap<InstanceTypeData> allInstanceTypes    final MultiRegionCachedMap<KeyPairInfo> allKeyPairs    final MultiRegionCachedMap<LaunchConfiguration> allLaunchConfigurations    // etc.    // etc. // etc.}
  • 123. Caching the Cloudclass Caches {    final CachedMap<AppRegistration> allApplications    final CachedMap<ApplicationMetrics> allApplicationMetrics    final CachedMap<HardwareProfile> allHardwareProfiles    final MultiRegionCachedMap<MetricAlarm> allAlarms    final MultiRegionCachedMap<ApplicationInstance> allApplicationInstances    final MultiRegionCachedMap<AutoScalingGroup> allAutoScalingGroups    final MultiRegionCachedMap<AvailabilityZone> allAvailabilityZones    final MultiRegionCachedMap<Cluster> allClusters    final MultiRegionCachedMap<DBInstance> allDBInstances    final MultiRegionCachedMap<DBSecurityGroup> allDBSecurityGroups    final MultiRegionCachedMap<DBSnapshot> allDBSnapshots    final MultiRegionCachedMap<String> allDomains    final MultiRegionCachedMap<FastProperty> allFastProperties    final MultiRegionCachedMap<Image> allImages    final MultiRegionCachedMap<Instance> allInstances    final MultiRegionCachedMap<InstanceTypeData> allInstanceTypes    final MultiRegionCachedMap<KeyPairInfo> allKeyPairs    final MultiRegionCachedMap<LaunchConfiguration> allLaunchConfigurations    // etc.    // etc. // etc.}
  • 124. Caching the Cloudclass AwsRdsService implements CacheInitializer, InitializingBean {    MultiRegionAwsClient<AmazonRDS> awsClient    Caches caches    void initializeCaches() {        caches.allDBInstances.ensureSetUp({ Region region -> retrieveDBInstances(region) })    }    private List<DBInstance> retrieveDBInstances(Region region) {        awsClient.by(region).describeDBInstances(new DescribeDBInstancesRequest()).getDBInstances()    }    Collection<DBInstance> getDBInstances(UserContext userContext) {        caches.allDBInstances.by(userContext.region).list()    }}
  • 125. Caching the Cloudclass AwsRdsService implements CacheInitializer, InitializingBean {    MultiRegionAwsClient<AmazonRDS> awsClient    Caches caches    void initializeCaches() {        caches.allDBInstances.ensureSetUp({ Region region -> retrieveDBInstances(region) })    }    private List<DBInstance> retrieveDBInstances(Region region) {        awsClient.by(region).describeDBInstances(new DescribeDBInstancesRequest()).getDBInstances()    }    Collection<DBInstance> getDBInstances(UserContext userContext) {        caches.allDBInstances.by(userContext.region).list()    }}
  • 126. Caching the Cloudclass AwsRdsService implements CacheInitializer, InitializingBean {    MultiRegionAwsClient<AmazonRDS> awsClient    Caches caches    void initializeCaches() {        caches.allDBInstances.ensureSetUp({ Region region -> retrieveDBInstances(region) })    }    private List<DBInstance> retrieveDBInstances(Region region) {        awsClient.by(region).describeDBInstances(new DescribeDBInstancesRequest()).getDBInstances()    }    Collection<DBInstance> getDBInstances(UserContext userContext) {        caches.allDBInstances.by(userContext.region).list()    }}
  • 127. Caching the Cloudclass AwsRdsService implements CacheInitializer, InitializingBean {    MultiRegionAwsClient<AmazonRDS> awsClient    Caches caches    void initializeCaches() {        caches.allDBInstances.ensureSetUp({ Region region -> retrieveDBInstances(region) })    }    private List<DBInstance> retrieveDBInstances(Region region) {        awsClient.by(region).describeDBInstances(new DescribeDBInstancesRequest()).getDBInstances()    }    Collection<DBInstance> getDBInstances(UserContext userContext) {        caches.allDBInstances.by(userContext.region).list()    }}
  • 128. Caching the Cloud
  • 129. Visual Language for the Cloud
  • 130. Visual Language for the CloudTango open source icons
  • 131. Visual Language for the Cloud
  • 132. Visual Language for the Cloud AWS is intimidating
  • 133. Visual Language for the Cloud AWS is intimidating Many object types
  • 134. Visual Language for the Cloud AWS is intimidating Many object types Help newbie users
  • 135. Visual Language for the Cloud AWS is intimidating Many object types Help newbie users Reduce cognitive load
  • 136. Visual Language for the Cloud AWS is intimidating Many object types Help newbie users Reduce cognitive load Make it easy
  • 137. Visual Language for the Cloud AWS is intimidating Many object types Help newbie users Reduce cognitive load Make it easy Avoid surprises
  • 138. Visual Language for the Cloud
  • 139. Visual Language for the CloudAt a glance, these nav bar items look alike.
  • 140. Visual Language for the CloudAt a glance, these nav bar items look alike.
  • 141. Visual Language for the Cloud
  • 142. Visual Language for the CloudSome screens have multiple actionbuttons that look too similar.
  • 143. Visual Language for the CloudSome screens have multiple actionbuttons that look too similar.
  • 144. Visual Language for the Cloud
  • 145. Visual Language for the Cloud Because of naming conventions, these links look alike.
  • 146. Visual Language for the Cloud Because of naming conventions, these links look alike.
  • 147. Visual Language for the Cloud
  • 148. Visual Language for the Cloud The indicators for the current AWS region are too easy to miss.
  • 149. Visual Language for the Cloud The indicators for the current AWS region are too easy to miss.
  • 150. Visual Language for the CloudThese availability zonesare important torecognize at a glancebut their names looksimilar, and they appearon many screens.
  • 151. Visual Language for the CloudThese availability zonesare important torecognize at a glancebut their names looksimilar, and they appearon many screens.
  • 152. Visual Language for the Cloud
  • 153. Tango Icons
  • 154. Tango Iconshttp://tango.freedesktop.org/
  • 155. Tango Iconshttp://tango.freedesktop.org/http://tango.freedesktop.org/Tango_Icon_Theme_Guidelines
  • 156. Tango Iconshttp://tango.freedesktop.org/http://tango.freedesktop.org/Tango_Icon_Theme_Guidelineshttp://commons.wikimedia.org/wiki/Tango_icons
  • 157. Tango Iconshttp://tango.freedesktop.org/http://tango.freedesktop.org/Tango_Icon_Theme_Guidelineshttp://commons.wikimedia.org/wiki/Tango_iconsUsed by Firefox, Jenkins, GIMP, OpenOffice, VMWare
  • 158. REST API in Grails
  • 159. REST API in GrailsEnable external mashups with cloud data
  • 160. REST API in Grails
  • 161. REST API in Grails
  • 162. REST API in Grails
  • 163. REST API in Grails
  • 164. REST API in Grails
  • 165. REST API in Grails
  • 166. REST API in Grails
  • 167. REST API in Grails
  • 168. REST API in Grails
  • 169. REST API in GrailsApplicationController.groovy
  • 170. Offline Development
  • 171. Offline DevelopmentMakes on a plane
  • 172. Offline DevelopmentMock dataMock behaviorSystem property switch offline=true
  • 173. Mock Datahttp://asgardprod/us-east-1/autoScaling/list.json
  • 174. Mock DataParse JSON
  • 175. Mock BehaviorOverride Amazon Java client methods
  • 176. System Propertygrails run-app -Doffline=true
  • 177. Why not the AWS console?
  • 178. Why not the AWS console?No, not to keep me busy
  • 179. Why not the AWS console?
  • 180. Why not the AWS console?
  • 181. Why not the AWS console?Hide keys
  • 182. Why not the AWS console?Hide keysCustomize model
  • 183. Why not the AWS console?Hide keysCustomize modelEnforce conventions
  • 184. Why not the AWS console?Hide keysCustomize modelEnforce conventionsAutomate workflow
  • 185. Why not the AWS console?Hide keysCustomize modelEnforce conventionsAutomate workflowLog changes
  • 186. Why not the AWS console?Hide keysCustomize modelEnforce conventionsAutomate workflowLog changesIntegrate systems
  • 187. Why not the AWS console?Hide keysCustomize modelEnforce conventionsAutomate workflowLog changesIntegrate systemsCreate REST API
  • 188. @NetflixOSS
  • 189. @NetflixOSShttp://techblog.netflix.com
  • 190. @NetflixOSShttp://techblog.netflix.comhttp://netflix.github.com
  • 191. http://github.com/Netflix/asgardThank you
  • 192. http://github.com/Netflix/asgardThank youQuestions? github.com/joesondow @joesondow slideshare.net/joesondow linkedin.com/in/joesondow