Slide 1

Slide 1 text

AWS SDK for PHPによる AmazonECS構成管理 PHP Conference 2024 fujitani sora @_fs041490

Slide 2

Slide 2 text

名前 ● 藤谷 想楽(ふじたに そら) ● 22歳 ● @_fs0414 所属 ● 株式会社toridori ● プロダクト開発部 普段は、RubyとかRustの界隈にいます。 PHPコミュニティは初めて😎 自己紹介

Slide 3

Slide 3 text

2022 12月19日 東証グロース市場 に 上場 2016 2017 2019 10月 インフルエンサー広告 プラットフォームシステム アップロント を展開 株式会社 アップロント 設立 2020 8月 インフルエンサー マネジメント事務所 OTOZURE 設立 株式会社 コラボテクノ ロジー に社名変更 インフルエンサー広告 プラットフォームシステム コラボマーケ ティング & コラボベース をリリース 渋谷 オフィス に移転 株式会社 トリドリ に社名変更 各サービス toridori シリーズ へ名称変更 2021 7月 株式会社 GIVIN と事業統合 インフルエンサーブランド 立ち上げ支援 toridori made 始動 10月 10月 9月 6月 沿革 2023 12月 株式会社 OverFlow と事業統合

Slide 4

Slide 4 text

6つの事業を通して インフルエンサーマーケティング を展開しています ※グループ会社

Slide 5

Slide 5 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する 問題提起 PHP、なんかAWS相手に不遇じゃない? ● CDKない ● lambdaない ● 多分色々ない ● 何もかもPHPで書きたいよね?多分、知らんけ ど ないなら作ってみよう PHPで擬似infrastructure as code

Slide 6

Slide 6 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHPが提供するClassたち - AWS\S3\S3Client - AWS\DynamoDb\DynamoDb Client - AWS\Sqs\SqsClient - AWS\Sns\SnsClient - AWS\Ecs\EcsClient - Aws\ElasticLoadBalancingV 2\ElasticLoadBalancingV2Cli ent - Aws\Iam\IamClient;

Slide 7

Slide 7 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHPが提供するClassたち - AWS\S3\S3Client - AWS\DynamoDb\DynamoDb Client - AWS\Sqs\SqsClient - AWS\Sns\SnsClient - AWS\Ecs\EcsClient - Aws\ElasticLoadBalancingV 2\ElasticLoadBalancingV2Cli ent - Aws\Iam\IamClient; よく使われるのはこの辺

Slide 8

Slide 8 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHPが提供するClassたち - AWS\S3\S3Client - AWS\DynamoDb\DynamoDb Client - AWS\Sqs\SqsClient - AWS\Sns\SnsClient - AWS\Ecs\EcsClient - Aws\ElasticLoadBalancingV 2\ElasticLoadBalancingV2Cli ent - Aws\Iam\IamClient; 今回出てくるのはこの辺

Slide 9

Slide 9 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する よくあるAWSインフラ構成 ● VPC ● IAM ○ TaskRole ○ TaskExecuteRole ● ECS ○ Fargate ○ Cluster ○ Serbive ○ Task ○ TaskDefinition ○ ECR ● AWS CDK ○ Terraformとかでも

Slide 10

Slide 10 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する 今日は大体こんなAWSインフラ構成 ● VPC ● IAM ○ TaskRole ○ TaskExecuteRole ● ECS ○ Fargate ○ Cluster ○ Serbive ○ Task ○ TaskDefinition ○ ECR ● PHP ○ AWS SDK FOR PHP

Slide 11

Slide 11 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHP Iac 基礎 ~ SdkDebugMode ● AWS SDKのコードは、AWS APIに変換してRequestされる ● SDK 初期化時にDebugModeをtrueにすることで、内部的に変換されるAWS APIのLogを可視化で きる ● トレーサビリティUPの為に、DebugModeを使おう。 ● AWS CLIの --debugに該当

Slide 12

Slide 12 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHP Iac基礎 ~ SdkDebugMode ● ECS Clusterを取得する例 ○ Middleware, HandlerStackの初期化 ○ ECS CLient のプロパティ 「debug」をtrueに設定 ○ DebugModel trueで初期化した インスタンスでsdk処理実行

Slide 13

Slide 13 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHP Iac基礎 ~ SdkDebugMode ● Logを見てみる ○ なんか映ると不味そうなのはカットしてます ← Cluster取得も成功

Slide 14

Slide 14 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHP Iac 基礎 ~ Document ● ECSの情報、SDK for PHP Documentには乗っていない ○ なら情報はどこに?

Slide 15

Slide 15 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHP Iac 基礎 ~ Document ● SDKのDocumentには載ってた

Slide 16

Slide 16 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHP Iac 基礎 ~ Document ● API ReferenceにもParameterは載ってる

Slide 17

Slide 17 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHP Iac 基礎 ~ 定数管理 ● Component化されたファイル間で、定数名を共有する必要がある ○ ARN, ID… ● TerraformModule的なアレ ↓ ● DockerComposeのENVで管理してどこでも呼べるようにした ● 真面目にやるなら、ParameterStoreかSecretsManegerの方がいい

Slide 18

Slide 18 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する 実装編 → 多いのでぽんぽん行きます

Slide 19

