Minami Aoyama Night #3 https://minami-aoyama-night.connpass.com/event/58102/
CloudFormationとOpsWorksによる継続的なインフラ更新について
© 2017 VASILY,Inc.CloudFormationͱOpsWorksʹΑΔܧଓతͳΠϯϑϥߋ৽ʹ͍ͭͯMinami Aoyama Night#3 2017/06/16 Fri. ޫୡ࿕
View Slide
© 2017 VASILY,Inc.ࣗݾհ▸ 5BUTVSP.JUTVOPޫୡ࿕▸ Ϡϑʔגࣜձࣾ▸ גࣜձࣾ7"4*-:▸ ΠϯϑϥΤϯδχΞ▸ 5XJUUFS(JU)VC2JJUB!LPUBUTV*DPOJMMVTUSBUFECZ:04)* IUUQTKBKQGBDFCPPLDPNZPTIJZPOFฐٕࣾज़ސ·ͭͱΏ͖ͻΖࢯ
© 2017 VASILY,Inc.ຊͷओ$MPVE'PSNBUJPO 0QT8PSLT
© 2017 VASILY,Inc.࣍▸ ࣗݾհ▸ ੜ࢈ੑ্ͷϞνϕʔγϣϯ▸ *20/ͱͦΕΛࢧ͑Δٕज़▸ ࣾ֎ͷల։▸ ՝▸ Πϯϑϥߏஙͷੜ࢈ੑ্▸ $MPVE'PSNBUJPO0QT8PSLT▸ ز͔ͭͷ
© 2017 VASILY,Inc.ੜ࢈ੑ্ͷϞνϕʔγϣϯ
© 2017 VASILY,Inc.Ҏ্ͷϑΝογϣϯ&$αΠτ͔ΒͷສΛ͑ΔΛܝࡌ݄ؒສਓҎ্͕ར༻͢Δຊ࠷େڃͷϑΝογϣϯαΠτ
© 2017 VASILY,Inc.Google PlayϕετΞϓϦJ04ΞϓϦɾ"QQ4UPSF#&45ɾ&TTFOUJBMೝఆ"OESPJEΞϓϦɾ(PPHMF1MBZϕετΞϓϦɾ(PPHMF1MBZϕετΞϓϦɾ(PPHMF1MBZϕετΞϓϦ ɹɹϕετΠϊϕʔςΟϒΞϓϦେɾ(PPHMF͔Βτοϓσϕϩούʔೝఆ࿈ଓϕετΞϓϦडੈքͰ7"4*-:͚ͩ
© 2017 VASILY,Inc.IQONΛࢧ͑Δٕज़▸ ߴͳΞϓϦ։ൃٕज़▸ ֦ுੑͷߴ͍Ϋϩʔϥʔٕज़▸ େͳϑΝογϣϯσʔλΛݩʹͨ͠ػցֶशɾը૾ղੳΫΤϦը૾ ݕग़ ݕࡧ
© 2017 VASILY,Inc.ଞࣾͱͷ࿈ܞࣄྫɿWowma!▸ ,%%*ίϚʔεϑΥϫʔυגࣜձࣾ▸ &$Ϟʔϧʮ8PXNBʯ ը૾ղੳٕज़Λఏڙ▸ εφοϓࣸਅ͔Βண༻ΞΠςϜͱ ͦͷྨࣅΞΠςϜΛਪન▸ ΞϓϦ։ൃͰڠྗ
© 2017 VASILY,Inc.՝ɿཧωοτϫʔΫͷ૿ՃαʔϏε" ʢӡ༻தʣαʔϏε#ʢӡ༻தʣαʔϏε$ʢӡ༻தʣ*DPOTNBEFCZ'SFFQJLGSPNXXXqBUJDPODPNJTMJDFOTFECZ$$#:αʔϏε%ʢ৽ن։ൃʣαʔϏε& ʢ৽ن։ൃʣɾɾɾॳظߏஙηΩϡϦςΟϧʔϧߋ৽ɺΦϓγϣϯมߋཧऀʢޫʣӡ༻ෛՙ
© 2017 VASILY,Inc.՝ɿཧωοτϫʔΫͷ૿ՃαʔϏε" ʢӡ༻தʣαʔϏε#ʢӡ༻தʣαʔϏε$ʢӡ༻தʣαʔϏε%ʢ৽ن։ൃʣαʔϏε& ʢ৽ن։ൃʣɾɾɾཧऀʢޫʣॳظߏங ܾ·ͬͨखॱ͕ଘࡏηΩϡϦςΟϧʔϧߋ৽ɺΦϓγϣϯมߋ มߋཧ༝ʁมߋཤྺʁܦݧͷੵɾڞ༗ʹ՝*DPOTNBEFCZ'SFFQJLGSPNXXXqBUJDPODPNJTMJDFOTFECZ$$#:
© 2017 VASILY,Inc.՝ɿཧωοτϫʔΫͷ૿ՃαʔϏεӡ༻ෛՙࢦ͖͢ੈքਏ͍ੈք
© 2017 VASILY,Inc.՝ɿཧωοτϫʔΫͷ૿ՃলྗԽɾޮԽɾจॻԽʹΑΔ ୯Ґ࣌ؒ͋ͨΓͷੜ࢈ੑ্͕ඞཁαʔϏε" ʢӡ༻தʣαʔϏε#ʢӡ༻தʣαʔϏε$ʢӡ༻தʣαʔϏε%ʢ৽ن։ൃʣαʔϏε& ʢ৽ن։ൃʣɾɾɾཧऀʢޫʣॳظߏங ςϯϓϨʔτԽηΩϡϦςΟϧʔϧߋ৽ɺΦϓγϣϯมߋ มߋҙਤɺཤྺͷه*DPOTNBEFCZ'SFFQJLGSPNXXXqBUJDPODPNJTMJDFOTFECZ$$#:
© 2017 VASILY,Inc.Πϯϑϥߏஙͷੜ࢈ੑ্
© 2017 VASILY,Inc.ࢦ࢟͢▸ ࡞ۀ͕هɾ࠶ݱՄೳͰ͋Δ͜ͱ▸ ઃఆͷมߋ͕ՄೳͰ͋Δ͜ͱ▸ ઃఆͷมߋΛө͢Δखॱཱ͕֬͞Ε͍ͯΔ͜ͱ
© 2017 VASILY,Inc.CloudFormationͱOpsWorksʹΑΔߏཧ &-#&$ 3%44$MPVE'SPOU*".FUD4VCOFUωοτϫʔΫߏཧΠϯελϯεߏཧ
© 2017 VASILY,Inc.CloudFormationͱOpsWorksʹΑΔߏཧ &-#&$ 3%44$MPVE'SPOU*".FUD4VCOFU
© 2017 VASILY,Inc.CloudFormation▸ "84ͷϦιʔεʢ71$ɺ4VCOFUɺ&-#ɺ&$ɺ3%4ɺʣΛʮςϯϓϨʔτʯͰཧ▸ ςϯϓϨʔτ+40/:".-Ͱهड़͞ΕΔςΩετ▸ ςϯϓϨʔτΛݩʹ࡞ΒΕΔϦιʔεͷ·ͱ·ΓΛʮελοΫʯͱݺͿ▸ ʮύϥϝʔλʯΛͬͯɺςϯϓϨʔτ͔ΒҟͳΔΛ࣋ͬͨελοΫΛ࡞Մೳ▸ ྫ͑ɺ71$4VCOFUͷ$JES#MPDLΛม͑Δɺ&$ΠϯελϯελΠϓΛม͑Δ▸ &$ͷ44)ݤొͳͲɺͰ͖ͳ͍͜ͱएׯ͋Δ
© 2017 VASILY,Inc.AWSTemplateFormatVersion: 2010-09-09Parameters:VPCCidrBlock:Type: 'String'Default: '10.0.0.0/16'PublicFirstCidrBlock:Type: 'String'Default: '10.0.0.0/24'Resources:# ------------------------------EC2VPC:Type: 'AWS::EC2::VPC'Properties:CidrBlock: !Ref VPCCidrBlockEnableDnsSupport: trueEnableDnsHostnames: trueInstanceTenancy: 'default'# ------------------------------EC2SubnetPublicFirst:Type: 'AWS::EC2::Subnet'Properties: VpcId: !Ref EC2VPCAvailabilityZone:Fn::Select:- 1- Fn::GetAZs: !Ref 'AWS::Region'CidrBlock: !Ref PublicFirstCidrBlockMapPublicIpOnLaunch: trueྫ71$ͱ4VCOFUΛ࡞͢ΔςϯϓϨʔτύϥϝʔλ71$ఆٛ4VCOFUఆٛ
© 2017 VASILY,Inc.AWSTemplateFormatVersion: 2010-09-09Parameters:VPCCidrBlock:Type: 'String'Default: '10.0.0.0/16'PublicFirstCidrBlock:Type: 'String'Default: '10.0.0.0/24'Resources:# ------------------------------EC2VPC:Type: 'AWS::EC2::VPC'Properties:CidrBlock: !Ref VPCCidrBlockEnableDnsSupport: trueEnableDnsHostnames: trueInstanceTenancy: 'default'# ------------------------------EC2SubnetPublicFirst:Type: 'AWS::EC2::Subnet'Properties: VpcId: !Ref EC2VPCAvailabilityZone:Fn::Select:- 1- Fn::GetAZs: !Ref 'AWS::Region'CidrBlock: !Ref PublicFirstCidrBlockMapPublicIpOnLaunch: trueྫ71$ͱ4VCOFUΛ࡞͢ΔςϯϓϨʔτύϥϝʔλࢀরϦιʔεࢀরΈࠐΈؔͰΑΓॊೈͳॲཧՄೳʮ͋ΔϦʔδϣϯͷͭͷ";Λऔಘʯ
© 2017 VASILY,Inc.CloudFormation▸ ৽نߏங࣌ͷʮS3όέοτ࡞ͬͯɺVPC࡞ͬͯɺDHCPΦϓγϣϯ࡞ͬͯɺNATήʔτΣΠ࡞ͬͯɺϧʔτςʔϒϧ࡞ͬͯɺαϒωοτ࡞ͬͯɺϧʔτ࡞ͬͯɺΠϯλʔωοτήʔτΣΠ࡞ͬͯɺࠪϩάΛ༗ޮʹͯ͠ɺ౿Έ࡞ͬͯɺΞϓϦέʔγϣϯαʔό࡞ͬͯɺηΩϡϦςΟάϧʔϓ࡞ͬͯɺ...ʯΛຕͷςΩετͰදݱ͢Δ▸ :".-͕ར༻Ͱ͖ΔΑ͏ʹͳͬͨͨΊɺઃܭҙਤΛίϝϯτͰ͢͜ͱՄೳ▸ ӡ༻தͷมߋςϯϓϨʔτ͕ৗʹϚελʔͱͯ͠ػೳ͢Δ
© 2017 VASILY,Inc.OpsWorks▸ 0QT8PSLTελοΫͱ0QT8PSLTGPS$IFG"VUPNBUFͷछྨ͕͋Δ▸ લऀ$IFGϕʔεͷΞϓϦέʔγϣϯཧαʔϏεʢฐࣾͰར༻͍ͯ͠Δͷͪ͜Βʣ▸ ޙऀϚωʔδυ$IFG"VUPNBUF▸ ʮελοΫʯͷதʹɺෳͷʮϨΠϠʔʯΛ࡞ʢ$MPVE'PSNBUJPOͷελοΫͱผʣ▸ ΠϯελϯεΛʮϨΠϠʔʯʹొ▸ ϨΠϠʔʹର࣮ͯ͠ߦ͢ΔDPPLCPPLΛઃఆ▸ ελοΫʷ*".Ϣʔβ୯ҐͰɺ44)ݤɾTVEPݖݶͷཧ͕Մೳ▸ ྫ͑ɺ*".ϢʔβʮBMJDFʯΛελοΫʢ"1*ϨΠϠʔΛ࣋ͭʣʹՃ͠TVEPݖݶΛ༩ "1*ϨΠϠʔͷΠϯελϯεʹϢʔβ͕Ճ͞Εɺ44)TVEP͕ར༻ՄೳʹͳΔ
© 2017 VASILY,Inc.
© 2017 VASILY,Inc.OpsWorks▸ 0QT8PSLTࣗମ$MPVE'PSNBUJPOͰཧՄೳ▸ 0QT8PSLTʹొ͞ΕͨΠϯελϯεىಈ࣌ʹ·ͣ$IFG͕࣮ߦ͞ΕΔ▸ ҙͷλΠϛϯάͰɺ8FC6*͔Β$IFGͷ࠶࣮ߦՄೳ▸ 44)ݤΛ࣋ͨͳ͍σϑΥϧτϢʔβʢ"NB[PO-JOVYͳΒFDVTFSʣ࡞Մೳ
© 2017 VASILY,Inc.ςετͱσϓϩΠ▸ ςϯϓϨʔτͷݕূͱөΛ͔Γ͍͢ϨʔϧʹͤΔ▸ ςετϑΣʔζͰ$MPVE'PSNBUJPOςϯϓϨʔτΛݕূ▸ BXTDMPVEGPSNBUJPOWBMJEBUFUFNQMBUFUFNQMBUF▸ NBTUFSϒϥϯνͷϚʔδͱಉ࣌ʹ$MPVE'PSNBUJPOͷʮมߋηοτʯΛ࡞▸ Ϧιʔεͷมߋ༰ʢߋ৽ɾஔɾআʣ͕8FCίϯιʔϧʹͯ֬ೝՄೳͳঢ়ଶʹͳΔ▸ ͳ͚ΕʮөʯΛ࣮ߦ▸ $PEF1JQFMJOFະ༻▸ ѻ͑ΔςϯϓϨʔτʹαΠζ্ݶ͕͋ΔʢCZUFT
© 2017 VASILY,Inc.ςϯϓϨʔτͷݕূ มߋηοτͷ࡞มߋ༰ͷ֬ೝɾঝೝςετͱσϓϩΠ
© 2017 VASILY,Inc. &-#&$ 3%44$MPVE'SPOU*".FUD4VCOFUωοτϫʔΫߏཧΠϯελϯεߏཧςετͱσϓϩΠ
© 2017 VASILY,Inc.ࢦ࢟͢ͱୡঢ়گ▸ ✅࡞ۀ͕هɾ࠶ݱՄೳͰ͋Δ͜ͱ▸ $MPVE'PSNBUJPOͷςϯϓϨʔτʹߏͷҰΛهड़ɾิίϝϯτՃ▸ 0QT8PSLTʹΑΔߏཧ▸ ✅ઃఆͷมߋ͕ՄೳͰ͋Δ͜ͱ▸ (JU)VCʹΑΔςϯϓϨʔτͷมߋཤྺͱ$MPVE'PSNBUJPOଆͷมߋཤྺ▸ ✅ઃఆͷมߋΛө͢Δखॱཱ͕֬͞Ε͍ͯΔ͜ͱ▸ $JSDMF$*ʹΑΔςϯϓϨʔτͷݕূͱߋ৽ηοτ࡞▸ ࠷ऴతͳөਓͷखΛհ͢ʢաͳࣗಈԽආ͚Δʣ
© 2017 VASILY,Inc.ز͔ͭͷ
© 2017 VASILY,Inc.CloudFormation Stackͷํ▸ *OGSB4UBDLͱ4FSWJDF4UBDLʹ▸ *OGSB4UBDL"84ΞΧϯτ୯ҐͰͭ▸ *".Ϣʔβ$MPVE5SBJMͳͲ▸ 4FSWJDF4UBDLαʔϏεͷڥ୯Ґʢྫ͑QSPEʣ͝ͱʹͭ▸ 4όέοτ71$ͳͲ▸ 4FSWJDF4UBDLಉ͡ςϯϓϨʔτͷύϥϝʔλΛมߋͯ͠࡞͞ΕΔ▸ ͋Δ"84ΞΧϯτͰϢχʔΫʹඞཁͳͷͱෳଘࡏ͠͏ΔͷΛ͓ͯ͘͠
© 2017 VASILY,Inc.CloudFormation Stackͷํ*".4αʔϏε༻ςϯϓϨʔτΠϯϑϥ༻ςϯϓϨʔτ*DPOTNBEFCZ'SFFQJLGSPNXXXqBUJDPODPNJTMJDFOTFECZ$$#:ɾɾɾඞཁʹԠͯ͡ɺαʔϏε༻ςϯϓϨʔτͷύϥϝʔλΛมߋ͠࡞
© 2017 VASILY,Inc.OpsWorksͱAutoScaling▸ 0QT8PSLTศརͳ໘ɺ੍͋Δ▸ "-#ͷαϙʔτ͕ͳ͍ɺ6TFS%BUBͷαϙʔτ͕ͳ͍ͳͲ▸ ҙͷ&$ΠϯελϯεΛޙͰ0QT8PSLTͷཧԼʹஔ͚Δ͜ͱΛར༻▸ $MPVE'PSNBUJPOʹͯ6TFS%BUB͖ͷ"VUP4DBMJOHΛఆٛ▸ 6TFS%BUBͰඞཁͳॲཧ0QT8PSLTͷొ▸ 0QT8PSLTͷొʹඞཁͳ*%ɺ$MPVE'PSNBUJPOͷΈࠐΈؔʹΑΔࢀরͰऔಘͰ͖Δ
© 2017 VASILY,Inc.OpsWorksͱAutoScalingAutoScalingLaunchConfiguration:Type: 'AWS::AutoScaling::LaunchConfiguration'Properties:IamInstanceProfile: !Ref IAMInstanceProfileImageId: !Ref AMIInstanceType: 'm4.large'UserData:Fn::Base64: !Sub- |#cloud-configrepo_update: truerepo_upgrade: securitypackages:- python-pipruncmd:- LC_ALL=C sudo pip install awscli- export INSTANCE_ID=$(/usr/local/bin/aws opsworks --region us-east-1 register --infrastructure-class ec2 --stack-id${OpsWorksStackId} --local --use-instance-profile 2>&1 | grep 'Instance ID' | grep -oE '[a-z0-9\-]+$')- while ! /usr/local/bin/aws opsworks --region us-east-1 assign-instance --instance-id $INSTANCE_ID --layer-ids ${OpsWorksLayerId}; do echo 'wait...'; sleep 20; done- { OpsWorksStackId: !Ref OpsWorksStack, OpsWorksLayerId: !Ref OpsWorksLayer }6TFS%BUB͔Β0QT8PSLTొ͢Δྫ
© 2017 VASILY,Inc.·ͱΊ
© 2017 VASILY,Inc.Πϯϑϥ෦ͷੜ࢈ੑ্ͷऔΓΈ▸ αʔϏεͷ૿Ճͱӡ༻ෛՙͷ૿ՃΛઢܗʹ͠ͳ͍Έ▸ $MPVE'PSNBUJPOͱ0QT8PSLTʹΑΔΠϯϑϥͷจॻԽɾ࠶ར༻▸ $JSDMF$*ʹΑΔςετͱσϓϩΠ
© 2017 VASILY,Inc.ؒืूதIUUQTXXXXBOUFEMZDPNDPNQBOJFTWBTJMZ