際際滷

際際滷Share a Scribd company logo
@chatii - ちゃちい - 2022-09-24 at PHPカンファレンス2022
AWS CDK に犯襪蕕譴 PHPer が
?
オススメする IaC から秘る
?
インフラの
やっとみんな氏えたね
やっとみんな氏えたね
? ちゃちい	(@chatii)
? PHPer	(4.0くらい?)
? フルスタックエンジニア
? インフラTではありません
? ライスシャワ`容しです
?
徭失B初
書晩のお瞳き
? PHPer	がインフラを尖盾する駅勣來
? AWS	CDK	でインフラとふれあおう
さないこと
? AWS	CDK	の秘圭隈、ベストプラクティス
? AWS	アカウントの恬り圭など
CDK	の櫃鰆りたい圭は鞠瘁
蕗をかけていただければ
インフラを尖盾する駅勣來
インフラを尖盾する駅勣來
? 徭蛍がQう咾砲鷲呂睿造發△
? PHPをいているならPHPが咾h廠が和にある
? アプリケ`ションはアプリケ`ションだけでは咾ない
? フレ`ムワ`クやライブラリがどう恬られているのか
? PHPはなぜ咾のか
? PHPがなぜ咾ないのか
? 圻咀を冥るべく、厘?はインフラの安仇へ´
インフラを尖盾する駅勣來
? 徭蛍の恬ったアプリケ`ションが
? どうやって咾い討い襪里、どうやって咾すのか
? 咾ない栽
? どんなコトがk伏している
? どんなトキにk伏している
? どうやって鬉垢襭
インフラを尖盾する駅勣來
愁ぅ鵐侫蕕農Г蕕覆い茲Δ
愁▲廛螢羽`ションを芦伉して恬れる
インフラで是らないように
? 仝インフラ何がeにいるから々
? 仝できる枠がいるから々
? 仝永堰永のコ`ド慕くのも娼匯鵜なのに々
できる枠は
できるようになっただけの枠
蛍I晒されているからこそ
嬬啜弔勃りに佩く
児粥を仝返Xに々僥ぶ?乾れる
AWS	CDK	で
インフラとふれあう
AWS	CDK	でインフラとふれあう
AWS Cloud Development Kit (AWS CDK) は、聞いTれたプログラミング
冱Zを聞喘してクラウドアプリケ`ションリソ`スを協xするためのオ`プ
ンソ`スのソフトウェア_kフレ`ムワ`クです。
哈喘圷: https://aws.amazon.com/jp/cdk/
? Infrastructure	as	Code	って
? インフラの撹をコ`ドで燕Fする
? 返恬I(返)をコ`ドにすることでメンテしやすく?Bしやすくする
? クラウドに泙蕕覆ぁ▲ンプレミスだって	IaC	でできる
IaC,	CDK	がなぜインフラとふれあうことになるのか
? オンプレミスは麗尖議にモノ(マシンやネットワ`クC匂)がないと乾れない
? ロ`カルに∀襯泪轡(VM)でいいじゃん、もそれはそう
? なのでそういうを書こそlかして圀しい
? 麗尖議なモノを互業に渇鷸している
? わかりやすいカタチになっている(はず)
? 渇鷸のモトは和の咾砲覆
? より岑りたいとおもったら週りていけばよい
なぜ麿の	IaC	ではなく	CDK	なのか
? 仝プログラミング冱Zで峰々できるから
? TypeScript,	Python,	Java,	.NET,	Go
えっ、PHPは
? https://github.com/aws/aws-cdk/issues/548
? 2018´あっ(賀し
? 弊の嶄には	Kotlin	で咾ように
?
がんばった繁もいます
? https://github.com/Semantic-Configuration/AWS-CDK-Kotlin-DSL
(やむなく)	
TypeScript	で	CDK
(PHPerK湖)
CDK	でBしてみる、なにを
厘?はPHPerなので
? ゴ`ルはPHPが嘛するh廠
? Hello,	World	してみよう
? そのために駅勣なインフラってなんだろう
? まずはサ`バ`´サ`バ`ってなんだ織ぅ鵐食`ネット´殖????????´
? PHPをインスト`ルする
? 採に
? Windows	とか	macOS	とか	Linux	とか
? OSが秘ったコンピュ`タが駅勣。
コンピュ`タを喘吭する
麗尖の栽
匯箭(hpのオンラインストア)
ピンキリ。ピンキリ。
https://h50146.www5.hpe.com/directplus_ent/server/?ref=dplustopcategory1
コンピュ`タを喘吭する
AWS	の栽
? Amazon	EC2	(Elastic	Compute	Cloud)
? インスタンスを羨てる	が	1岬のマシンに犁
? OSもxべる
https://aws.amazon.com/jp/ec2/
え、コンテナは´Fargateとかそういう´
? 仝g佩h廠々を渇鷸したものなので、書指は鞠しません
? まずは	EC2	インスタンスを咾せるようになろう
EC2	インスタンスの恬り圭
import * as cdk from 'aws-cdk-lib';


import {Construct} from 'constructs';


import {Instance, InstanceClass, InstanceSize, InstanceType, MachineImage} from aws-cdk-lib/
aws-ec2;


export class CdkStack extends cdk.Stack {


constructor(scope: Construct, id: string, props?: cdk.StackProps) {


super(scope, id, props);


// EC2 インスタンスを恬る


const ec2Instance = new Instance(this, 'EC2Instance', {


instanceType: InstanceType.of(


InstanceClass.T2,


InstanceSize.MICRO


),


// Preview井のAmazon Linux


machineImage: MachineImage.fromSsmParameter('/aws/service/ami-amazon-linux-latest/
al2022-ami-kernel-5.15-x86_64'),


vpc: undefined // これはなんぞや


})


}


}
マシンはネットワ`クに俊Aする
? インタ`ネットに巷_するため
マシンはネットワ`クに俊Aする
麗尖の栽
? LAN	ポ`トからネットワ`クハブなど
?
に俊Aし、ネットワ`ク(LAN)に
?
俊Aする
マシンはネットワ`クに俊Aする
AWSの栽
? EC2	インスタンスは	VPC	貧で軟咾垢(碧)
? VPC	=	Virtual	Private	Cloud
? AWS貧の仝∀襯優奪肇鍠`ク々
? ´つまりネットワ`クの岑Rが駅勣
https://aws.amazon.com/jp/vpc/
VPC	の恬り圭
export class CdkStack extends cdk.Stack {


constructor(scope: Construct, id: string, props?: cdk.StackProps) {


super(scope, id, props);


// VPC を恬る


const vpc = new Vpc(this, 'Vpc')


// EC2 インスタンスを恬る


const ec2Instance = new Instance(this, 'EC2Instance', {


instanceType: InstanceType.of(


InstanceClass.T2,


InstanceSize.MICRO


),


machineImage: MachineImage.fromSsmParameter('/aws/service/ami-amazon-linux-
latest/al2022-ami-kernel-5.15-x86_64'),


vpc: vpc


})


}


}
ネットワ`クはインタ`ネットに俊Aする
? ネットワ`ク』インタ`ネット
? 弊の嶄にはインタ`ネットに俊Aされていないネットワ`クもある
ネットワ`クはインタ`ネットに俊Aする
麗尖の栽
? ご徭姙にあるル`タ`がその叨護
? いわゆる仝ブロ`ドバンドル`タ々
? キ`ワ`ド:
?
DHCP,	ル`トテ`ブル,
?
デフォルトゲ`トウェイ,	DNS
ネットワ`クはインタ`ネットに俊Aする
AWS	の栽
? 仝インタ`ネットゲ`トウェイ々
? VPC	に喘吭する
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Internet_Gateway.html
VPC	にインタ`ネットゲ`トウェイを弖紗する(?)
// VPC を恬る


const vpc = new Vpc(this, 'Vpc')


? 仝なにも笋錣辰討い覆ぃ拭
? gはこれだけでインタ`ネット
?
ゲ`トウェイも弖紗される
? デフォルトで喘吭される
?
リソ`スがYある
サ`バ`はインタ`ネットからアクセスできる
? インタ`ネットゲ`トウェイは仝坪から翌へ々の圭
? 剃圭髻戸發ら坪へ々つまり巷_するためには
サ`バ`はインタ`ネットからアクセスできる
麗尖()の栽
? グロ`バルIPアドレス
? プロバイダ`のオプションで耕協IPアドレスを弐sするなど
サ`バ`はインタ`ネットからアクセスできる
AWS	の栽
? パブリック	IPv4	アドレス
? EC2インスタンスが仝パブリックサブネット々に侭奉する駅勣がある
? ここまででの譜協だと仝プライベ`トサブネット々に侭奉している
EC2インスタンスをパブリックサブネットへ
// EC2 インスタンスを恬る


const ec2Instance = new Instance(this, 'EC2Instance', {


instanceType: InstanceType.of(


InstanceClass.T2,


InstanceSize.MICRO


),


machineImage: MachineImage.fromSsmParameter('/aws/service/ami-
amazon-linux-latest/al2022-ami-kernel-5.15-x86_64'),


vpc: vpc,


// 弖


vpcSubnets: vpc.selectSubnets({


subnetType: SubnetType.PUBLIC,


}),


})
サ`バ`へアクセスできるポ`トをO協する
? 書指は	HTTP	と	SSH	をS辛する	(80	および	22)
サ`バ`へアクセスできるポ`トをO協する
麗尖の栽
? ル`タ`やOSの仝ファイヤウォ`ル々
? ご徭姙の栽、ネットワ`ク坪のマシンに岷俊グロ`バルIPアドレスを護り
輝てることはあまりない(オススメしない)
? ル`タ`のC嬬(ポ`トフォワ`ド吉)でポ`ト80はどのロ`カルIPに僕
する、というO協をする
サ`バ`へアクセスできるポ`トをO協する
AWS	の栽
? 仝セキュリティグル`プ々に仝インバウンドのル`ル々を弖紗する
? 翌からくるので仝インバウンド々
? ちなみに剃は仝アウトバウンドル`ル々
セキュリティグル`プを恬撹し、EC2インスタンスにm喘する
const httpSecurityGroup = new SecurityGroup(this, 'AllowHTTPSecurityGroup',
{


vpc: vpc,


})


httpSecurityGroup.addIngressRule(Peer.anyIpv4(), Port.tcp(80))


httpSecurityGroup.addIngressRule(Peer.anyIpv6(), Port.tcp(80))


const sshSecurityGroup = new SecurityGroup(this, 'AllowSSHSecurityGroup', {


vpc: vpc,


})


sshSecurityGroup.addIngressRule(Peer.anyIpv4(), Port.tcp(22))


sshSecurityGroup.addIngressRule(Peer.anyIpv6(), Port.tcp(22))


ec2Instance.addSecurityGroup(httpSecurityGroup)


ec2Instance.addSecurityGroup(sshSecurityGroup)
おめでとう、インフラができた
おめでとう、インフラができた
? これでHTTPが巷_されたEC2インスタンスがBできた
? あとはWebサ`バ`とPHPを秘するだけ
? 仝それもインフラでは拭
? rと栽とFによる
SSH	キ`がoいけど	EC2	Instance	Connect	を聞えばOK
? ブラウザ貧で俊Aできる
Apache	と	PHP	を秘れる
AWSのチュ`トリアルを歌深に
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-lamp-amazon-linux-2022.html
sudo yum install -y httpd wget php-fpm php-mysqli php-json php php-devel


sudo systemctl start httpd


echo ?php echo 'Hello, World';  /var/www/html/test.php
インフラとふれあえそうですか

More Related Content

AWS CDKに犯襪蕕譴 PHPer か?オススメする