Slide 19 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHP Iac 実装 ~ Network ● Aws\Ec2\Ec2Client; ○ createVpc ○ createSubnet ○ createInternetGateway ○ attachInternetGateway ○ createRouteTable ○ associateRouteTable ○ createSecurityGroup ● Aws\ElasticLoadBalancingV2\ElasticLoadBalancingV2Client; ○ createTargetGroup ○ createLoadBalancer ○ createListener VpcCreate.phpにnetworkリソース作成項目を記載し、 ファイル実行でAWS APIに必要なRequestを送信できる ようにする network.php

Slide 20

Slide 20 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHP Iac 実装 ~ Network ● network.phpにtry catchを定義し、try分にこれから出てくるscriptを記述 ■ 例外発生時はcatchでAWSExceptionをLogに表示

Slide 21

Slide 21 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHP Iac 実装 ~ Network ● VPC実装 ○ ResoueceType, Tagを指定 ○ subnet作成プロセスで使用するので、 VpcIdを取得しておく

Slide 22

Slide 22 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHP Iac 実装 ~ Network ● Subnet実装 ○ LoadBalancerの為にAZ2つで作成

Slide 23

Slide 23 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHP Iac 実装 ~ Network ● InternetGateway ○ createInternetGatewayで作成 ○ attachInternetGatewayでidを参照してVPCにattach

Slide 24

Slide 24 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHP Iac 実装 ~ Network ● routeTable ○ リソース作成してVpcにattach ■ routeTable自体と、Internetとのgatewayになる InternetGateway(名前と機能がそのまま)をattach ■ 最後に、サーバインスタンスを設置するsubnetに igwとの通信を開ける

Slide 25

Slide 25 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHP Iac 実装 ~ Network ● SecurtyGroup ○ createSecurityGroupで定義 ○ inboundとoutboundの通信許可を定義 ○ 今回は検証用の為、制限なし

Slide 26

Slide 26 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHP Iac 実装 ~ Network ● TergetGroup ○ ここからElasticLoadBalancingV2Client ○ createTargetGroupで定義 ○ ApplicationLoadBalancerの通信に関する詳細情報を定義 ○ PortやProtocol、HealthChecknのpath等を定義

Slide 27

Slide 27 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHP Iac 実装 ~ Network ● ApplicationLoadBalancer ○ トラフィックを事前に定義した%等で複数台のインスタンスに振り分けてくれる(負荷分 散) ○ 前に作った二つのsubnetやSecurtyGroupをattach ○ createLoadBalancerで定義

Slide 28

Slide 28 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHP Iac 実装 ~ Network ● ListenerRule ○ createListenerで定義 ○ TergetGrouptとAlbを関連付けて実際の通信経路を決めるやつ

Slide 29

Slide 29 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHP Iac 実装 ~ Network ● ここまでのnetwork.phpを実行するとnetwork resourceが作成される ● デプロイ成功

Slide 30

Slide 30 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHP Iac 実装 ~ IAM Role ● この後作成するECSが、task起動時にECRのImageを取得する為のRoleを作成する ● IamClientを使用する TaskExecuteRoleCreate.php

Slide 31

Slide 31 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHP Iac 実装 ~ IAM Role ● createRoleとattachRolePolicyを使用 ○ ECRのReadOnly専用Policyを取得し、$iamClient->createRolでTask実行Roleを作成 ○ Policyは複数割り当てられるよう配列とforeachで定義 ○ sts:AssumeRoleで一時的な許可を実装

Slide 32

Slide 32 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHP Iac 実装 ~ ECS ● ECSClientを初期化 ● Task実行role割り当ての為にこっちでもIamClientが必要 EcsScript.php

Slide 33

Slide 33 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHP Iac 実装 ~ ECS ● ECRにアプリとして公開するDocker imageをpush ○ この作業してる時、MacM2にしたが故の--platform=linux/amd64問題に苦しめられた ○ (小声)Neovimはいいぞ

Slide 34

Slide 34 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHP Iac 実装 ~ ECS ● ECS Cluster定義 ○ createClusterで定義 ○ コンテナ管理の一番大きな箱 ○ 定義は簡単

Slide 35

Slide 35 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHP Iac 実装 ~ ECS ● TaskDefinition定義 ○ registerTaskDefinition ○ imageで、ECR ImageをPull ○ networkModeはawsvpcで定義 ■ ipにすると別の設定が必要 ○ 実行環境はFargateのECS Serviceを使う ○ executionRoleArnで作成した実行ロール をattach ○ memoryとcpuは最小 ● TaskDefinitionをPHPで定義している、 珍しい例なのでは...

Slide 36

Slide 36 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHP Iac 実装 ~ ECS ● ECS Service定義 ○ createService ○ 定義したtaskDefinitionをデプロイする コンテナに指定 ○ networkの章で定義したSubnet, SecurtyGroup を指定 ○ 実行環境にはFargeteを指定 ○ desiredCountで起動task数を指定

Slide 37

Slide 37 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHP Iac 実装 ~ ECS ● phpコマンドでデプロイを実行 ○ php EcsScript.php ○ ログで確認

Slide 38

Slide 38 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHP Iac 実装 ~ ECS PHPでECSコンテナをデプロイできた☺

Slide 39

Slide 39 text

企業がエンジニアを雇用する 企業がエンジ企業がエンジニアを雇用する ニアを雇用する 企業がエンジニアを雇用する AWS SDK for PHP Iac 実装 ~ まとめ Iac専用ツールは偉大 AWS CDK, Terraform、ありがとう PHPも使いやすいね