SlideShare a Scribd company logo
@chatii - ちゃちい - 2022-09-24 at PHPカンファレンス2022
AWS CDK に魅入られた PHPer が


オススメする IaC から入る


インフラの話
やっとみんな会えたね
やっとみんな会えたね
• ちゃちい	(@chatii)
• PHPer	(4.0くらい〜)
• フルスタックエンジニア
• インフラ専門ではありません
• ライスシャワー推しです
•
自己紹介
今日のお品書き
• PHPer	がインフラを理解する必要性
• AWS	CDK	でインフラとふれあおう
話さないこと
• AWS	CDK	の導入方法、ベストプラクティス
• AWS	アカウントの作り方など
CDK	の雰囲気を知りたい方は登壇後
声をかけていただければ
インフラを理解する必要性
インフラを理解する必要性
• 自分が扱う層には上も下もある
• PHPを書いているならPHPが動く環境が下にある
• アプリケーションはアプリケーションだけでは動かない
• フレームワークやライブラリがどう作られているのか?
• PHPはなぜ動くのか?
• PHPがなぜ動かないのか?
• 原因を探るべく、我々はインフラの奥地へ…
インフラを理解する必要性
• 自分の作ったアプリケーションが
• どうやって動いているのか、どうやって動かすのか
• 動かない場合
• どんなコトが発生している?
• どんなトキに発生している?
• どうやって対応する?
インフラを理解する必要性
=インフラで困らないように
=アプリケーションを安心して作れる
インフラで困らないように
• 「インフラ部隊が別にいるから」
• 「できる先輩がいるから」
• 「PHPのコード書くのも精一杯なのに」
できる先輩は
できるようになっただけの先輩
分業化されているからこそ
能動的に知りに行く
基礎を「手軽に」学ぶ・触れる
AWS	CDK	で
インフラとふれあう
AWS	CDK	でインフラとふれあう
AWS Cloud Development Kit (AWS CDK) は、使い慣れたプログラミング
言語を使用してクラウドアプリケーションリソースを定義するためのオープ
ンソースのソフトウェア開発フレームワークです。
引用元: https://aws.amazon.com/jp/cdk/
• Infrastructure	as	Code	って?
• インフラの構成をコードで表現する
• 手作業(手順書)をコードにすることでメンテしやすく・構築しやすくする
• クラウドに限らない、オンプレミスだって	IaC	でできる
IaC,	CDK	がなぜインフラとふれあうことになるのか
• オンプレミスは物理的にモノ(マシンやネットワーク機器)がないと触れない
• ローカルに仮想マシン(VM)でいいじゃん、もそれはそう
• なのでそういう話を今こそ誰かして欲しい
• 物理的なモノを高度に抽象化している
• わかりやすいカタチになっている(はず)
• 抽象化のモトは下の層になる
• より知りたいとおもったら降りていけばよい
なぜ他の	IaC	ではなく	CDK	なのか?
• 「プログラミング言語で記述」できるから
• 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
(PHPer並感)
CDK	で構築してみる、なにを?
我々はPHPerなので
• ゴールはPHPが動作する環境
• 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も選べる
https://aws.amazon.com/jp/ec2/
え、コンテナは…?Fargateとかそういう…
• 「実行環境」を抽象化したものなので、今回は登場しません
• まずは	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 // これはなんぞや?


})


}


}
マシンはネットワークに接続する
• インターネットに公開するため
マシンはネットワークに接続する
物理の場合
• LAN	ポートからネットワークハブなど


に接続し、ネットワーク(LAN)に


接続する
マシンはネットワークに接続する
AWSの場合
• EC2	インスタンスは	VPC	上で起動する(仕様)
• VPC	=	Virtual	Private	Cloud
• AWS上の「仮想ネットワーク」
• …つまりネットワークの知識が必要
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


})


}


}
ネットワークはインターネットに接続する
• ネットワーク≠インターネット
• 世の中にはインターネットに接続されていないネットワークもある
ネットワークはインターネットに接続する
物理の場合
• ご自宅にあるルーターがその役割
• いわゆる「ブロードバンドルータ」
• キーワード:


DHCP,	ルートテーブル,


デフォルトゲートウェイ,	DNS
ネットワークはインターネットに接続する
AWS	の場合
• 「インターネットゲートウェイ」
• VPC	に用意する
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Internet_Gateway.html
VPC	にインターネットゲートウェイを追加する(?)
// VPC を作る


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


• 「なにも変わっていない?」
• 実はこれだけでインターネット


ゲートウェイも追加される
• デフォルトで用意される


リソースが結構ある
サーバーはインターネットからアクセスできる
• インターネットゲートウェイは「内から外へ」の方向
• 逆方向「外から内へ」つまり公開するためには?
サーバーはインターネットからアクセスできる
物理(?)の場合
• グローバルIPアドレス
• プロバイダーのオプションで固定IPアドレスを契約するなど
サーバーはインターネットからアクセスできる
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,


}),


})
サーバーへアクセスできるポートを設定する
• 今回は	HTTP	と	SSH	を許可する	(80	および	22)
サーバーへアクセスできるポートを設定する
物理の場合
• ルーターやOSの「ファイヤウォール」
• ご自宅の場合、ネットワーク内のマシンに直接グローバルIPアドレスを割り
当てることはあまりない(オススメしない)
• ルーターの機能(ポートフォワード等)でポート80はどのローカルIPに転送
する、という設定をする
サーバーへアクセスできるポートを設定する
AWS	の場合
• 「セキュリティグループ」に「インバウンドのルール」を追加する
• 外からくるので「インバウンド」
• ちなみに逆は「アウトバウンドルール」
セキュリティグループを作成し、EC2インスタンスに適用する
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インスタンスが構築できた
• あとはWebサーバーとPHPを導入するだけ!
• 「それもインフラでは?」
• 時と場合と現場による
SSH	キーが無いけど	EC2	Instance	Connect	を使えばOK
• ブラウザ上で接続できる
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

PPTX
WayOfNoTrouble.pptx
PDF
イミュータブルデータモデル(入門編)
PPTX
Docker friendly PHP / Laravel
PDF
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
PDF
マルチテナント化で知っておきたいデータベースのこと
KEY
やはりお前らのMVCは間違っている
PDF
Laravelを用いたゲームサーバーのチューニング
PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
WayOfNoTrouble.pptx
イミュータブルデータモデル(入門編)
Docker friendly PHP / Laravel
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
マルチテナント化で知っておきたいデータベースのこと
やはりお前らのMVCは間違っている
Laravelを用いたゲームサーバーのチューニング
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)

What's hot (20)

PDF
インフラエンジニアの綺麗で優しい手順書の書き方
PPTX
データモデリング・テクニック
PDF
Where狙いのキー、order by狙いのキー
PDF
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
PDF
AWSのログ管理ベストプラクティス
PDF
日本語テストメソッドについて
PPTX
さくっと理解するSpring bootの仕組み
PDF
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
PDF
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
PDF
マルチテナントのアプリケーション実装〜実践編〜
PDF
Zabbix最新情報 ~Zabbix 6.0に向けて~ @OSC2021 Online/Fall
PDF
Dockerfileを改善するためのBest Practice 2019年版
PDF
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
PDF
Docker Compose 徹底解説
PPTX
初心者向けMongoDBのキホン!
PDF
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
PDF
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
PDF
DatadogでAWS監視やってみた
PPTX
Docker Tokyo
PDF
イミュータブルデータモデル(世代編)
インフラエンジニアの綺麗で優しい手順書の書き方
データモデリング・テクニック
Where狙いのキー、order by狙いのキー
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
AWSのログ管理ベストプラクティス
日本語テストメソッドについて
さくっと理解するSpring bootの仕組み
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
マルチテナントのアプリケーション実装〜実践編〜
Zabbix最新情報 ~Zabbix 6.0に向けて~ @OSC2021 Online/Fall
Dockerfileを改善するためのBest Practice 2019年版
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
Docker Compose 徹底解説
初心者向けMongoDBのキホン!
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
DatadogでAWS監視やってみた
Docker Tokyo
イミュータブルデータモデル(世代編)
Ad

AWS CDKに魅入られた PHPer がオススメする