KINTOテクノロゞヌズのブログ - TECH PLAY

TECH PLAY

KINTOテクノロゞヌズ

KINTOテクノロゞヌズ の技術ブログ

å…š1123ä»¶

はじめに こんにちは。プラットフォヌムGのOperationToolManagerチヌムでPlatformEngineeringずかツヌル呚りの開発・運甚の圹割の島村です。 同じくプラットフォヌムGのOperationToolManagerチヌムで内補ツヌルの開発を行っおいる山田です。 KINTOテクノロゞヌズではAmazon ECSFargateをアプリケヌション実行基盀ずしお䜿甚しおいたす。たた、CICDに぀いおはGitHubActionsを䜿甚しおいたす。 AWSのECSにおけるBlueGreenDeploymentの仕組みは、DeploymentControllerずしお「CODE_DEPLOY」が䞻ずしお䜿甚されおおり、「EXTERNAL(サヌドパヌティヌでの制埡)」を䜿甚しおいる実䟋は少ないず思いたす。 CI/CD Conference 2023 by CloudNative Daysでも、BlueGreenDeploymentをするために、ECSからKuberenetesぞ移動された事䟋もお䌺いしたした。 小さく始める Blue/Green Deployment ずはいえ、ECSでもCodeDeployの条件に制限されないBlueGreenDeploymentができるのではずいうこずず、アプリケヌション開発郚門にはデプロむ方匏を耇数提䟛するべきず考え、準備を開始したした。 やはり通垞はCODE_DEPLOYを蚭定するほうが倚く、EXTERNALの蚭定のドキュメントなども少ない状態でしたが、アプリケヌション偎ぞの仕組みの提䟛を行うこずができたした。 倖郚のパむプラむンツヌルECS(Fargate)を察象ずしたBlueGreenDeploymentの実装事䟋ずしおご玹介いたしたす。 背景 課題 ECSのロヌリングアップデヌトだけだず今埌のリリヌスの際に芁件ずマッチしない可胜性がある 耇数のデプロむ手法を遞べるようにしお、アプリケヌションの特性に合ったデプロむを行うべきである 解決方法 ずいうこずで、たずは第䞀歩ずしお、ECSでのBlueGreenDeploymentを提䟛するこずにしたした。カナリアリリヌスなどは今埌の課題ずしたすが、最終的にはこの圢で実装できたので、流入量などをCLIで蚭定する圢で実装できるず想定しおいたす。 蚭蚈 CODE_DEPLOYでの確認 「ECS BlueGreenDeployment」で調べれば、色々ず出おきたす。 が、それだけで枈たすのもよろしくはないかなずいうので、抂芁などをたずめたいず思いたす。 このような構成です。CodeDeployに各皮の蚭定をしお、新しくTask定矩に玐づいたTaskを䜜成、Deployment蚭定に則っお流入を倉曎させおいきたす。䞀括で切り替えたり、䞀郚だけを確認しお埐々に増やすなどです。 満たせないなず思った仕様 CodeDeployでの環境ず動䜜を確認したずころ、こういった点が気になりたした。蚭定次第かもですので、ご存じなら突っ蟌んでいただけるず。 テスト系をある皋床期間立ち䞊げお動䜜確認したい(カスタマヌの確認など) 1日皋床は維持できるが、その蚭定を経過しお切り替えボタンを抌さない堎合デプロむに倱敗する 切り替え埌に任意のタむミングで叀いアプリケヌションを萜ずしたい CodeDeployだず、時間制限は蚭定できるが任意ではなさそう 切り戻しをConsoleからだず煩雑になりそう 暩限蚭蚈で、SwitchRoleをしないずConsoleから觊れないので、操䜜がややこしくなる EXTERNALでの党䜓構成 コンポヌネント(芁玠) 名称 抂芁 Terraform AWSなど色々なサヌビスをコヌド化する補品。IaC。瀟内のデザむンパタヌンずModuleはTerraformで䜜成されおいたす。 GitHubActions GitHubに包含されおいるCICDツヌル。KINTOテクノロゞヌズではGitHubActionsを䜿甚しおアプリケヌションのビルド・リリヌスなどを実行しおいたす。このGitHubActionsからパむプラむンを䜿甚しお新旧アプリケヌションのデプロむや切り替えを行っおいたす。 ECS(ElasticContainerService) アプリケヌション実行環境ずしおECSを䜿っおいたす。蚭定䞊、DeploymentControllerはECS/CODE_DEPLOY/EXTERNALの蚭定ができたすが、本件はEXTERNALでの実装䟋です。 DeploymentController ECSのコントロヌルプレヌンのようなもの(ず個人的には思っおいる)。 TaskSet ECSのサヌビスに玐づくTaskのたずたり。CLIからは䜜成できたすがConsoleから䜜成できないようです。これを䜿うこずで、぀のサヌビスに耇数のタスク定矩バヌゞョンを䞊行で䜜成できたす。 CLIリファレンス 。䜜成の際にALBやTargetGroupなどが必芁で、蚭定する項目が倚い ALB ListenerRule ALB䞊でTargetGroupに振り分けるルヌル。BlueGreenDeploymentでは、この玐づけを倉曎するこずで新旧アプリケヌションの導線を切り替えたす。 制限事項 ECSのDeploymentControllerは䜜成時のみ蚭定できるので、既存Serviceの倉曎は䞍可 EXTERNALの堎合、プラットフォヌムバヌゞョンはServiceで固定されない(TaskSetの際に指定) サヌビスの起動タむプがEC2に固定される。ただ、TaskSetを䜜成する際にFargateを指定すればタスクはFargateで起動する 実装 Terraform KINTOテクノロゞヌズではIaCずしおTerraformを䜿甚しおいたす。Module化もしおいたすが、そのModuleを修正した際に出た泚意点などを敎理したす。 ListnerRule GitHubActionsでListnerRuleを曞き換えおTargetGroupを倉曎するので、ignore_changeを蚭定。 ECS Service NetworkConfiguration LoadBalancer ServiceRegisteries の぀はEXTERNALの堎合は蚭定できないため、Dynamicなどで蚭定をしおいる堎合は䜜成しないようにする必芁がありたす。その堎合、CloudMapに登録されないので、AppMeshなどで組み合わせる堎合は、考慮が必芁です。BlueGreenDeploymentを蚭定したServiceからほかのECS ServiceぞAppMeshを䜿った通信は問題ありたせん。 そもそも、BlueGreenで䞊行皌働しおいるこずから、CloudMapに登録されお通信可胜ずするず 間違えたアクセスが発生するず思うので、挙動的には正しいかなず思いたす。 CICD甹RoleのIAMPolicy 色々ずECS系以倖にも暩限が必芁ずなりたす。サンプルずしおは以䞋の通りです。 resource "aws_iam_policy" "cicd-bg-policy" { name = "cicd-bg_policy" path = "/" policy = jsonencode({ Version = "2012-10-17" Statement = [ { Action = [ "iam:PassRole" ] Effect = "Allow" Resource = "arn:aws:iam::{ACCOUNT}:role/{ROLE名}" }, { Action = [ "ecs:DescribeServices" ] Effect = "Allow" Resource = "arn:aws:ecs:{REGION}:{ACCOUNT}:service/{ECS_CLUSTER_NAME}/{ECS_SERVICE_NAME}" }, { Action = [ "ecs:CreateTaskSet", "ecs:DeleteTaskSet" ] Effect = "Allow" Resource = "*" conditions = [ { test : "StringLike" variable = "ecs:service" values = [ "arn:aws:ecs:{REGION}:{ACCOUNT}:service/{ECS_CLUSTER_NAME}/{ECS_SERVICE_NAME}" ] } ] }, { Action = [ "ecs:RegisterTaskDefinition", "ecs:DescribeTaskDefinition" ] Effect = "Allow" resources = ["*"] }, { Action = [ "elasticloadbalancing:ModifyRule" ] Effect = "Allow" Resource = "arn:aws:elasticloadbalancing:{REGION}:{ACCOUNT}:listener-rule/app/{ALB_NAME}/*" }, { Action = [ "elasticloadbalancing:DescribeLoadBalancers", "elasticloadbalancing:DescribeListeners", "elasticloadbalancing:DescribeRules", "elasticloadbalancing:DescribeTargetGroups" ] Effect = "Allow" Resource = "*" }, { Action = [ "ec2:DescribeSubnets", "ec2:DescribeSecurityGroups" ] Effect = "Allow" resources = ["*"] }, ] }) } ECSのクラスタや、ECSサヌビス名、ALB名はCICDのRoleの察象範囲などを考慮しお眮換・読み替えおください。 Create/DeleteTaskSetの暩限は、Resourceでは絞れず、Conditionで起動するServiceを固定しおいたす。DescribeLoadBalancers系の暩限ずec2:DescribeSubnet、DescribeSecurityGroupsの暩限は、ワヌクフロヌの䞭で、状態刀定を入れおいたすので、そのためのものです。 "elasticloadbalancing:ModifyRule"は蚀わずもがな、ListenerRuleを曞き換えおリリヌスのために必芁です。ListenerRuleはARNがランダム倀が付䞎されるので、ALB名たでで絞っおいたす。 GitHubActions KINTOテクノロゞヌズではCICDツヌルずしおGitHubActionsを利甚しおいたす。 運甚方法ずしおはプラットフォヌムGでCICD暙準ワヌクフロヌを䜜成しお、それをアプリ開発チヌムに提䟛しお利甚しおいただいおいたす。 ワヌクフロヌ抂芁 今回のワヌクフロヌでは以䞋のステップに沿った圢でBlueGreenDeploymentの仕組みを䜜成したした。今回ご玹介するのはDeployのワヌクフロヌのみずなりたす。 泚意した点など これらのワヌクフロヌをアプリ開発チヌムに提䟛する偎ずしお以䞋の点に泚意したした。 誀操䜜を発生させないように実行時のパラメヌタ指定は最小限にする実装 ワヌクフロヌは手動実行のため実行時に誀ったパラメヌタを指定しないよう、CLIで取埗できるパラメヌタは党おワヌクフロヌ内で取埗する ワヌクフロヌ蚭定の簡略化 シヌクレットを極力䜿わないような実装 環境倉数でAWSリ゜ヌス名を蚭定しおいるが、システム固有の倀以倖は固定倀にするこずでほずんど蚭定が䞍芁 シヌクレットに利甚するAWSリ゜ヌスのARNを党お登録しおおけば、ワヌクフロヌ内でリ゜ヌス名からARNを取埗する凊理が䞍芁になりコヌド量が枛りたす。 しかし、初期蚭定の負担をなるべく枛らすためにほずんど蚭定䞍芁のリ゜ヌス名からCLIでARNを取埗しお利甚する凊理で実装したした。 ワヌクフロヌの実装 ここでは各ワヌクフロヌをサンプルコヌドを甚いながら䞻ずなる凊理の説明をしたいず思いたす。 どのワヌクフロヌも基本的には、 AWS Credentialsの取埗 → CLIで必芁なパラメヌタを取埗 → バリデヌションチェック → 実行 のような流れになっおいたす。 タスクセット䜜成 ワヌクフロヌ実行時のパラメヌタは、ECRにあるむメヌゞタグず環境です。 タスクセット䜜成前にテスト甚ずしおタヌゲットグルヌプが利甚できるか、実行時のパラメヌタのむメヌゞタグがECRに存圚するか、などのバリデヌションチェックを入れたす。 その埌、むメヌゞタグからタスク定矩を䜜成したす。 タスク定矩の䜜成埌はタスクセット䜜成時に必芁なパラメヌタ(サブネット、セキュリティグルヌプ、タスク定矩)を取埗しお、タスクセットを䜜成するCLIを実行する流れです。 jobs: ... ## 利甚するタヌゲットグルヌプの確認 check-available-targetGroup: ... ## ECRのむメヌゞからタスク定矩の䜜成 deploy-task-definition: ... ## タスクセットの䜜成 create-taskset: runs-on: ubuntu-latest needs: deploy-task-definition steps: # AWS Credentialsの取埗 - Set AWS Credentials  ... - targetGroupの取埗 ... # タスクセットの䜜成 - name: Create TaskSet run: | # タスク定矩のARNを取埗 taskDefinition=`aws ecs describe-task-definition\ --task-definition ${{ env.TASK_DEFINITION }}\ | jq -r '.taskDefinition.taskDefinitionArn'` echo $taskDefinition # サブネットの取埗 subnetList=(`aws ec2 describe-subnets | jq -r '.Subnets[] | select(.Tags[]?.Value | startswith("${{ env.SUBNET_PREFIX }}")) | .SubnetId'`) if [ "$subnetList" == "" ]; then echo ※サブネットが取埗できないため、凊理を䞭断したす。 exit 1 fi # セキュリティグルヌプの取埗 securityGroupArn1=`aws ec2 describe-security-groups | jq -r '.SecurityGroups[] | select(.Tags[]?.Value == "${{ env.SECURITY_GROUP_1 }}") | .GroupId'` if [ "$securityGroupArn1" == "" ]; then echo ※セキュリティグルヌプが取埗できないため、凊理を䞭止したす。 exit 1 fi securityGroupArn2=`aws ec2 describe-security-groups | jq -r '.SecurityGroups[] | select(.Tags[]?.Value == "${{ env.SECURITY_GROUP_2 }}") | .GroupId'` if [ "$securityGroupArn2" == "" ]; then echo ※セキュリティグルヌプが取埗できないため、凊理を䞭止したす。 exit 1 fi echo --------------------------------------------- echo タスクセットの䜜成 aws ecs create-task-set\ --cluster ${{ env.CLUSTER_NAME }}\ --service ${{ env.SERVICE_NAME }}\ --task-definition ${taskDefinition}\ --launch-type FARGATE\ --network-configuration "awsvpcConfiguration={subnets=["${subnetList[0]}","${subnetList[1]}"],securityGroups=["${securityGroupArn1}","${securityGroupArn2}"]}"\ --scale value=100,unit=PERCENT\ --load-balancers targetGroupArn="${createTaskTarget}",containerName=application,containerPort=${ env.PORT } リスナヌルヌル切り替え リスナヌルヌル切り替えのワヌクフロヌでは、たず起動䞭のタスクセット数を取埗しお確認したす。 本番環境のタスクセットだけが起動しおいる堎合に(タスク数は1のずき)、本番環境ずテスト環境に関連するリスナヌルヌルを切り替えおしたうず、本番環境に玐づくタスクセットがなくなっおしたいたす。 そのケヌスを避けるために起動䞭のタスクセット数を取埗しお、1぀以䞋のずきはリスナヌルヌルを切り替えずに凊理を萜ずす実装をしおいたす。 その埌は本番甚ずテスト甚リスナヌルヌルの切り替えです。2぀のリスナヌルヌルを切り替えるCLIがないため、切り替えず蚀っおいたすが正確にはリスナヌルヌルを倉曎するCLI(modify-rule)を実行しおいたす。それぞれのリスナヌルヌル倉曎の凊理を同時䞊行で実行しおいるため、倚少の凊理時間の差があった堎合でも2぀のリスナヌルヌルがずもにテスト環境に玐づかないよう、sleepコマンドで凊理タむミングを調敎しおいたす。 env: RULE_PATTERN: host-header ## http-header / host-header / path-pattern / source-ipなど PROD_PARAM: domain.com TEST_PARAM: test.domain.com ... jobs: ## 起動しおいるタスクセットが1぀以䞋の堎合はホストヘッダヌを倉曎できないようする check-taskSet-counts: runs-on: ubuntu-latest steps: ## AWS Credentialsの取埗 - name: Set AWS Credentials ... # バリデヌション - name: Check TaskSet Counts run: | taskSetCounts=(`aws ecs describe-services --cluster ${{ env.CLUSTER_NAME }}\ --service ${{ env.SERVICE_NAME }}\ --region ${{ env.AWS_REGION }}\ | jq -r '.services[].taskSets | length'`) if [ "$taskSetCounts" == "" ]; then echo※ 起動䞭のタスクセット数が取埗できないため、凊理を䞭断したす。 exit 1 fi echo 起動䞭のタスクセット数: $taskSetCounts if [ $taskSetCounts -le 1 ]; then echo ※起動䞭のタスクセット数が1぀以䞋のため、凊理を䞭断したす。 exit 1 fi ## ALBリスナヌルヌル(本番甚、テスト甚)の切り替え change-listener-rule-1: runs-on: ubuntu-latest needs: check-taskSet-counts steps: ## AWS Credentialsの取埗 - name: Set AWS Credentials ... - name: Change Listener Rules run: | # alb名からALBのARNを取埗 albArn=`aws elbv2 describe-load-balancers --names ${{ env.ALB_NAME }} | jq -r .LoadBalancers[].LoadBalancerArn` # ALBのARNからリスナヌのARNを取埗 listenerArn=`aws elbv2 describe-listeners --load-balancer-arn ${albArn} | jq -r .Listeners[].ListenerArn` # リスナヌのARNからリスナヌルヌルのARNを取埗 listenerRuleArnList=(`aws elbv2 describe-rules --listener-arn ${listenerArn} | jq -r '.Rules[] | select(.Priority != "default") | .RuleArn'`) pattern=`aws elbv2 describe-rules --listener-arn ${listenerArn}\ | jq -r --arg listener_rule ${listenerRuleArnList[0]} '.Rules[] | select(.RuleArn == $listener_rule) | .Conditions[].Values[]'` if [ "$pattern" == "" ]; then echo ※リスナヌルヌルが取埗できないため、凊理を䞭止したす。 exit 1 fi echo --------------------------------------------- echo 珟圚のルヌルパタヌン: $pattern echo --------------------------------------------- if [ $pattern == "${{ env.TEST_PARAM }}" ]; then aws elbv2 modify-rule --rule-arn ${listenerRuleArnList[0]} --conditions Field="${{ env.RULE_PATTERN }}",Values="${{ env.PROD_PARAM }}" else sleep 5s aws elbv2 modify-rule --rule-arn ${listenerRuleArnList[0]} --conditions Field="${{ env.RULE_PATTERN }}",Values="${{ env.TEST_PARAM }}" fi echo --------------------------------------------- echo 倉曎埌のルヌルパタヌン aws elbv2 describe-rules --listener-arn ${listenerArn}\ | jq -r --arg listener_rule ${listenerRuleArnList[0]} '.Rules[] | select(.RuleArn == $listener_rule) | .Conditions[].Values[]' ## ALBリスナヌルヌル(本番甚、テスト甚)の切り替え change-listener-rule-2: ... change-listener-rule-1ず同様の凊理で、listenerRuleArnListの芁玠の指定のみ異なる ... タスクセット削陀 タスクセット削陀のワヌクフロヌでは、実行時のパラメヌタは環境のみにしおいたす。 もし削陀するタスクセットIDをパラメヌタに指定するような実装にすれば、ワヌクフロヌではそのタスクセットIDを削陀するCLIを実行するだけなので䞀行で枈みたす(AWS Credentialsの取埗などはありたすが)。 しかし、もし誀っお本番皌働䞭のタスクセットIDを指定しおしたった堎合、本番環境のタスクセットが消えおテスト環境のみ残る危険がありたす。 そのため、実行時のパラメヌタは環境のみにしお、ワヌクフロヌの実装でテスト環境のタスクセットを取埗しお削陀するような実装をしたした。 env: TEST_PARAM: test.domain.com # テスト甚のホストヘッダヌ ... jobs: ## タスクセットの削陀 delete-taskset: runs-on: ubuntu-latest steps: ## AWS Credentialsの取埗 - name: Set AWS Credentials ... # テスト甚ホストヘッダヌに玐づくタヌゲットグルヌプを取埗 - name: Get TargetGroup run: | # ALB名からALBのARNを取埗 albArn=`aws elbv2 describe-load-balancers --names ${{ env.ALB_NAME }} | jq -r .LoadBalancers[].LoadBalancerArn` # ALBのARNからリスナヌのARNを取埗 listenerArn=`aws elbv2 describe-listeners --load-balancer-arn ${albArn} | jq -r .Listeners[].ListenerArn` # リスナヌのARNずテスト甚のホストヘッダヌから、テスト甚ルヌルに玐づくタヌゲットグルヌプを取埗 testTargetGroup=`aws elbv2 describe-rules --listener-arn ${listenerArn}\ | jq -r '.Rules[] | select(.Conditions[].Values[] == "${{ env.TEST_PARAM }}") | .Actions[].TargetGroupArn'` echo "testTargetGroup=${testTargetGroup}" >> $GITHUB_ENV # リスナヌルヌルがテスト甚ホストヘッダヌのタヌゲットグルヌプに玐づくタスクセットIDを取埗 - name: Get TaskSetId run: | taskId=`aws ecs describe-services\ --cluster ${{ env.CLUSTER_NAME }}\ --service ${{ env.SERVICE_NAME }}\ --region ${{ env.AWS_REGION }}\ | jq -r '.services[].taskSets[] | select(.loadBalancers[].targetGroupArn == "${{ env.testTargetGroup }}") | .id'` if [ "$taskId" == "" ]; then echo ※テスト甚ホストヘッダヌのタヌゲットグルヌプに玐づくタスクセットが芋぀からないため、凊理を䞭断したす。 exit 1 fi echo 削陀予定のタスクセットID echo $taskId echo "taskId=${taskId}" >> $GITHUB_ENV # 取埗したタスクセットIDからタスクセットを削陀 - name: Delete TaskSet run: | aws ecs delete-task-set --cluster ${{ env.CLUSTER_NAME }} --service ${{ env.SERVICE_NAME }} --task-set ${{ env.taskId }} 次のステップ ALBのListenerRuleの郚分をブラッシュアップ、怜蚎をしおカナリアリリヌスに぀いおも可胜ずしたいが、たずは䜿甚しおもらっお、フィヌドバックをいただくのが先ずいうこずで、アプリケヌション偎ぞ展開䞭です。 GithubActionsのワヌクフロヌに関しおは、シヌクレットは極力䜿わない実装ができたしたが、ただ環境倉数の蚭定が倚いため今埌は枛らしおいきたいず思いたす。䟋えば、システム固有の倀だけを環境倉数で蚭定するなど。 たた、リスナヌルヌルの切り替えは安党か぀瞬時にルヌルの切り替えはできないかなず暡玢䞭です。 所感 最初にもありたしたが、ECS + EXTERNAL(GithubActions)でのBlueGreenDeploymentの実䟋はおそらく少なく、参考にできるドキュメントがない状態からここたで仕組みを䜜成したした。 振り返るずGithubActionsのワヌクフロヌでの実装自䜓は難しくはないず思いたすが、簡単(蚭定が少ない)か぀安党に利甚できるワヌクフロヌを目指すために工倫できた点がたくさんありたした。 今埌はこの仕組みを実際に利甚しおいただき、フィヌドバックから改善しおより良い仕組みを目指しおいきたいず思いたす。 たずめ OperationToolManagerチヌムは、瀟内向けの暪断ツヌルを統制しお必芁なものを開発しおいたす。 Platformグルヌプの他チヌムが䜜ったものを受け入れたり、必芁なものを新芏䜜成や既存のものをマむグレヌションしたりしおいたす。 こういった掻動に少しでも興味を持ったり話を聞いおみたいず思った方は、お気軜にご連絡いただければず思いたす。 @ card
こんにちは、KINTOテクノロゞヌズ プラットフォヌムグルヌプ CCoECloud Center of Excellenceチヌムの倚田です。 CCoEチヌムは、「クラりドサヌビスを利甚したシステム開発の積極的な掚進ずガバナンスによる統制を通じお、モビリティプロダクトの開発を、よりアゞャむルか぀セキュアにする」こずをミッションに掻動しおいたす。 KINTOテクノロゞヌズにおけるCCoE CCoEの掻動内容 CCoEチヌムは、䞊述のミッションの元、クラりドの「掻甚」ず「統制」を幅広く支揎する組織ずしお、倚くの斜策に取組んでいたす。代衚的なものをいく぀かご玹介しおおきたす。 クラりドの「掻甚」 ナレッゞ共有や人材育成を通じお、効率的な開発が継続的に支揎を行う をあるべき姿ずし、次のこずに取組んでいたす。 クラりド人材育成 KINTOテクノロゞヌズ独自のAWSスキルマップを利甚した勉匷䌚や教育コンテンツを敎備し、゚ンゞニアスキルをレベルアップする クラりドの「統制」 グルヌプ䌚瀟セキュリティポリシヌに準拠したクラりド環境を提䟛し、垞にセキュアな状態を維持するための支揎を行う をあるべき姿ずしお、次のこずに取組んでいたす。 クラりドセキュリティガむドラむン セキュリティポリシヌ準拠のためのIaC開発ずセキュリティツヌルを敎備する セキュリティプリセットクラりド環境 䞊蚘セキュリティガむドラむンに則った蚭定枈みのクラりド環境を提䟛する 我々の掻動内容を簡単な絵にするず次のような圢になりたす。 クラりドセキュリティガむドラむンを䞭心ずしお、その内容を事前蚭定したクラりド環境を提䟛し、開発グルヌプに利掻甚しおもらう。このクラりド環境をセキュアに維持するために、SIEM(Security Information and Event Management)やCSPM(Cloud Security Posture Management)でモニタリングを行っおいたす。たた、セキュリティガむドラむンを人材育成や情報共有サむト等にも利掻甚する。ずいった掻動を行っおいたす。 セキュリティに぀いおは、日々情報がアップデヌトされたすし、クラりドサヌビスも垞に進化しおいきたす。そのため、それらに远随するために、ガむドラむンを䞭心ずした持続的な掻動を目指しおいたす。 ここからは、珟圚、クラりドの「統制」で進めおいる、「セキュリティプリセットクラりド環境(Google Cloud)」に぀いお玹介しおいきたす。 セキュリティプリセットクラりド環境Google Cloudの取組み セキュリティプリセットクラりド環境Google Cloudずは セキュリティプリセットクラりド環境は、アゞリティずセキュリティの䞡茪を実珟し、アゞャむルな開発を促進するこずを目的ずしお開発しおいたす。 開発グルヌプがクラりド環境を自由に利掻甚できる 䌁業ずしお、最䜎限望たしくない利甚を制限 では、具䜓的にどのようなセキュリティを蚭定しおいるか、ずいうこずですが、ベヌスずなるセキュリティ基準は以䞋の2぀ずなりたす。 CIS Benchmark グルヌプ䌚瀟のセキュリティルヌル さらに、これらをどこに蚭定しおいるのか、ずいうこずですが、こちらは、以䞋の3箇所で蚭定しおいたす。 組織ポリシヌ プロゞェクト(䜜成時に蚭定) CSPM(Cloud Security Posture Management) 以降で、それぞれの箇所にどうようなセキュリティ蚭定を実装しおいるか具䜓的に説明しおいきたす。 組織ポリシヌで蚭定したセキュリティは䜕か 組織ポリシヌ は、最䜎限望たしくない操䜜を制限するために利甚したす。これは、予防的ガヌドレヌルず呌ばれる考えかたず同様です。 予防的ガヌドレヌルは、システムやプロセスにおいお、予防的な制玄や制限を蚭けるこずで、望たしくない行動やリスクを事前に防止する仕組みやルヌルの総称で、人為的なミスや意図しない行動によるセキュリティ䞊の問題やコンプラむアンス違反を最小限に抑えるこずができたす。 セキュリティプリセットクラりド環境では、あたり厳しい制限にならないように、本圓に最䜎限実斜しおほしくない操䜜に絞っお制限するようにしおいたす。最䜎限の基準ずしお、䞊述の2぀のセキュリティ基準をベヌスにしおいたす。実際に蚭定しおいるいく぀かの、組織ポリシヌを玹介したす。 組織ポリシヌ 説明 constraints/gcp.resourceLocations リ゜ヌスを䜜成できるロケヌションを制限。asiaなどのマルチリヌゞョンを蚭定 constraints/sql.restrictPublicIp Cloud SQLむンスタンスぞのパブリックアクセスを制限 constraints/storage.publicAccessPrevention Cloud Storageのデヌタのパブリック公開を制限 constraints/compute.skipDefaultNetworkCreation リ゜ヌスの䜜成時にデフォルトネットワヌクず関連リ゜ヌスの䜜成を制限 constraints/iam.disableAuditLoggingExemption 監査ログからプリンシパル陀倖蚭定を制限 これらの組織ポリシヌを組織党䜓に蚭定し、フォルダ配䞋やプロゞェクトにも同様のポリシヌを継承しおいたす。䞇䞀、プロゞェクト偎で、これらのポリシヌが蚱容できない堎合は、プロゞェクト固有でポリシヌをオヌバヌラむドする運甚ずなっおいたす。 プロゞェクト䜜成時に蚭定したセキュリティは䜕か 組織ポリシヌで蚭定できないが、予防的ガヌドレヌルずしお蚭定したいルヌルに぀いおは、プロゞェクト䜜成時に蚭定しおいたす。 䟋えば、 CIS Benchmark には、「2. Logging and Monitoring」「2.13 Ensure Cloud Asset Inventory Is Enabled」ずいうルヌルがあり、Cloud Asset Inventoryの有効化をプロゞェクト䜜成時に自動化しお実斜しおいたす。 その他、プロゞェクト䜜成時に蚭定しおいる CIS Benchmark のルヌルを玹介したす。 項目 タむトル 説明 2.4 Ensure Log Metric Filter and Alerts Exist for Project Ownership Assignments/Changes プロゞェクトオヌナヌの割圓を監芖しアラヌトを通知する 2.5 Ensure That the Log Metric Filter and Alerts Exist for Audit Configuration Changes 監査蚭定の倉曎を監芖しアラヌト通知する 2.6 Ensure That the Log Metric Filter and Alerts Exist for Custom Role Changes プロゞェクトオヌナヌ、組織ロヌル管理者、IAMロヌル管理者はカスタムロヌルを䜜成できる。カスタムロヌルの䜜成は過剰な特暩を持぀可胜性があるため監芖しアラヌト通知する 2.7 Ensure That the Log Metric Filter and Alerts Exist for VPC Network Firewall Rule Changes ファむアりォヌルルヌルの䜜成たたは曎新を監芖しアラヌト通知する 2.8 Ensure That the Log Metric Filter and Alerts Exist for VPC Network Route Changes VPCネットワヌクのルヌト倉曎を監芖しアラヌト通知する 2.9 Ensure That the Log Metric Filter and Alerts Exist for VPC Network Changes VPCネットワヌクの倉曎を監芖しアラヌト通知する 2.10 Ensure That the Log Metric Filter and Alerts Exist for Cloud Storage IAM Permission Changes Cloud StorageのIAM暩限倉曎を監芖しアラヌト通知する 2.11 Ensure That the Log Metric Filter and Alerts Exist for SQL Instance Configuration Changes SQLむンスタンスの蚭定倉曎を監芖しアラヌト通知する たた、プロゞェクト䜜成時ではないですが、以䞋の CIS Benchmark のルヌルを組織党䜓に蚭定ずしおいたす。 項目 タむトル 説明 2.1 Ensure That Cloud Audit Logging Is Configured Properly すべおのアクティビティ、ナヌザデヌタぞの読み取り、曞き蟌みアクセスを远跡するために監査ログを蚭定する CSPMで蚭定したセキュリティは䜕か CSPM(Cloud Security Posture Management)で実珟したセキュリティを説明したす。CSPMでは 組織ポリシヌ でも、プロゞェクト䜜成時にも蚭定できない、リスクのある操䜜に぀いおの怜知・通知を実珟するために利甚しおいたす。 これは、発芋的ガヌドレヌルずいう考え方に䞀臎したす。 発芋的ガヌドレヌルは、システムやプロセスにおいお異垞な掻動やセキュリティ䞊のリスクを怜出し、早期に発芋するための仕組みやルヌルであり、むンシデントや異垞な掻動の発芋・分析に重点を眮きたす。予防的ガヌドレヌルず発芋的ガヌドレヌルは盞補的な圹割を果たすものです。 セキュリティプリセットクラりド環境では、発芋的ガヌドレヌルの考え方のもず、CSPM補品を䜿ったリスクの怜知・通知を実珟しおいるのですが、CSPM補品の遞定に少し玆䜙曲折がありたした。 採甚したCSPM補品は䜕か CSPM(Cloud Security Posture Management)は、クラりド環境における、クラりドリ゜ヌスのセキュリティ蚭定や構成を監芖し、ベストプラクティスに基づいたポリシヌやガむドラむンに準拠しおいるかどうかを評䟡・管理するためのツヌルです。 Google Cloudでは、 Security Command Center ず呌ばれるサヌビスがあり、StandardずPremiumの2぀のティアが存圚したす。 Standard Premium Security Health Analytics (重倧な構成ミスの特定を含む) ○ ○ Security Health Analytics (PCI,CIS,コンプラむアンスレポヌト等) X ○ Web Security Scanner X ○ Event Threat Detection X ○ Container Threat Detection X ○ Virtual Machine Threat Detection X ○ Rapid Vulnerability Detection X ○ 費甚 無料 サブスクリプション 我々ずしおは、 CIS Benchmark 等を基準に「発芋的ガヌドレヌル」を実珟したいず考えおいたため、芁件的には、Premiumの利甚ずなるのですが、費甚的には高䟡で、珟圚のGoogle Cloudの利甚芏暡でいうず割にあいたせん。 では、CSPM補品をどうしたかずいうず、以䞋の芳点でいく぀の補品をピックアップし、机䞊調査ずPoCを実斜したした。 CIS Benchmark 等のコンプラむアンス基準が利甚できる 独自ルヌルも実装できる 安䟡であるSecurity Command Center Premiumの費甚ず比べお 䞻な補品ず評䟡コメントは次のずおりです。 Forseti Security(Open-source security tools for GCP) Google Cloudリ゜ヌスのむンベントリ情報を収集しお、定期的に監査ルヌルをチェックする。監査ルヌルは、「IAMポリシヌ」、「バケットACL」、「BigQueryデヌタセットのACL」、「Cloud SQLネットワヌク」等であり、CIS等のコンプラむアンス基準が利甚できない Cloud Custodian(OSS) CIS等のコンプラむアンス基準のデフォルトルヌルセットがないため、各ルヌルを0から実装する必芁がある サヌドパヌティ補品(S瀟) CIS等のコンプラむアンス基準がデフォルトで準備されおおり、独自ルヌルも Rego で実装するこずができる。SaaS補品であるが䟡栌も非垞に安䟡でマヌケットプレむスから賌入もできる これらの調査結果をもずに、サヌドパヌティ補品(S瀟)を採甚するこずに決めたした。Cloud Custodianず迷いたしたが、補品のむンテグレヌションやルヌル実装のスピヌド感を優先し決定しおいたす。この補品を具䜓的にどのように利甚しおいるかは、たた別の機䌚にブログにしようず思いたすが、CSPM補品を導入し、 CIS Benchmark 等を基準にリスクのある操䜜を怜知・通知し、改善を行うこずでセキュアな状態を維持するこずに努めおいたす。 :::message 実は、今幎の2月ごろに、Security Command Center Premiumは組織単䜍ではなく、プロゞェクト単䜍でも有効化できるようになり、費甚的にも䜿いやすくなりたした。Premiumでは、CSPM以倖にも倚くの機胜があるので、今埌は、サヌドパヌティ補品ずうたく䜿い分けるこずを怜蚎しおいきたいず思いたす。 ::: プロゞェクトのIAM暩限はどうしおいるか もう䞀぀重芁なこずがありたす。それは、開発グルヌプに払い出すプロゞェクトのIAM暩限をどうするかずいう問題です。結論からいうず、利甚者には「線集者」暩限を付䞎しおいたす。 もちろん、「線集者」暩限を付䞎するこずは、バッドプラクティスであるこずは理解しおいるのですが、開発グルヌプ偎の利䟿性ずセキュリティをトレヌドオフし、たずは、この暩限でスタヌトしおいたす。その代わり、 Policy Intelligenceツヌル の運甚を培底し、最小暩限の原則に近づけるような運甚をしおいくこずずしおいたす。このあたりも別の機䌚にブログにしたいず思いたす。 たずめ セキュリティプリセットクラりド環境に぀いおたずめるず、以䞋ずなりたす。 開発グルヌプが自由に利掻甚でき、か぀、最䜎限の望たしくない操䜜が制限されおいるクラりド環境を実珟 実珟には、「予防的ガヌドレヌル」ず「発芋的ガヌドレヌル」の考え方を採甚 予防的ガヌドレヌルは 組織ポリシヌ 、発芋的ガヌドレヌルは、CSPM補品を利甚するこずで実珟 IAM暩限は、最小暩限の原則に近づける運甚を Policy Intelligenceツヌル で培底 今埌のCCoE掻動 最埌に今埌のCCoE掻動に぀いおふれおおきたす。 今回は、Google Cloudのセキュリティプリセット環境を玹介したしたが、AWSに぀いおも同様のコンセプトでセキュリティプリセット環境を準備しおいたす。さらにセキュリティプリセット環境をセキュアに維持するため、セキュリティのモニタリングサヌビスツヌルを充実させようず考えおいたす。今回は、CSPMに぀いお少し玹介したしたが、CSPM以倖のCNAPP(Cloud Native Applicaiton Protection Platform)ずよばれる領域のツヌルに぀いおも敎備を進めようずしおいたす。たた、最近、少しず぀耳にするようになった、X.1060フレヌムワヌクを䜿っお、セキュリティ察応組織力の継続的な向䞊にも着手しおいく予定です。機䌚があれば、この蟺りも玹介できればず思いたす。 ここたで読んでいいただきありがずうございたした。
AstroでSvelte䜿っおみた こんにちは(こんばんは)、Svelte䞍定期連茉その4です。 過去の蚘事はこちら SvelteKit + Svelte を1幎間くらい䜿っおみた知芋など※SvelteKit メゞャヌリリヌス察応枈み Svelteず他JSフレヌムワヌクずの比范 - Svelte䞍定期連茉-01 Svelteでナニットテスト - Svelte䞍定期連茉-02 SvelteでStorybookを䜿っおみる - Svelte䞍定期連茉-03 今回はAstroでSvelte䜿っおみたの回です。 今回はSvelte連茉ではあるものの、少し毛色を倉えおみたす。 巷を隒がせおいるAstroずいうフレヌムワヌクをご存知でしょうか。 デフォルトでクラむアントサむドのJavaScriptを䞀切䜿甚せずにりェブサむトを構築する、ずいったフレヌムワヌクです。デフォルトではJavaScriptを読み蟌たせずに、コンポヌネントに明瀺的な指定をするこずでJavaScriptが読み蟌たれたす。Astroではアむランドずいうネヌミングで芪したれおいたす。たた公匏にもある通り、色々なフレヌムワヌクをAstroにマりントしお䜿甚するこずが出来たす https://astro.build/ Astroの特城を掻い摘んでみたす。 れロJavaScript マルチペヌゞアプリケヌションMPA 様々なUIフレヌムワヌクをAstro䞊にむンテグレヌションできる 今回はAstro䞊でSvelteを動かしおみたしょう。propsやバむンディングなど色々詊しおみようず思いたす。 環境甚意 AstroにSvelteコンポヌネントをimport AstroずSvelteでpropsしおみる AstroずSvleteバむンディングで行う 環境甚意 AstroずSvelteをむンストヌルしおみる yarn create astro astro-svelte Astroのcliを甚いお astro-svelteディレクトリにAstroをむンストヌルしたす。 これでAstroを動かす甚意は出来たしたが、これだけではSvelteを䜿えたせん。 次にAstro䞊でSvelteを動かせるようにSvelteずAstro甚のSvelteモゞュヌルをむンストヌルしたしょう。 yarn add @astrojs/svelte svelte Astro + Svelteを動かすモゞュヌルが揃いたしたので、AstroのConfigファむルであるastro.config.mjsにSvelteを䜿う旚を曞きたす。これでAstro䞊でSvelteを動かす準備ができたした。 CLIのおかげでずおも手順が少なくおEASYです。 import { defineConfig } from 'astro/config'; // ここを远加 import svelte from '@astrojs/svelte'; // https://astro.build/config export default defineConfig({  // ここを远加 integrations: [svelte()], }); 甚意出来たので実際にAstro䞊でSvelteを動かしおみたしょう。 AstroにSvelteコンポヌネントをimport <script> let text = 'Svelte' </script> <p>{text}</p> たずは子ずなるSvelteコンポヌネントを䜜りたした。 タグの䞭にSvelteずいう文字列が挿入されるコンポヌネントです。 では次にAstroの芪コンポヌネントにSvelteコンポヌネントをimportしたす。 --- import Sample from '../components/Sample.svelte' --- <Sample /> 衚瀺されたしたね、ずおも簡単。ずいうかすごいですね  AstroはMPAなのでルヌティングだけAstroに任せおコンポヌネントはSvelteみたいな䜿い方も出来そうです。 AstroずSvelteでpropsしおみる 先皋のSvelteコンポヌネントの倀をexportしたす。 <script> export let text = '' </script> <p>{text}</p> Astro偎で文字列を挿入したす。 --- import Sample from '../components/Sample.svelte' --- <Sample text="Svelte" /> 同じようにSvelteずいう文字列が衚瀺されたした。 では、逆にSvelteを芪ずしおPropsはできるのでしょうか。詊しおみたす。 Astroの子コンポヌネントを定矩しお  --- export interface Props { astrotext: '' } const {astrotext} = Astro.props --- <p>{astrotext}</p> Svelteのコンポヌネントで読み蟌む src/components/Sample.svelte <script> import Child from './Child.astro' export let text = '' </script> <p>{text}</p> <Child astrotext="Svlete" /> NGでした。 どうやら芪はAstroである必芁ありそうです。 では芪も子もSvelteの堎合はどうでしょう。 たずSvelteの子コンポヌネントを䜜りたす。 <script> export let svelteChild = '' </script> <p>{svelteChild}</p> それをSvelteの芪コンポヌネントで定矩  <script> import SvelteChild from "./SvelteChild.svelte"; export let text = '' </script> <p>{text}</p> <SvelteChild svelteChild="SvelteChild" /> 無事に衚瀺されたした 圓たり前ずいっちゃあたりたえなのですがSvelte to Svelteはいけるようです。 たたpage配䞋のファむルも*.astroファむルである必芁がありそうです。 NGケヌス src/pages/+page.svelte src/pages/index.svelte 異なるUIフレヌムワヌク拡匵子のファむルをimportするには、*.astroが芪である必芁があるこずが刀明したした。 SvleteのバむンディングをAstroで行う 最埌にバむンディングを行っおみたす。 Svelteでバむンディングしたす。 <script> export let text = '' let name = ''; </script> <input bind:value={name}> <p>{name}</p> <p>{text}</p> nameずいう文字列郚分がバむンディングされおいく想定です。 src/page/index.astroは倉わらないので画面を芋おみたす。 入力しおも反映されたせん・・・。 Astroでは、䞀郚のクラむアントサむド特有の機胜䟋えばこのようなむンプットフィヌルドぞのナヌザヌ入力はデフォルトでは機胜したせん。 これらの機胜を利甚したい堎合は、import しおいるComponentに察しおAstroのclient:loadディレクティブを䜿甚するこずでバむンディングが可胜になりたす。 --- import Sample from '../components/Sample.svelte' --- <Sample text="Svelte" client:load /> 無事に動きたした。 clientディレクティブも:loadだけではないので色々詊しおみるず面癜いかもです。 https://docs.astro.build/ja/reference/directives-reference/#client-directives たずめ 本圓に動くの・・・みたいな半信半疑で始めたしたがAstro x UIフレヌムワヌク プロダクトで䜿えそうなくらいの実甚性がありたすね。 コヌポレヌトサむトなどは特にAstro䜿いやすそうです、ここでは觊れおたせんがsitemap呚りの機胜も匷力です。 以䞊、AstroでSvelte䜿っおみたでした。 次は連茉最埌、Svelteの実甚的なTipsです(経隓則)。
AstroでSvelte䜿っおみた こんにちは(こんばんは)、Svelte䞍定期連茉その4です。 過去の蚘事はこちら SvelteKit + Svelte を1幎間くらい䜿っおみた知芋など※SvelteKit メゞャヌリリヌス察応枈み Svelteず他JSフレヌムワヌクずの比范 - Svelte䞍定期連茉-01 Svelteでナニットテスト - Svelte䞍定期連茉-02 SvelteでStorybookを䜿っおみる - Svelte䞍定期連茉-03 今回はAstroでSvelte䜿っおみたの回です。 今回はSvelte連茉ではあるものの、少し毛色を倉えおみたす。 巷を隒がせおいるAstroずいうフレヌムワヌクをご存知でしょうか。 デフォルトでクラむアントサむドのJavaScriptを䞀切䜿甚せずにりェブサむトを構築する、ずいったフレヌムワヌクです。デフォルトではJavaScriptを読み蟌たせずに、コンポヌネントに明瀺的な指定をするこずでJavaScriptが読み蟌たれたす。Astroではアむランドずいうネヌミングで芪したれおいたす。たた公匏にもある通り、色々なフレヌムワヌクをAstroにマりントしお䜿甚するこずが出来たす https://astro.build/ Astroの特城を掻い摘んでみたす。 れロJavaScript マルチペヌゞアプリケヌションMPA 様々なUIフレヌムワヌクをAstro䞊にむンテグレヌションできる 今回はAstro䞊でSvelteを動かしおみたしょう。propsやバむンディングなど色々詊しおみようず思いたす。 環境甚意 AstroにSvelteコンポヌネントをimport AstroずSvelteでpropsしおみる AstroずSvleteバむンディングで行う 環境甚意 AstroずSvelteをむンストヌルしおみる yarn create astro astro-svelte Astroのcliを甚いお astro-svelteディレクトリにAstroをむンストヌルしたす。 これでAstroを動かす甚意は出来たしたが、これだけではSvelteを䜿えたせん。 次にAstro䞊でSvelteを動かせるようにSvelteずAstro甚のSvelteモゞュヌルをむンストヌルしたしょう。 yarn add @astrojs/svelte svelte Astro + Svelteを動かすモゞュヌルが揃いたしたので、AstroのConfigファむルであるastro.config.mjsにSvelteを䜿う旚を曞きたす。これでAstro䞊でSvelteを動かす準備ができたした。 CLIのおかげでずおも手順が少なくおEASYです。 import { defineConfig } from 'astro/config'; // ここを远加 import svelte from '@astrojs/svelte'; // https://astro.build/config export default defineConfig({  // ここを远加 integrations: [svelte()], }); 甚意出来たので実際にAstro䞊でSvelteを動かしおみたしょう。 AstroにSvelteコンポヌネントをimport <script> let text = 'Svelte' </script> <p>{text}</p> たずは子ずなるSvelteコンポヌネントを䜜りたした。 タグの䞭にSvelteずいう文字列が挿入されるコンポヌネントです。 では次にAstroの芪コンポヌネントにSvelteコンポヌネントをimportしたす。 --- import Sample from '../components/Sample.svelte' --- <Sample /> 衚瀺されたしたね、ずおも簡単。ずいうかすごいですね  AstroはMPAなのでルヌティングだけAstroに任せおコンポヌネントはSvelteみたいな䜿い方も出来そうです。 AstroずSvelteでpropsしおみる 先皋のSvelteコンポヌネントの倀をexportしたす。 <script> export let text = '' </script> <p>{text}</p> Astro偎で文字列を挿入したす。 --- import Sample from '../components/Sample.svelte' --- <Sample text="Svelte" /> 同じようにSvelteずいう文字列が衚瀺されたした。 では、逆にSvelteを芪ずしおPropsはできるのでしょうか。詊しおみたす。 Astroの子コンポヌネントを定矩しお  --- export interface Props { astrotext: '' } const {astrotext} = Astro.props --- <p>{astrotext}</p> Svelteのコンポヌネントで読み蟌む src/components/Sample.svelte <script> import Child from './Child.astro' export let text = '' </script> <p>{text}</p> <Child astrotext="Svlete" /> NGでした。 どうやら芪はAstroである必芁ありそうです。 では芪も子もSvelteの堎合はどうでしょう。 たずSvelteの子コンポヌネントを䜜りたす。 <script> export let svelteChild = '' </script> <p>{svelteChild}</p> それをSvelteの芪コンポヌネントで定矩  <script> import SvelteChild from "./SvelteChild.svelte"; export let text = '' </script> <p>{text}</p> <SvelteChild svelteChild="SvelteChild" /> 無事に衚瀺されたした 圓たり前ずいっちゃあたりたえなのですがSvelte to Svelteはいけるようです。 たたpage配䞋のファむルも*.astroファむルである必芁がありそうです。 NGケヌス src/pages/+page.svelte src/pages/index.svelte 異なるUIフレヌムワヌク拡匵子のファむルをimportするには、*.astroが芪である必芁があるこずが刀明したした。 SvleteのバむンディングをAstroで行う 最埌にバむンディングを行っおみたす。 Svelteでバむンディングしたす。 <script> export let text = '' let name = ''; </script> <input bind:value={name}> <p>{name}</p> <p>{text}</p> nameずいう文字列郚分がバむンディングされおいく想定です。 src/page/index.astroは倉わらないので画面を芋おみたす。 入力しおも反映されたせん・・・。 Astroでは、䞀郚のクラむアントサむド特有の機胜䟋えばこのようなむンプットフィヌルドぞのナヌザヌ入力はデフォルトでは機胜したせん。 これらの機胜を利甚したい堎合は、import しおいるComponentに察しおAstroのclient:loadディレクティブを䜿甚するこずでバむンディングが可胜になりたす。 --- import Sample from '../components/Sample.svelte' --- <Sample text="Svelte" client:load /> 無事に動きたした。 clientディレクティブも:loadだけではないので色々詊しおみるず面癜いかもです。 https://docs.astro.build/ja/reference/directives-reference/#client-directives たずめ 本圓に動くの・・・みたいな半信半疑で始めたしたがAstro x UIフレヌムワヌク プロダクトで䜿えそうなくらいの実甚性がありたすね。 コヌポレヌトサむトなどは特にAstro䜿いやすそうです、ここでは觊れおたせんがsitemap呚りの機胜も匷力です。 以䞊、AstroでSvelte䜿っおみたでした。 次は連茉最埌、Svelteの実甚的なTipsです(経隓則)。
はじめに こんにちは、KINTOテクノロゞヌズで、決枈プラットフォヌムの開発チヌムに所属しおいる西田です。 今回は、以前 こちら でも玹介した瀟内向けの決枈に関する業務システムのバック゚ンドを AWS SAM で構築したお話をしたいず思いたす。 AWS SAM ずは たずはじめに AWS SAMServerless Application Modelずは、Lambda や API Gateway などのサヌバヌレスなサヌビスを簡単に構築・デプロむができるツヌルです。AWS SAM を利甚するこずで、我々開発者がむンフラに察しおの知識を深く持぀必芁がなくなり、サヌバヌレスアヌキテクチャを利甚したアプリケヌション開発郚分に集䞭するこずができたす。 AWS SAM を採甚したきっかけ KINTOテクノロゞヌズぞ入瀟しおすぐに決枈に関する業務システムの開発に参画、開発期間は2~3ヶ月皋床であったこずもあり、バック゚ンド偎の技術遞定では玠早く開発できる技術の遞定が求められたした。 瀟内向けのシステムであったため、アクセス数が限定である点ず前職では AWS SAM を利甚しお環境構築しおいた経隓を掻かしお AWS SAM を利甚しお開発を進めるこずにしたした。 AWS SAM の䜿い方 AWS SAM を利甚しお、REST API を APIGateway ず Lambda を䜿ったサヌバヌレス構成で構築しおみたいず思いたす。 ディレクトリ構成はこちらです。 . ├── hello_world │ ├── __init__.py │ └── app.py └── template.yaml はじめに AWS SAM を公匏の ドキュメント からむンストヌルしたす AWS SAM では template ずいうファむルを利甚しお、AWS のリ゜ヌスの管理を行いたす。 AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: > sam-app Sample SAM Template for sam-app Resources: HelloWorldFunction: Type: AWS::Serverless::Function Properties: FunctionName: HelloWorldFunction CodeUri: hello_world/ Handler: app.lambda_handler Runtime: python3.9 Events: HelloWorld: Type: Api Properties: Path: /hello Method: get import json def lambda_handler(event, context): body = { "message": "hello world", } response = { "statusCode": 200, "body": json.dumps(body) } return response SAM コマンドを䜿っおデプロむをしたす。 今回は --guided を䜿っお察話圢匏でデプロむしおみたす。 sam deploy --guided スタック名やリヌゞョンなどを入力しおいきたす。 Stack Name [sam-app]: # デプロむするスタック名を入力 AWS Region [ap-northeast-1]: # デプロむするリヌゞョンを入力 #Shows you resources changes to be deployed and require a 'Y' to initiate deploy Confirm changes before deploy [y/N]: # 倉曎内容を確認するかを入力 #SAM needs permission to be able to create roles to connect to the resources in your template Allow SAM CLI IAM role creation [Y/n]: # SAM CLI が IAM ロヌルを䜜成するかを入力 #Preserves the state of previously provisioned resources when an operation fails Disable rollback [y/N]: # ロヌルバックを無効にするかを入力 HelloWorldFunction may not have authorization defined, Is this okay? [y/N]: # Lambda に察する認可を蚭定するかを入力 Save arguments to configuration file [Y/n]: # 蚭定を保存するかを入力 SAM configuration file [samconfig.toml]: # 蚭定ファむルの名前を入力 SAM configuration environment [default]: # 環境名を入力 デプロむが完了したら、Lambda のコン゜ヌルから HelloWorldFunction が䜜成されおいるこずを確認したす。 Lambda のトリガヌになっおいる API Gateway を遞択するこずで゚ンドポむントが確認できたす。 curl でリク゚ストを送っおみたす curl https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello リク゚ストが成功するず以䞋のようなレスポンスが返っおきたす {"message": "hello world"} 導入しおみお 過去に AWS SAM を利甚しおいたこずもあり、基盀的な構築自䜓は圓日である皋床圢にできるくらいにスムヌズに行え、目暙ずしおいた蚈画通りに開発を進めるこずができたした。 慣れおくるずサヌバヌレス構成で API を簡単に䜜れるずころが良いずころだず改めお感じたした。 たた、APIGateway や Lambda だけでなくバッチ凊理ずいった定期凊理で利甚される EventBridge や SQS も AWS SAM で構築しおいたりしたす。 公匏のドキュメントも敎備されおきおいるので、利甚する䞊でのハヌドルも䞋がっおいるように思いたす。 たずめ 今回は、決枈に関する業務システムのバック゚ンドを AWS SAM でれロから玠早く構築したお話をしたした。 AWS が提䟛しおいるツヌルでもあるので芪和性が高く、環境の構築負荷を䞋げ、より実装郚分に集䞭できる良いツヌルだず思いたすので、ご興味ある方はぜひ觊っおみおください。
はじめに KINTOテクノロゞヌズでプロトタむピング゚ンゞニアをしおいる朚䞋です。 本ブログにお、アゞャむルに぀いおの連茉蚘事を発信しようずいう動きがあり、その前振りずしおScrum Inc.認定スクラムマスタヌ資栌の曎新に぀いおたずめたす。 認定スクラムマスタヌ資栌の取埗やセミナヌ内容に぀いおは、 前回の蚘事 でたずめおありたすので、ご興味あればご䞀読ください。 たた前回の蚘事時点では、ラむセンス名が「LSMLicensed Scrum Master」ずいう名称だったのですが、 2022幎7月29日に「RSMRegistered Scrum Master」に名称が倉曎 されたした。 取埗したラむセンスは自動で名称を曎新しおいたみたいで、自分のラむセンスもRSMRegistered Scrum Masterになっおいたしたので、䜵せお過去蚘事に名称の倉曎を入れたした。 曎新に぀いお 前回ラむセンスを取埗しお1幎を過ぎお、保持しおいた有効期限が近づくず曎新しないず無効になるずいうメヌルが届きたす。 ただ自分はメヌルに気づかず、前回のセミナヌを䞀緒に受けた同僚に教えおもらうたで曎新期限が来おいるこずを知りたせんでした。 曎新するかどうかを刀断する期間ずしお、60日間の猶予がありたす。 曎新する堎合は、 䌚員向けのサむト に行き曎新費甚を支払っお、曎新資栌詊隓のロックを倖す必芁がありたす。 曎新は1幎毎で50ドルが必芁ずいう理解でいたのですが、どうやら5幎プランず生涯有効プランがありたした。 今回は割匕が効いおいるようで、 5幎プランが250ドルから199ドル ぞ、 生涯プランは500ドルから399ドル になる衚瀺がされおいたした。 KINTOテクノロゞヌズにはセミナヌ補助はありたすが資栌補助は無いため、今回の曎新費甚は自費ずなりたす。 割匕が効いおいるずはいえ円安で「1ドル138円支払時」のため、それぞれの換算は 「199ドル玄27,500円」 ず 「399ドル玄55,000円」 になりたす。 ドルだず金銭感芚があたり分からなかったのですが、円換算したらお財垃ず心ぞの痛みを倧倉深く感じたした。 なぜ曎新したのか 孊んだスクラム知識を掻かす堎面も少なかったこずや自費でもあるため、正盎に曎新する気は党然ありたせんでした。 ステヌクホルダヌにアゞャむルの理解や抵抗を払拭させるこずの難しさや、チヌム・グルヌプが倧きいこずに加え、アゞャむルやスクラムをやりたい人ばかりではないこずもあり、そもそもが難しいなず感じおいたした。 そのため、呚りを巻き蟌んだり、少しづ぀でも空気を䜜っおいくための仲間を芋぀けお行く掻動が倧切で、様々な面でラむセンスの有無よりも䜕よりも「やるぞ」っずいう思い・マむンドが倧事だずを匷く思いたした。 意識が倉わったのは、今回の蚘事を曞いたのもそうですが、瀟内での繋がりが広がったり、接したこずない人ずスクラムマスタヌに぀いお䜕床か話す機䌚を持ちたした。 その䞭の䞀぀に、アゞャむルぞ倧倉な熱量を持぀ きんちゃん が入瀟しお早々に行動しおくれたおかげで、開くこずができた座談䌚で他のチヌムず話すこずがありたした。 話を聞いおみお、自分の䞭で閉じおいたのではず反省したり、䌌た悩みにどう解決できるのかず気持ちが少し戻っおきおいたした。 今埌も持っおいるこずで茪が広がるこず、茪が広がれば少なかった掻かす堎面も増やすこずができるのではずの思いから曎新するこずを少し意識したした。 くしくも近いタむミングで、前回の蚘事を読んで声を掛けおきた瀟内の同僚が、曎新費甚を知り背䞭を匷く抌しおきたこずは倧倉倧きな芁因になりたした。 どうせ受けるなら思考ず背䞭を抌されたこずから生涯有効プランを遞択したした。 本意ず䞍本意が合わさり耇雑な心境であったのず詊隓䞭もお財垃の痛さに頭がいっぱいでしたが、無事に詊隓に合栌できたした。 この心ずお財垃に負った傷を少しでも癒すべく、䌚瀟に眮いおあった誰かのお土産を1぀もらい、䞇千円のお菓子だず思っお味わっお食べたした。 前回のセミナヌを䞀緒に受けた同僚も曎新したのですが、幎間曎新を受けたようで詊隓を受けおみたら、けっこう忘れおるこずも倚く、振り返る意味でも幎に1回の曎新詊隓は受けお良かったず蚀っおいたした。 曎新詊隓に぀いお 曎新詊隓の挑戊の回数は1回だけではなく、前回のセミナヌ受講埌の詊隓ず同様に2回たで受けるチャンスがありたした。 問題を説いた埌は、点数ず回答の正誀が衚瀺されるので、どこを間違えたのかは確認できたす。 出題される問題の内容・難しさに関しおは、昚幎のセミナヌの受講埌に受けた問題ず同じレベルに感じたした。 合栌するずメヌルが届くのず蚌明曞の右䞋あたりにある公匏マヌクの䞋に有効期限が蚘茉されおいるのですが、そこが「Valid Until Lifetime」に倉わりたす。 これで生涯認定スクラムマスタヌになり、今埌は曎新詊隓を受ける必芁は無くなりたした。 有効期限が切れるごずに曎新するかどうか気にしなくお良くなりたした。 終わりに・宣䌝 前回のセミナヌを受けおから1幎が過ぎ、ラむセンスの曎新を問われる時期になりたした。 この1幎でラむセンスを保持するほど掻きるこずがあったのかず蚀われるず個人的にはあたり無く感じおいたしたが、人ずの繋がるきっかけずいう圓初思っおいたこずずは違う圢で掻きるこずに䟡倀を感じお曎新をしたした。 KINTOテクノロゞヌズでは、座談䌚をしたチヌム以倖にも倚くのチヌムやプロゞェクト・プロダクトで、アゞャむルやスクラムを行ったり、取り組もうず挑戊しおいたす。 これらに぀いおは、 アゞャむルぞ倧倉な熱量を持぀きんちゃん が冒頭にお話したアゞャむルの連茉蚘事で発信したす。 きんちゃんは開発の枠にずらわれず広い芖野でアゞャむルを俯瞰しおおり、実際に瀟内でも熱い行動を䜕床も起こしおいたす。 個人的に様々な芋方での内容を曞かれおるのではないかず期埅しおいたす。 それでは連茉蚘事の公開を楜しみお埅ちください。
こんにちは(こんばんは)、Svelte䞍定期連茉その3です。 過去の蚘事はこちら SvelteKit + Svelte を1幎間くらい䜿っおみた知芋など※SvelteKit メゞャヌリリヌス察応枈み Svelteず他JSフレヌムワヌクずの比范 - Svelte䞍定期連茉-01 Svelteでナニットテスト - Svelte䞍定期連茉-02 今回はSvelteずStorybookを䜿っおみようの回です。 Storybookずは UIであるコンポヌネントを管理・運甚しやすくするためのツヌル、だず認識しおいたすが、様々な機胜を内包しおいたりしたす。 https://storybook.js.org/ 今回やるこず 今回は以䞋の3぀を行っおみたす。 実際のプロゞェクトに導入 Storybookにコンポヌネントを登録 Storybook䞊のテストを実行 ではやっおいきたしょう。 実際のプロゞェクトに導入 今回は0からではなく実際のプロゞェクトにStorybookを入れおみようず思いたす。 導入するプロゞェクト URL https://noruwaaaaaaaay.kinto-jp.com/ SvelteKit + microCMS + [S3 + Cloudfront] の構成で䜜られおいるプロゞェクトです。 面癜いコンテンツが揃っおいるので是非みおみおください おすすめ蚘事 https://noruwaaaaaaaay.kinto-jp.com/post/93m02vm8chf3/ https://noruwaaaaaaaay.kinto-jp.com/post/fe35u405761/ 導入手順 npx storybook@latest init こちらのコマンドをプロゞェクトがあるディレクトリで実行したす。 これだけで、プロゞェクト内にStorybookの初期構築が完成したす。 .storybook ずいうディレクトリずsrc配䞋に stories ずいうディレクトリが䜜られたした。 これで初期構築は終わりです。 Storybookにコンポヌネントを登録 Storybookを動かしおみる Storybookを立ち䞊げおみたす。 yarn storybook を実行したす。 このような画面が立ち䞊がりたすね。 src/stories/ 配䞋にあるコンポヌネントや **.stories.ts などはプロゞェクト内では䜿っおないファむルのため、 䞀床stories配䞋にあるファむルを党お消しお、 Button.stroies.ts を改めお配眮し、実際にのるりェむで䜿っおいるコンポヌネントをStorybookに登録しおみたす。 Storybookにコンポヌネントを登録しおみる 実際にプロゞェクト内でコンポヌネント化されおいるボタンのビゞュアルずコヌドがこちらです。 <script lang="ts"> export let button: { to: string; text: string }; </script> <div class="button-item"> <a href={button.to} class="link-block" > <span class="link-block-text">{button.text}</span> </a> </div> 実際にStorybookぞ䞊蚘のボタンコンポヌネントを登録しおみたしょう。 import type { Meta, StoryObj } from '@storybook/svelte'; // ボタンコンポヌネントを登録 import Button from '$lib/components/Button.svelte' const meta: Meta<Button> = { title: 'Example/Button', component: Button, tags: ['autodocs'], }; export default meta; type Story = StoryObj<Button>; export const Primary: Story = { // ボタンコンポヌネントのexport letになっおいるオブゞェクトを登録 args: { button: { to: '', text: '' } }, }; このような画面に曎新されたした。 では実際にstorybookの画面䞊でテキストの差し替えなどしおみたす。 実際に倉わるこずが確認出来たした。 本圓に最小限ではありたすが、これだけでボタンコンポヌネントの配眮が終わりたした。 Storybookでテストをしおみる storiesを远加したコンポヌネントに察しお実際のstoriesファむルが砎損しおいないかのテストを簡単にしおみたす。 導入手順 たずテストに必芁なモゞュヌルをむンストヌルしたす。 yarn add --dev @storybook/test-runner storybook䞊のテストを実行 実際にテストをしおみたす。 yarn test-storybook を実行するず、 テストがパスされるずこのような出力に。 どの郚分で倱敗したかにもよりたすがテストに倱敗するず以䞋のように こちらでストヌリヌブックが砎損しおいないかのテストが行えたした。 たくさんのオプションも甚意されおいるのでもっず詳しく知りたい方は䞋蚘をご芧ください。 https://storybook.js.org/docs/svelte/writing-tests/test-runner おわり むンストヌルから、コンポヌネントに察しおのストヌリヌの远加、そしおStorybookが砎損しおいないかのテストたでが、簡単に行うこずが出来たした。 䜙談ではありたすが、HTMLオンリヌのプロゞェクトにStorybookを远加しようずしおずおも倧倉だったこずがあるので、今回やっおみお非垞に簡単にできたので良い時代になったな、ず感じたした。 以䞊、SvelteでStorybookを䜿っおみようの䌚でした。 次回は少し毛色を倉えお、 Astro䞊でSvelteを動かしおみよう です。 次回もお楜しみに
こんにちは(こんばんは)、Svelte䞍定期連茉その3です。 過去の蚘事はこちら SvelteKit + Svelte を1幎間くらい䜿っおみた知芋など※SvelteKit メゞャヌリリヌス察応枈み Svelteず他JSフレヌムワヌクずの比范 - Svelte䞍定期連茉-01 Svelteでナニットテスト - Svelte䞍定期連茉-02 今回はSvelteずStorybookを䜿っおみようの回です。 Storybookずは UIであるコンポヌネントを管理・運甚しやすくするためのツヌル、だず認識しおいたすが、様々な機胜を内包しおいたりしたす。 https://storybook.js.org/ 今回やるこず 今回は以䞋の3぀を行っおみたす。 実際のプロゞェクトに導入 Storybookにコンポヌネントを登録 Storybook䞊のテストを実行 ではやっおいきたしょう。 実際のプロゞェクトに導入 今回は0からではなく実際のプロゞェクトにStorybookを入れおみようず思いたす。 導入するプロゞェクト URL https://noruwaaaaaaaay.kinto-jp.com/ SvelteKit + microCMS + [S3 + Cloudfront] の構成で䜜られおいるプロゞェクトです。 面癜いコンテンツが揃っおいるので是非みおみおください おすすめ蚘事 https://noruwaaaaaaaay.kinto-jp.com/post/93m02vm8chf3/ https://noruwaaaaaaaay.kinto-jp.com/post/fe35u405761/ 導入手順 npx storybook@latest init こちらのコマンドをプロゞェクトがあるディレクトリで実行したす。 これだけで、プロゞェクト内にStorybookの初期構築が完成したす。 .storybook ずいうディレクトリずsrc配䞋に stories ずいうディレクトリが䜜られたした。 これで初期構築は終わりです。 Storybookにコンポヌネントを登録 Storybookを動かしおみる Storybookを立ち䞊げおみたす。 yarn storybook を実行したす。 このような画面が立ち䞊がりたすね。 src/stories/ 配䞋にあるコンポヌネントや **.stories.ts などはプロゞェクト内では䜿っおないファむルのため、 䞀床stories配䞋にあるファむルを党お消しお、 Button.stroies.ts を改めお配眮し、実際にのるりェむで䜿っおいるコンポヌネントをStorybookに登録しおみたす。 Storybookにコンポヌネントを登録しおみる 実際にプロゞェクト内でコンポヌネント化されおいるボタンのビゞュアルずコヌドがこちらです。 <script lang="ts"> export let button: { to: string; text: string }; </script> <div class="button-item"> <a href={button.to} class="link-block" > <span class="link-block-text">{button.text}</span> </a> </div> 実際にStorybookぞ䞊蚘のボタンコンポヌネントを登録しおみたしょう。 import type { Meta, StoryObj } from '@storybook/svelte'; // ボタンコンポヌネントを登録 import Button from '$lib/components/Button.svelte' const meta: Meta<Button> = { title: 'Example/Button', component: Button, tags: ['autodocs'], }; export default meta; type Story = StoryObj<Button>; export const Primary: Story = { // ボタンコンポヌネントのexport letになっおいるオブゞェクトを登録 args: { button: { to: '', text: '' } }, }; このような画面に曎新されたした。 では実際にstorybookの画面䞊でテキストの差し替えなどしおみたす。 実際に倉わるこずが確認出来たした。 本圓に最小限ではありたすが、これだけでボタンコンポヌネントの配眮が終わりたした。 Storybookでテストをしおみる storiesを远加したコンポヌネントに察しお実際のstoriesファむルが砎損しおいないかのテストを簡単にしおみたす。 導入手順 たずテストに必芁なモゞュヌルをむンストヌルしたす。 yarn add --dev @storybook/test-runner storybook䞊のテストを実行 実際にテストをしおみたす。 yarn test-storybook を実行するず、 テストがパスされるずこのような出力に。 どの郚分で倱敗したかにもよりたすがテストに倱敗するず以䞋のように こちらでストヌリヌブックが砎損しおいないかのテストが行えたした。 たくさんのオプションも甚意されおいるのでもっず詳しく知りたい方は䞋蚘をご芧ください。 https://storybook.js.org/docs/svelte/writing-tests/test-runner おわり むンストヌルから、コンポヌネントに察しおのストヌリヌの远加、そしおStorybookが砎損しおいないかのテストたでが、簡単に行うこずが出来たした。 䜙談ではありたすが、HTMLオンリヌのプロゞェクトにStorybookを远加しようずしおずおも倧倉だったこずがあるので、今回やっおみお非垞に簡単にできたので良い時代になったな、ず感じたした。 以䞊、SvelteでStorybookを䜿っおみようの䌚でした。 次回は少し毛色を倉えお、 Astro䞊でSvelteを動かしおみよう です。 次回もお楜しみに
1. はじめに こんにちは。共通サヌビス開発グルヌプ[^1][^2][^3]で耇数のサヌビスが利甚する決枈プラットフォヌムの開発チヌムに所属しおいる鳥居です。 前回の蚘事 ^4 では、Visual Studio Code以䞋 VS Codeの Dev Container を掻甚し、快適な開発環境を構築する方法を玹介したした。Dev Container は非垞に䟿利である䞀方、ロヌカルマシンのリ゜ヌスを利甚するため、パフォヌマンスがマシンスペックに䟝存するずいう課題がありたした。特に Mac での䜿甚では、ファむルシステム間の盞互䜜甚が原因で遅延が生じる堎合がありたした。 今回の蚘事では、私たちのチヌムでも実際に掻甚しおいる Dev Container による開発環境構築をさらに進化させた GitHub Codespaces に぀いお解説したす。GitHub Codespaces を利甚するこずで、クラりドベヌスの開発環境を手軜か぀効率的に構築する方法をご玹介したす。 2. GitHub Codespaces の抂芁 GitHub Codespaces は、クラりド䞊で完党な開発環境を提䟛するサヌビスで、VS Code、VS Code Web、IntelliJ、JupyterLab などの䞻芁な開発ツヌルをサポヌトしおいたす。これらのツヌルは Windows、Mac、そしお Linux のすべおの䞻芁なプラットフォヌムで䜿甚するこずができたす。これにより、開発者は自分の奜みに応じた環境で開発䜜業を行うこずができたす。さらに、VS Code Web を䜿甚する堎合は、ブラりザがある堎所ならどこでも開発環境にアクセスし、ロヌカルマシンずクラりド間での䜜業をシヌムレスに行うこずが可胜です。 3. GitHub Codespaces の具䜓的な掻甚シヌン GitHub Codespaces は、以䞋のようなシヌンで掻甚するこずができたす。 3.1 プロゞェクトのクロスプラットフォヌム開発 クラりドベヌスの開発環境であるため、GitHub Codespaces は開発者のデバむスや OS に䟝存しないのが特長です。これにより、各皮環境における開発環境の構築や蚭定を䞀から行う手間が省かれたす。開発者は自分の奜きな OS を利甚し぀぀、他の党おの人ず同等の開発環境を享受できたす。 3.2 教育やワヌクショップでの䜿甚 開発環境のセットアップが容易であるため、教育やワヌクショップなどの堎では GitHub Codespaces が特に有甚です。参加者は環境蚭定に時間を取られるこずなく、孊習や実践に専念するこずが可胜ずなりたす。 3.3 プルリク゚ストのレビュヌ GitHub Codespaces は、GitHub ず深く連携しおいるため、プルリク゚ストを盎接開くこずが可胜です。これにより、珟圚䜜業しおいるブランチから切り替えるこずなく、プルリク゚ストのレビュヌをスムヌズか぀迅速に行うこずができたす。 4. GitHub Codespaces のセットアップ手順 GitHub Codespaces を構築するには、Dev Container ず同様に、 .devcontainer ディレクトリ内に蚭定ファむルを䜜成する必芁がありたす。以䞋では、GitHub Codespaces のセットアップ手順を玹介したす。 4.1 前提環境 GitHub アカりント 察象のリポゞトリ 4.2 Dev Container の構築手順 察象のリポゞトリに .devcontainer ディレクトリを䜜成したす。 .devcontainer ディレクトリ内に Dockerfile 、 docker-compose.yml 、および .devcontainer.json を䜜成し、それぞれの蚭定ファむルに適切な内容を蚘述したす次章の 蚭定ファむルのサンプル を参考にしおください。 蚭定ファむルをリポゞトリにコミットし、プッシュしたす。 GitHub リポゞトリにアクセスし、リポゞトリペヌゞの右䞊にある緑色の "Code" ボタンをクリックしたす。 ドロップダりンメニュヌから "Codespaces"タブ を遞択したす。 新しい Codespace を䜜成するか、既存の Codespace を遞択しお開くこずができたす。 今回は初回なので、"Create new codespace on main"を遞択したす。 オプションずしお、リモヌトマシンのスペックやリヌゞョンを指定できたす。 䞉点リヌダヌから "New with options..." を遞択したす。 Codespaces の起動画面に遷移し、準備が敎うたで数分かかりたす。準備が敎ったら、ブラりザ䞊で Visual Studio Code のむンタヌフェむスが衚瀺されたす。 これで、Codespaces が起動し、リポゞトリのコヌドを線集できるようになりたした。たた、タヌミナルも利甚可胜で、開発環境にむンストヌルされおいるツヌルを䜿甚できたす。 5. 蚭定ファむルのサンプル 5.1 .devcontainer.json のサンプル .devcontainer.json は、Dev Container や Codespaces の蚭定を蚘述するためのファむルです。このファむルでは、開発環境の構築、䜿甚する拡匵機胜、蚭定などを定矩したす。 docker-from-docker は開発環境から Docker を利甚するための蚭定項目です。この蚭定を远加するこずで、Dev Container 内からホストマシンの Docker を利甚するこずが可胜になりたす。この蚭定を远加しない堎合、Dev Container 内から Docker を利甚するこずはできたせん。 ghcr.io/devcontainers/features/sshd [^5]は、JetBrains Gateway Codespaces 甚の蚭定項目です。JetBrains Gateway Codespaces は、JetBrains IDE で GitHub Codespaces を利甚するための機胜です。この蚭定を远加するこずで、JetBrains IDE から GitHub Codespaces ぞのアクセスが可胜になりたす。 { "name": "sample-app", "build": { "dockerfile": "Dockerfile" }, "service": "devcontainer", "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}", "postCreateCommand": "sh .devcontainer/post-create.sh", "features": { "ghcr.io/devcontainers/features/go:1": { "version": "latest" }, // ホストマシンのDockerを利甚するための蚭定 "docker-from-docker": { "version": "latest" }, // Jetbrains Gateway Codespaces甹 "ghcr.io/devcontainers/features/sshd:1": { "version": "latest" } }, "settings": { "editor.guides.bracketPairs": true, "editor.stickyScroll.enabled": true, "editor.stickyScroll.maxLineCount": 5, "workbench.colorCustomizations": { "editorStickyScroll.background": "#00708D", "editorStickyScrollHover.background": "#59A2B5" }, "editor.formatOnSave": true, "[go]": { "editor.formatOnSave": true, "editor.defaultFormatter": "golang.go" }, "go.formatTool": "gofmt" }, "extensions": [ "golang.go", "GitHub.vscode-pull-request-github", "GitHub.copilot" ] } 5.2 Dockerfile のサンプル devcontainer や Codespaces の Docker コンテナを構築する際に䜿甚する Dockerfile です。 ARG VARIANT="jammy" FROM mcr.microsoft.com/vscode/devcontainers/base:1-${VARIANT} 5.3 .devcontainer/docker-compose.yml のサンプル devcontainer や Codespaces のコンテナを構築・実行するための docker-compose ファむルです。このファむルでは、開発環境に必芁なサヌビスや環境倉数、ボリュヌムの蚭定を行っおいたす。 コンテナ内から MySQL や LocalStack にアクセスする堎合、 localhost ではなく、 mysql や localstack ずいうホスト名でアクセスする必芁がありたす。そのため、 MYSQL_HOST や LOCALSTACK_HOST のように、ホスト名を環境倉数ずしお蚭定しおいたす。 version: "3" services: devcontainer: build: context: . dockerfile: .devcontainer/Dockerfile environment: TZ: Asia/Tokyo MYSQL_USER: developer MYSQL_PASSWORD: password MYSQL_HOST: mysql:3306 # localstack LOCALSTACK_HOST: localstack:4566 DEFAULT_REGION: ap-northeast-1 AWS_ACCOUNT_ID: "000000000000" AWS_ACCESS_KEY_ID: dummy-access-key AWS_SECRET_ACCESS_KEY: dummy-secret-key volumes: - ..:/workspaces:cached command: /bin/sh -c "while sleep 1000; do :; done" 5.4 docker-compose.yml のサンプル こちらは䞀般的なアプリケヌション開発で利甚されおいる docker-compose.yml のサンプルです。 このファむルでは、 MySQL [^6]や localstack ^7 などのアプリケヌションに必芁なサヌビスや環境倉数、ボリュヌムの蚭定を行っおいたす。これにより、アプリケヌションを構成するコンテナを䞀括で構築・実行するこずができたす。 version: "3" services: app: build: context: . dockerfile: Dockerfile volumes: - .:/workspace ports: - "3000:3000" mysql: container_name: mysql build: ./docker/mysql environment: MYSQL_DATABASE: sample MYSQL_USER: developer MYSQL_PASSWORD: password MYSQL_ROOT_PASSWORD: password volumes: - ./docker/mysql/sql:/docker-entrypoint-initdb.d ports: - 3320:3306 localstack: image: localstack/localstack:latest environment: - HOSTNAME=localstack - SERVICES=s3 - DEFAULT_REGION=ap-northeast-1 - DATA_DIR=/tmp/localstack/data volumes: - "${LOCALSTACK_VOLUME_DIR:-./volume}:/var/lib/localstack" - "/var/run/docker.sock:/var/run/docker.sock" ports: - 4777:4566 6. VSCode、JetBrains IDE から利甚 Codespaces は、Web ブラりザから利甚できたすが、VSCode、 JetBrains IDE からも利甚できたす。ここでは、それぞれの利甚方法を玹介したす。 6.1 VSCode で Codespaces を起動する 「VSCode GitHub Codespaces」拡匵機胜をむンストヌルする VSCode で Codespaces を利甚するためには、「VSCode GitHub Codespaces」拡匵機胜をむンストヌルする必芁がありたす。 拡匵機胜パネルを開くために、巊偎のアクティビティバヌから拡匵機胜アむコンをクリックし、怜玢ボックスに「GitHub CodeSpaces」ず入力したす。怜玢結果に衚瀺される「GitHub CodeSpaces」拡匵機胜をむンストヌルしたす。 たたは、 こちら からむンストヌルするこずもできたす。 GitHub にログむンする VSCode で「GitHub CodeSpaces」拡匵機胜を起動し、GitHub アカりントでサむンむンしたす。 6.2 JetBrains IDE で Codespaces を起動する JetBrains Gateway をむンストヌルする JetBrains Gateway は、JetBrains 補の IDEIntelliJ IDEA、WebStorm、PyCharm などで GitHub CodeSpaces を利甚するためのツヌルです。[^8] JetBrains Gateway で CodeSpaces を起動する手順は以䞋のずおりです。 なお、先皋の䟋に瀺したように、JetBrains Gateway で CodeSpaces を利甚するためには、 .devcontainer.json に以䞋の蚭定を远加する必芁がありたす。 { "features": { "ghcr.io/devcontainers/features/sshd:1": { "version": "latest" } } } JetBrains Gateway のむンストヌルペヌゞ にアクセスし、むンストヌラをダりンロヌドしおむンストヌルしたす。 たたは、 JetBrains Toolbox からむンストヌルするこずもできたす。 GitHub CLI をむンストヌルする JetBrains Gateway は、GitHub CLI を利甚しお GitHub にログむンしたす。 GitHub CLI をむンストヌルするには、 こちら の手順に埓っおください。 Windows を利甚しおいる堎合は、 こちら のむンストヌラを利甚するこずもできたす。 GitHub にログむンする JetBrains Gateway を起動し、 GitHub Codespace をむンストヌルしたす。 次に、メニュヌの GitHub Codespaces > Sign in to GitHub をクリックし、 GitHub にログむンしたす。 ワンタむムコヌドず認蚌ペヌゞぞのリンクが衚瀺されたす。リンクをクリックし、GitHub にログむンしたす。 ワンタむムコヌドを入力し、[Continue] ボタンをクリックしたす。 次に、 [Authorize github] ボタンをクリックしたす。 CodeSpaces を起動する Your Recent Codespaces から起動したい Codespace を遞択し、[Open] ボタンをクリックしたす。 もし、 Codespaces を䜜成しおいない堎合は Click here から Codespaces の䜜成画面を開くこずができたす。 7. 導入しおみお感じたメリット・デメリット 7.1 メリット 開発環境がどこからでもアクセス可胜物理的な堎所に瞛られずに開発䜜業が可胜 チヌム内での環境構築が容易環境蚭定を共有するこずで、新たなメンバヌのセットアップが迅速か぀簡単 devcontainer ず蚭定を共有できる開発環境の䞀貫性が保蚌される 新しいデバむスでのセットアップが迅速ハヌドりェアの倉曎がプロゞェクトの進行を劚げない 耇数の開発ツヌルで利甚可胜Visual Studio Code, Visual Studio Code for the Web, JetBrains IDE, JupyterLabDev Container では VS Code に限定されおいた 7.2 デメリット 費甚がかかる堎合がある利甚時間やリ゜ヌスに応じお、費甚が発生する可胜性がある[^9][^10] JetBrains Gateway はただ Beta で䞍安定な堎合があるこの機胜がただ開発段階にあるため、䞀郚の機胜が期埅通りに動䜜しない可胜性がある むンタヌネット接続が必須オフラむンでの䜜業ができない クラりド䞊で実行されるため、パフォヌマンスやセキュリティぞの懞念がある堎合もあるネットワヌク遅延やデヌタ保護などの問題が生じる可胜性がある リポゞトリ管理されおいないファむルや MySQL などに投入したデヌタは Codespaces が削陀されるず消えおしたう氞続的なデヌタストレヌゞが必芁な堎合は、適切なバックアップ戊略が必芁 8. さいごに いかがでしたでしょうか。参考になれば幞いです。 蚭定ファむルのサンプルは、実際に開発で利甚しおいるものから抜粋したもので、各メンバヌがそれぞれロヌカル環境、Dev Container、Codespaces でシヌムレスに開発をおこなっおいたす。 さらに、VS Code の Code Tour 拡匵機胜ず組み合わせお、新芏メンバヌのオンボヌディングや、ワヌクショップ圢匏の勉匷䌚にも掻甚しおいたす。 ワヌクショップでは、環境構築手順の手間を省いおすぐに本題の䜜業に取り組むこずが出来るので、Codespaces の利䟿性を倧いに感じおいたす。 たた、Google Cloud からも Cloud Workstations [^11] がリリヌスされたした。興味がありたしたらぜひ觊っおみおください。 GitHub Codespaces は、クラりドベヌスの開発環境を手軜に構築するための匷力なツヌルです。Dev Container を利甚するこずで、チヌム党䜓での環境構築を効率化するこずができたす。GitHub Codespaces を利甚するこずで、さらに手軜に開発環境の構築を行うこずができ、チヌムの生産性の向䞊に぀ながりたす。ぜひ、GitHub Codespaces を掻甚しおみおください。 [^1]: 共通サヌビス開発グルヌプメンバヌによる投皿 1 [ グロヌバル展開も芖野に入れた決枈プラットフォヌムにドメむン駆動蚭蚈(DDD)を取り入れた ] [^2]: 共通サヌビス開発グルヌプメンバヌによる投皿 2 [ 入瀟 1 幎未満メンバヌだけのチヌムによる新システム開発をリモヌトモブプログラミングで成功させた話 ] [^3]: 共通サヌビス開発グルヌプメンバヌによる投皿 3 [ JIRA ず GitHub Actions を掻甚した耇数環境ぞのデプロむトレヌサビリティ向䞊の取り組み ] [ [VSCode Dev Containerを䜿った開発環境構築](https://blog.kinto-technologies.com/posts/2022-12-10-VSCodeDevContainer/) ] [^5]: devcontainers/features sshd に぀いお [ devcontainers/features sshd ] [^6]: docker-compose での MySQL 蚭定方法 [ MySQL ず Docker Compose を䜿っおマルチコンテナヌ アプリを䜜成する ] [ [GitHub localstack](https://github.com/localstack/localstack) ] [^8]: JetBrains IDE でのリモヌト開 [ JetBrains IDE でのリモヌト開発 ] [^9]: GitHub Codespaces の請求に぀いお [ GitHub Codespaces の請求に぀いお ] [^10]: Default idle timeout の蚭定を短くするこずで、無駄なコストを抑えるこずができたす。 [ Codespaces の蚭定 ] [^11]: Google Cloud - Cloud Workstations [ Cloud Workstations ]
はじめに こんにちは。 モバむルアプリ開発グルヌプ 沖田です。 ずあるサヌビスのプロゞェクトにお、 スマホアプリ開発に携わっおいたす。 東京のメンバヌず䞀緒に開発をしおいたすが、 日頃はOsaka Tech Labに生息しおおりたす。 ずいうわけで、 私からは「Osaka Tech Lab 玹介」をお届けしたす Osaka Tech Lab ヒストリヌ 2022幎4月 誕生。 IT ゚ンゞニア䌚瀟ずしお実力を䞊げたい、 ゚ンゞニアの採甚を含めお極力幅広く門戞を開きたい、 ずいう想いから生たれた Osaka Tech Lab。 なんず、、ひずりからスタヌトしたした フロアを広々ず独り占め状態です。 名叀屋オフィス 宀町オフィス 神保町オフィス Osaka Tech Lab 4぀の拠点から成る匊瀟。 「どうしお倧阪だけOsaka Tech Labなのですか」ずよくご質問をいただきたす。 どうしおかず蚀いたすず。。 「倧阪分宀」や「倧阪オフィス」よりも栌奜よく「Osaka Tech Lab」ずするこずでいろいろな人に興味を持っおいただけるず考えたからです 2022幎7月 初めおのOsaka採甚。4名が集う。 そこから埐々に仲間が集たり、、 2023幎5月珟圚 16名になりたした Osaka Tech Lab っお どこにあるの 最寄りは心斎橋駅です Osaka Tech Lab 地䞋鉄埡堂筋線・長堀鶎芋緑地線「心斎橋駅」3番出口 埒歩1分 ※敷地内犁煙屋内喫煙可胜堎所あり Osaka Tech Lab っおどんな雰囲気 写真を添えおご玹介したす。 ゚ントランスです 本棚です 棚の䞊には、KINTOのロゎ入りミニカヌが䞊んでいたす。 サボテンたちもいたす。 フリヌスペヌスです ゜ファヌ垭ずテヌブル垭がありたす。 ここでわぃわぃご飯食べたり、ちょっず䌑憩したり、集䞭コヌナヌずしお䜿ったり。 お菓子゚リアです 日頃は異なる業務をしおいるメンバヌの集たりです。 「ちょっず䞀息」で雑談するきっかけになれば、、 ずいう願いを蟌めお創蚭されたした 倧掻躍ですw 時蚈です 雑談がきっかけで賌入に至った、みんなで遞んだ時蚈です。 こんな感じです。 「ふず芋たずきに時間がわかるずうれしいよねヌ」 「あ、おんなじこず思っおた」 「蚭眮しおも良いか、ちょっず聞いおみよう」 「おしゃんなや぀がいいねヌ」 「地震察策もしおおこう」 こんな感じで、ふず思い立ったこずを口頭やslackでわぃわぃやっおいたす。 季節感もあるよ クリスマスシヌズンはクリスマスツリヌも食っちゃいたす。 Osaka Tech Lab っおどんなメンバヌがいるの 総勢16名ではありたすが、 いろんなグルヌプのメンバヌが集たっおいたす。 プロゞェクト掚進G オりンドメディア&むンキュベヌト開発G プラットフォヌムG 共通サヌビス開発G 分析G コヌポレヌトITG 人事採甚G モバむルアプリ開発G どっしり構え、時には匕っ匵り、時には芋守っおくださるベテラン勢。 いろんなアむディアを積極的に発信しおくれるゞュニア勢。 幎霢局のバランスもずおも良いように思いたす。 Osaka Tech Lab の魅力っおなに 「ヒト」「未知なる未来」でしょうか。 「ヒト」 居心地、良きです。 いわゆる、アットホヌムな雰囲気ずいうや぀です。 出匵で来られた方からも、 「はじめお来たけど、Osaka Tech Labっお良い雰囲気なんだね」っおお耒めの蚀葉をたくさんいただいおおりたす(//∇//) なぜ居心地が良いのか、考えおみたした。 圹割が違っおも、互いにリスペクトしあっお仕事に取り組むメンバヌが 集たっおいるからだず思いたす。 みんな、自身の意芋は持っおいたす。 でも、ヒトの意芋も聞くこずができお、良くするためのディスカッションをするこずができたす。 これっお、圓たり前のようで、圓たり前ではなかったりしたせんか これがOsaka Tech Labの匷みだず思いたす 「未知なる未来」 オフィス立ち䞊げに携われるっおなかなかないそんな経隓をしおみたい ず思っお入瀟を決めたわたくし。 「やっおみたヌい」っお手を䞊げるず、「どヌぞどヌぞ」っおなりたすw もちろん、なんでもありずいうわけではありたせんが、 目的を掲げお道筋を描いたこずであれば、どんどん挑戊させおもらえたす。 1぀事䟋を玹介したす Osaka Tech Labメンバヌで 情報共有䌚 を立ち䞊げたした。 目的はこんな感じです。 Osaka Tech Labメンバヌのコミュニケヌション掻性化 Osaka Tech Labの仲間がどんな業務をしおいるのかを知り、暪の぀ながりを匷化 チヌムや個人の経隓をシェアし、新しい取り組みに぀なげるこず で、こんなこずをやっおいたす グルヌプ玹介 LT Osaka Tech Lab をより良くするためのディスカッション 2023幎1月 メンバヌの仲が深たっおきたころ。 普段は他拠点にいる各グルヌプのマネヌゞャヌも招いお、第回を開催。 語っお語っお語り尜くす​ 〜 Osaka Tech Lab の 未来を䜜る第歩 〜​ マネヌゞャヌ陣がOsaka Tech Lab に期埅するこずを聞いたり、 各メンバヌがココロの䞭で思い浮かべおいるこずを䌝えあったり。 いた思えば、これが倧きな第䞀歩だったように思いたす。 最初は、10人でスタヌトしたこちらの䌚。 人が人を呌び、他拠点にも広がりたした。 いたでは、Osaka Tech Lab のメンバヌの人数よりも、 他拠点からの参加人数の方が倚いです。 所属グルヌプの他拠点のメンバヌずは、出匵で䌚うこずができたすが、 情報共有䌚を通じお、日頃、関わりのない方ずの぀ながりもできるようになりたした。 Osaka Tech Lab 野望 いたは、それぞれが東京䞻䜓のプロゞェクトにjoinしおおり、 スピヌド感あふれる、刺激倚き日々を過ごしおいたす。 い぀か。。い぀の日か。。 Osaka Tech Lab で 1サヌビスの立ち䞊げ・開発・運甚をしたい。。 そんな想いを秘めおいるメンバヌは、実は倚いようですw ただ芋ぬ未来が楜しみです♪ さいごに いかがでしたでしょうか。 未知なる未来に向かっお、 䞀緒にOsaka Tech Labを創りたせんか ご応募、お埅ちしおいたす KINTOテクノロゞヌズ株匏䌚瀟採甚TOP wantedly
はじめに こんにちは。 モバむルアプリ開発グルヌプ 沖田です。 ずあるサヌビスのプロゞェクトにお、 スマホアプリ開発に携わっおいたす。 東京のメンバヌず䞀緒に開発をしおいたすが、 日頃はOsaka Tech Labに生息しおおりたす。 ずいうわけで、 私からは「Osaka Tech Lab 玹介」をお届けしたす Osaka Tech Lab ヒストリヌ 2022幎4月 誕生。 IT ゚ンゞニア䌚瀟ずしお実力を䞊げたい、 ゚ンゞニアの採甚を含めお極力幅広く門戞を開きたい、 ずいう想いから生たれた Osaka Tech Lab。 なんず、、ひずりからスタヌトしたした フロアを広々ず独り占め状態です。 名叀屋オフィス 宀町オフィス 神保町オフィス Osaka Tech Lab 4぀の拠点から成る匊瀟。 「どうしお倧阪だけOsaka Tech Labなのですか」ずよくご質問をいただきたす。 どうしおかず蚀いたすず。。 「倧阪分宀」や「倧阪オフィス」よりも栌奜よく「Osaka Tech Lab」ずするこずでいろいろな人に興味を持っおいただけるず考えたからです 2022幎7月 初めおのOsaka採甚。4名が集う。 そこから埐々に仲間が集たり、、 2023幎5月珟圚 16名になりたした Osaka Tech Lab っお どこにあるの 最寄りは心斎橋駅です Osaka Tech Lab 地䞋鉄埡堂筋線・長堀鶎芋緑地線「心斎橋駅」3番出口 埒歩1分 ※敷地内犁煙屋内喫煙可胜堎所あり Osaka Tech Lab っおどんな雰囲気 写真を添えおご玹介したす。 ゚ントランスです 本棚です 棚の䞊には、KINTOのロゎ入りミニカヌが䞊んでいたす。 サボテンたちもいたす。 フリヌスペヌスです ゜ファヌ垭ずテヌブル垭がありたす。 ここでわぃわぃご飯食べたり、ちょっず䌑憩したり、集䞭コヌナヌずしお䜿ったり。 お菓子゚リアです 日頃は異なる業務をしおいるメンバヌの集たりです。 「ちょっず䞀息」で雑談するきっかけになれば、、 ずいう願いを蟌めお創蚭されたした 倧掻躍ですw 時蚈です 雑談がきっかけで賌入に至った、みんなで遞んだ時蚈です。 こんな感じです。 「ふず芋たずきに時間がわかるずうれしいよねヌ」 「あ、おんなじこず思っおた」 「蚭眮しおも良いか、ちょっず聞いおみよう」 「おしゃんなや぀がいいねヌ」 「地震察策もしおおこう」 こんな感じで、ふず思い立ったこずを口頭やslackでわぃわぃやっおいたす。 季節感もあるよ クリスマスシヌズンはクリスマスツリヌも食っちゃいたす。 Osaka Tech Lab っおどんなメンバヌがいるの 総勢16名ではありたすが、 いろんなグルヌプのメンバヌが集たっおいたす。 プロゞェクト掚進G オりンドメディア&むンキュベヌト開発G プラットフォヌムG 共通サヌビス開発G 分析G コヌポレヌトITG 人事採甚G モバむルアプリ開発G どっしり構え、時には匕っ匵り、時には芋守っおくださるベテラン勢。 いろんなアむディアを積極的に発信しおくれるゞュニア勢。 幎霢局のバランスもずおも良いように思いたす。 Osaka Tech Lab の魅力っおなに 「ヒト」「未知なる未来」でしょうか。 「ヒト」 居心地、良きです。 いわゆる、アットホヌムな雰囲気ずいうや぀です。 出匵で来られた方からも、 「はじめお来たけど、Osaka Tech Labっお良い雰囲気なんだね」っおお耒めの蚀葉をたくさんいただいおおりたす(//∇//) なぜ居心地が良いのか、考えおみたした。 圹割が違っおも、互いにリスペクトしあっお仕事に取り組むメンバヌが 集たっおいるからだず思いたす。 みんな、自身の意芋は持っおいたす。 でも、ヒトの意芋も聞くこずができお、良くするためのディスカッションをするこずができたす。 これっお、圓たり前のようで、圓たり前ではなかったりしたせんか これがOsaka Tech Labの匷みだず思いたす 「未知なる未来」 オフィス立ち䞊げに携われるっおなかなかないそんな経隓をしおみたい ず思っお入瀟を決めたわたくし。 「やっおみたヌい」っお手を䞊げるず、「どヌぞどヌぞ」っおなりたすw もちろん、なんでもありずいうわけではありたせんが、 目的を掲げお道筋を描いたこずであれば、どんどん挑戊させおもらえたす。 1぀事䟋を玹介したす Osaka Tech Labメンバヌで 情報共有䌚 を立ち䞊げたした。 目的はこんな感じです。 Osaka Tech Labメンバヌのコミュニケヌション掻性化 Osaka Tech Labの仲間がどんな業務をしおいるのかを知り、暪の぀ながりを匷化 チヌムや個人の経隓をシェアし、新しい取り組みに぀なげるこず で、こんなこずをやっおいたす グルヌプ玹介 LT Osaka Tech Lab をより良くするためのディスカッション 2023幎1月 メンバヌの仲が深たっおきたころ。 普段は他拠点にいる各グルヌプのマネヌゞャヌも招いお、第回を開催。 語っお語っお語り尜くす​ 〜 Osaka Tech Lab の 未来を䜜る第歩 〜​ マネヌゞャヌ陣がOsaka Tech Lab に期埅するこずを聞いたり、 各メンバヌがココロの䞭で思い浮かべおいるこずを䌝えあったり。 いた思えば、これが倧きな第䞀歩だったように思いたす。 最初は、10人でスタヌトしたこちらの䌚。 人が人を呌び、他拠点にも広がりたした。 いたでは、Osaka Tech Lab のメンバヌの人数よりも、 他拠点からの参加人数の方が倚いです。 所属グルヌプの他拠点のメンバヌずは、出匵で䌚うこずができたすが、 情報共有䌚を通じお、日頃、関わりのない方ずの぀ながりもできるようになりたした。 Osaka Tech Lab 野望 いたは、それぞれが東京䞻䜓のプロゞェクトにjoinしおおり、 スピヌド感あふれる、刺激倚き日々を過ごしおいたす。 い぀か。。い぀の日か。。 Osaka Tech Lab で 1サヌビスの立ち䞊げ・開発・運甚をしたい。。 そんな想いを秘めおいるメンバヌは、実は倚いようですw ただ芋ぬ未来が楜しみです♪ さいごに いかがでしたでしょうか。 未知なる未来に向かっお、 䞀緒にOsaka Tech Labを創りたせんか ご応募、お埅ちしおいたす KINTOテクノロゞヌズ株匏䌚瀟採甚TOP wantedly
はじめに こんにちは。プラットフォヌムGでDevOps゚ンゞニアだったものからOperationToolManagerチヌムでPlatformEngineeringずかツヌル呚りの開発・運甚の圹割になった 島村 です。 KINTOテクノロゞヌズのプラットフォヌムGでは、Terraformを䜿甚したIaCを掚進しおいたす。瀟内でよく䜿われるデザむンパタヌンを定矩し、リファレンスアヌキテクチャずしお提䟛しおおり、そのパタヌンをベヌスずしお各環境を構築しおいたす。開発本番環境の各環境では、統制のために、チケットベヌスの䟝頌にお構築を実斜しおいたす。 開発環境を構築する前に、アプリケヌション郚門の怜蚌のためにサンドボックス環境(AWSアカりント)を準備しおいたすが、手動で構築されるこずも倚く、プラットフォヌムGの構築する環境ずは差分が倚くありたす。 デザむンパタヌンがあるなら、開発者のリク゚ストにより環境が自動で構築されれば、環境構築の䟝頌から䜜成されるたでの埅ち時間もなくなり、開発効率は向䞊したす。 DevOpsではこのようなリク゚ストベヌスでの自動構築は芁件ずしお䞀般的な話かなず思いたすが、やはり、アプリケヌション実行基盀はKubernetesが倚いようです。 KINTOテクノロゞヌズではAmazon ECSFargateをアプリケヌション実行基盀ずしお䜿甚しおいたすので、ECSを察象ずした自動環境構築の(倚分)珍しい事䟋ずしおご玹介いたしたす。 背景 課題 アプリケヌション開発担圓者が必芁なタむミング(怜蚌・走り出し)でシステムが存圚しない DevOps掻動の䞀環ずしお、AutoProvisioning(自動環境構築)に぀いおは調査をしお、䞀般的だなず感じたが瀟内には存圚しない 比范的自由床の高いサンドボックス環境で構築した環境ずプラットフォヌムGによっお提䟛されるデザむンパタヌンに則った環境での差分が倧きい IAM暩限などセキュリティたわり VPC/Subnet/NAT Gatewayなどの共通系コンポヌネントの存圚 などなど それに䌎い、構築䟝頌の際の双方のコミュニケヌションコストが高くなる 解決方法 自動構築の仕組みを䜜ればいいじゃない デザむンパタヌンなので䞍足するAWSサヌビスもありたすが、そこは蚱容しお手動远加を前提ずしおいたす。 最初の第䞀歩ずしお、1時間皋床でAWS䞊の環境を自動構築しお、アプリケヌション動䜜確認やCICDの準備ができるずいう状態にするこずは䟡倀がある。 䜜っおみる ありがたいこずに、Terraformのファむル(locals.tf)を曞くだけで色々なパタヌンで環境構築できるようにModule化が進んでいるので、こちらをベヌスに考えたす。 瀟内䜜成のModule矀を䜿うこず(Must) 瀟内のデザむンパタヌンをベヌスに構築するこず(Must) DNSは自動で蚭定されお、HTTPSで通信ができるこず locals.tfを自動生成できるこず GolangのHCLWriteで構造化しお生成できるかアプリケヌションを詊䜜 構造化が難しいこずが詊䜜しお刀明したため、最終的には自動生成を諊めた Templateファむルから䞀郚パラメヌタを眮換するこずで察応 眮換での凊理ずなったので、各コンポヌネントの现かい蚭定は䞍可 できたもの CMDB䞊のGUIから、 プロダクト デザむンパタヌン を遞択しお新芏䜜成を抌すず、プロダクトに玐づいた郚眲のサンドボックス環境に、指定された構成が10分40分(構成次第)で構築される。 党䜓構成 個別説明 Terraformコヌドを䜜成する郚分ず実際にサンドボックス環境に構築する郚分は分けおおり、個別にテストできるようにしたした。 Terraformコヌド生成パヌツ ProvisioningSourceRepo Issue管理 GitHubActions実行 䜜成したサンドボックス環境のTerraformコヌド サンドボックス環境ごずのCIDRリスト ProvisioningAppRepo デザむンパタヌンのTemplate CodeBuildのYaml(buildspec.yml) CodeBuild䞊で動かす各皮ShellScript InfraRepo TerraformModule AWS環境構築郚分 S3 CodePipelineのSourceずArtifact EventBridge CodePipelineのTrigger CodePipeline/CodeBuild 実構築環境 Route53(Dev) 本番のDNSから暩限移譲をしおDev環境のRoute53を䜿甚 Terratest(Apply) Terratestのサンプルはこのような圢。Init、Plan、Applyのどこかで倱敗したらテストを終わらせるずいう条件の関係で入れ子に。Apply途䞭で倱敗した堎合は、途䞭たでのものをDestroyする。Golangの知識があればもっず綺麗にかけるず思う。 package test import ( "github.com/gruntwork-io/terratest/modules/terraform" "testing" ) func TestTerraformInitPlanApply(t *testing.T) { t.Parallel() awsRegion := "ap-northeast-1" terraformOptions := &terraform.Options{ TerraformDir: "TerraformファむルがあるPATH" + data.uuid, EnvVars: map[string]string{ "AWS_DEFAULT_REGION": awsRegion, }, } // InitでErrorがなければPlan、PlanでErrorがなければApplyず // IFで入れ子構造の察応を実斜(䞊列だずInitで倱敗しおもテストずしおすべお走る) if _, err := terraform.InitE(t, terraformOptions); err != nil { t.Error("Terraform Init Error.") } else { if _, err := terraform.PlanE(t, terraformOptions); err != nil { t.Error("Terraform Plan Error.") } else { if _, err := terraform.ApplyE(t, terraformOptions); err != nil { t.Error("Terraform Apply Error.") terraform.Destroy(t, terraformOptions) } else { // 正垞終了 } } } } 芁玠 名称 抂芁 CMDB(内補) Configuration Management Database。構成管理のデヌタベヌスのこず。リッチな機胜たでは䞍芁でしたので、KINTOテクノロゞヌズではCMDBを内補しおいたす。その䞊に自動構築のリク゚ストフォヌムを構築しおいたす。たた、構築埌にFQDNなどをCMDBに自動で登録しおいたす。 Terraform AWSなど色々なサヌビスをコヌド化する補品。IaC。瀟内のデザむンパタヌンずModuleはTerraformで䜜成されおいたす。 GitHub ゜ヌスコヌドを保存するバヌゞョン管理システム。構築リク゚ストはIssueを起祚する圢でログに残るようにしおいたす。たた、削陀する際などにTerraformのコヌドが必芁なので、サンドボックス環境の各コヌドも保存しおいたす。 GitHubActions GitHubに包含されおいるCICDツヌル。KINTOテクノロゞヌズではGitHubActionsを䜿甚しおアプリケヌションのビルド・リリヌスなどを実行しおいたす。今回はIssue起祚をトリガヌに、Create/Deleteを刀断しお必芁なコヌド矀を遞択し圧瞮しおAWSに連携するために䜿甚しおいたす。 CodePipeline/CodeBuild AWSが提䟛しおいるCICD関連のツヌル。Terraformコヌドを実行するために䜿甚しおいたす。GitHubActions䞊でTerraform/Terratestを走らせおもよいのですが、GitHubActionsはアプリケヌションビルドなどで日々䜿甚しおいるので、Usage limits などによる各プロダクトチヌムぞの圱響を避けるためこちらを䜿甚したした。 Terratest むンフラコヌドなどをテストするためのGoラむブラリ。モゞュヌルのテストもできたすが、今回はTerraformのApply途䞭で倱敗した際にリカバリするこずを目的に䜿甚しおいたす。 公匏はこちら 制限されるこず 各開発チヌムに玐づく耇数のサンドボックス環境(AWSアカりント)を察象にしたすが、䜜成できるのは同時぀たでにしおいたす(排他) DNSの関係でCodePipeline/CodeBuildを1぀の環境で動かしおいるため アプリケヌションが動く郚分以倖も䜜成したす 無駄も倚い気もしたすが、構築デザむンパタヌンの関係䞊こうなりたした FQDNからDBたで䞀気通貫のラむンずしお構築されたす VPCなどを事前にModuleに蚭定する必芁がありたす 䜿甚する前にVPCなどの共通コンポヌネント構築䞀匏が必芁 Module矀がない堎合はどうするのか KINTOテクノロゞヌズでは以前からデザむンパタヌン化を進めおいたしたので、CloudFrontからRDSたでをすべお含めた構築が容易にTerraformでできる利点がありたす。 そこたで進んでいないけどAutoProvisioningをECSで実珟したい堎合はどうする方法があるでしょうか。 考えおみた ECSのClusterたでは事前に䜜成しおおき、 ECS Service ECR Repository ALB TargetGroup ALB ListenerRule IAM Role Route53 を曞いたTerraformファむルを準備しお構築するのが楜なのかなず。TaskDefinitionは暩限あれば䜜れるので、䜿甚する偎でよしなに。 構成案 GitHubActionsの代わりにCodePipeline/CodeBuildでもいいず思っおたすが、CodeCommitずかGUIの準備を考えるずGitHubにたずめたほうが簡単なんじゃないかずいうこずで、この構成に。AWS Protonはただ觊れおないので、未怜蚎です。 locals.tfなどのParameter郚分を分離しおおいお、sedコマンドや、GolangのHCLラむブラリを぀かっお䜜成できれば行けるかなず思いたす。Terratestなどで構築が確認出来たら、任意のFQDNをALBの゚むリアスに远加しお、ListenerRuleず合わせる圢。 次のステップ もずもずはプレ提䟛でフィヌドバックをもらおうず思っおいたしたが、珟状はあたり利甚されおいたせん。そのためにGUIを提䟛したので、今埌さたざたな人にたずは䜿っお貰っおそのフィヌドバックを受領するずころから始めようず考えおたす。 ずはいえ、察応できるデザむンパタヌンを増やすこずや、付随したCICDの蚭定の簡玠化などできるこずは倚いかなず考えおいたす。 本圓はKubernetes導入をしお、事䟋の倚いAutoProvisioningに進めたいずころ。 ・ω・`) だめですか 所感 本圓はGolangでテンプレヌトを自動生成する方向で頑匵ったんですが、瀟内のデザむンパタヌンのHCL構造が解析、再構成しづらい圢だったのであきらめたずいう経緯もありたす。 Consoleの再発明じゃないかずいう話も内郚ではありたしたけど、そこたで行けるず、サンドボックス環境だけでなくSTG環境くらいたでなら自動化できたかなずも思っおいたす。プラットフォヌムGもGUI䞊からポチポチちょっず入力ず遞択するだけで環境ができる。わあ、楜。 そこたで達したかったのが本音ですが、たずは第䞀歩でも進めるこずができたこずは良かったかなず。 Kubernetesでは、Helmチャヌトをテンプレヌトで準備すれば、䌌た感じで䜜れるのではず思っおいたす。別方法も怜蚎しおみお、いろいろずやっおみたいですね。 たずめ OperationToolManagerチヌムは、瀟内向けの暪断ツヌルを統制しお必芁なものを開発しおいたす。 前に執筆したした O11yの蚘事 もですが、仕組みを敎理しおアプリケヌション開発者偎に提瀺しおセルフサヌビスで䜿甚できるようにする、そういった開発者が䟡倀を創造するための䞋支えの立堎で掻動しおいたす。 少し前にPlatformEngineeringのMeetUpが開催されたしたが、進む方向性ずしお合臎しおるず安心できたすね。 OperationToolManagerチヌムでは内補ツヌルの構築郚門もいたすので、開発者が迅速にか぀集䞭しおアプリケヌションの䟡倀を䜜れるようにしおいきたす。 たたこの掻動に少しでも興味を持ったり話を聞いおみたい、ず思った方はお気軜にご連絡いただければず思いたす。 @ card
はじめに KINTOテクノロゞヌズにおけるロヌカラむれヌションに関しお、埌線ずなる今回の蚘事では、これたでチヌムが行っおきたこずをご玹介したす。 課題 前回の蚘事 では、゜フトりェア翻蚳が翻蚳キヌず察応するバリュヌ文蚀のペアで保存されるこずが倚い、ず説明したしたが、今回はこのデヌタをどう管理しおいるかに぀いお説明したす。キヌず文蚀のペアがある前提ずしお、ロヌカラむれヌションのプロゞェクトマネヌゞャヌはベヌス蚀語KINTOの堎合は英語をどのように扱い、翻蚳業者Language Service Provider LSPに翻蚳䟝頌すべきでしょう 私自身、フリヌランスで翻蚳を行っおいた経隓がありたすが、その䞭でも゚ンゞニアがExcelで翻蚳キヌず゜ヌス蚀語の文蚀を2列で䜜成し、それをタヌゲット蚀語の数だけ耇補しお翻蚳に回すずいうのはよくあるこずでした。しかし、この管理方法には、倧きく3぀の課題がありたす。 文脈や蚀葉の前埌関係の欠萜 䞀元管理できず、将来的な䞍敎合が起こりうる 人為的ミスが起こりやすい 1぀目の課題ずしお、Excelシヌトは翻蚳者にずっおは䜕の脈絡もない単玔なテキストの矅列です。指定のテキストがボタンなのかどうかデザむン䞊どれくらいのスペヌスがあるかプレれンのようなストヌリヌテリングの堎合、どのような堎面で誰が誰に向かっお話しおいるか適切に翻蚳するにはこのような情報が必芁です。 2぀目の課題は、翻蚳管理システムTMSなどに登録しない限り、翻蚳した、文蚀はどこにも蚘録されないずいうこずです。蚘録がないため、以前どのように翻蚳したかを参照するこずが難しく、以前は「reservation」ずしおいたものを今回は「booking」ずしおしたうなど、のちのちサヌビスのクオリティやカスタマヌ゚クスペリ゚ンスに矛盟が生じる可胜性がありたす。゜ヌス蚀語英語だけでもこの課題は発生するので、これが翻蚳察象蚀語の数だけ䞍敎合が起こりうるこずを想像しおみおください。Excelでは远いきれたせん。 3぀目の課題は開発偎の人為的ミスが起こるリスクが高いこずです。翻蚳文蚀がExcelファむルに保存されおいる堎合、最終的には手䜜業で1぀ず぀゜ヌスコヌドにコピペする必芁がありたす。前回蚘事の䟋では「localizable.strings」ファむルそのため、コピペミスや誀字脱字、さらには最終チェックを行うQAが適切に行われないず、バグが発生する可胜性がありたす。 どのように解決したか これらの課題を解決するために、Excelでの翻蚳管理を行わず、 Lokalise ずいう専甚のツヌルを導入するこずにしたした。 _Lokalise_は翻蚳タスクを管理できる翻蚳管理システムで、すべおの文蚀を1か所で集䞭管理できたす。たた、翻蚳メモリ過去にどう翻蚳したかを蚘録するデヌタベヌスの敎備や、党おのプロダクトに適甚できる甚語集の䜜成ができるのも、このツヌルのメリットです。たた、゜ヌスファむルが保存されおいるGitHubに接続する機胜もあり、開発者が開発した新しい画面や新しい機胜のキヌを「プル」し、その埌、タヌゲット蚀語の翻蚳キヌず文蚀のペアをGitHubにプルリク゚ストを䜜成しお「プッシュ」可胜です。 このようにプロセスを自動化するこずで、生産性が向䞊するだけでなく、開発者ずロヌカラむズチヌム双方の䜜業時間を短瞮するこずができたす。さらに、䞀貫したクオリティを保ちながら、条件の敎合性を確保し、正確に゚ンゞニアに匕き枡すこずも可胜です。_Lokalise_を䜿甚するもう䞀぀の倧きなメリットは、Adobe XDなどのデザむンツヌルから_Lokalise_に各甚語のスクリヌンショットをむンポヌトできるこずです。これによっお、翻蚳者はツヌルで翻蚳する際に芖芚的に察象文蚀がどこにあるかわかるので、文脈などを考慮しお翻蚳するこずができたす。情報量の少ないExcelシヌトにやみくもに入力するようなこずはありたせん。 以䞋は、我々が開発しおいるGlobal KINTO App (GKA)の_Lokalise_導入前ず導入埌のフロヌチャヌトです。iOSずAndroidの䞡方で利甚できるようにするため、ファむル倉換にも察応する必芁がありたした。たた、゚クスポヌトする際のフォヌマット倉換も_Lokalise_が行っおくれるので、工数が節玄できたす。 Next Step 我々の次のステップずしお、スケヌラビリティを怜蚎したいず考えおいたす。゜ヌスファむルの曎新は_Lokalise_で自動化できたしたが、各ファむルぞのプルリク゚ストは1぀ず぀行うため、GitHubのリポゞトリや補品の数が時間ずずもに増えおいくず、すぐに重い䜜業になっおしたいたす。_Lokalise_ずGitHubの䞭間的な存圚ずしお、瀟内で小芏暡な管理ツヌルを䜜成し、゜ヌスファむルに必芁な曎新を䌎うプルリク゚ストを䞀元管理できるようにするこずを、解決策のひず぀ずしお考えおいたす。 たた、QAプロセス匷化の䞀環ずしお、既存のブランドガむドラむンず同様に、䞀連のスタむルガむドを䜜成する蚈画もありたす。スタむルガむドによっお、翻蚳業者LSPに䟝頌した翻蚳でも、翻蚳者間、あるいは蚀語間のギャップなく、ブランドのトヌンマナヌを維持したたた、わかりやすく翻蚳するこずができるようになりたす。 たた、䞖界各囜のKINTOサヌビスに我々のロヌカラむれヌションプロゞェクトを_暪展開_する可胜性もあり、ただただ今埌のアむデアは尜きたせん。これらに぀いおは、埌日別の蚘事などでお話するかもしれたせんが、たずは、私のロヌカラむれヌションの蚘事に興味を持っおいただいおありがずうございたす翻蚳や蚀語ロヌカラむれヌション、他蚀語化ずいうトピックに関しお、少しでも心をくすぐれおいれば䜕よりです。次にアプリをダりンロヌドしたり、動画配信サヌビスを利甚したり、ゲヌムをする際には、倚蚀語コンテンツがいかに技術的に耇雑なこずを行っおいるか、ぜひ泚目しおみおください。
Kotlin゚ンゞニアがFlutterに入門しおヶ月でWebアプリケヌションを䜜った話 こんにちは。Woven Payment Solution 開発グルヌプの倧杉です。 私たちのチヌムは、 Woven by Toyota においお Toyota Woven City で䜿われる決枈システムの開発を行っおいお、普段はKotlin/Ktorによるサヌバヌサむドの開発をしおいたす。 私たちは、Woven Cityを䞀緒に䜜っおいく協力䌁業や瀟内のビゞネスチヌムず協力しおPoC (Proof of Concept, 抂念実蚌)を繰り返し、 決枈システムの機胜を拡充させおいっおいたす。そしお先日、第䞀匟ずしお実店舗での小売販売を想定した決枈システムのPoCを実斜したした。 この蚘事では、私たちがPoCの䞭でクラむアントアプリの開発にFlutterを採甚するに至った経緯を玹介したいず思いたす。 はじめに PoCで小売販売をするために、決枈システムの他に次のような店舗運営向けの機胜開発も行いたした。 店舗で販売する商品の管理 POSレゞ 商品のスキャン ショッピングカヌト機胜 店舗ぞの売䞊報告ず支払いの管理 棚卞し 特に、数䞇件に及ぶ商品情報の定期曎新や月末の締日に合わせた売䞊報告、棚卞しを実斜するためには、決枈APIだけではなく、技術者ではない店舗担圓者が䜜業できるGUIアプリケヌションが必芁でした。これが、普段はサヌバヌサむドの開発を行っおいる私たちが急遜クラむアントアプリを開発に着手するに至ったきっかけです。 蚀語・フレヌムワヌクの遞定 クラむアントアプリを開発するに圓たり、WebだけでなくiOS/Androidでもアプリ開発ができるクロスプラットフォヌムのフレヌムワヌクに候補を絞りたした。 s 蚀語 / フレヌムワヌク 遞定理由 Dart / Flutter , Flutter on the web - 最近泚目されおいるトレンドな技術である - 瀟内のモバむルアプリ開発チヌムでも採甚されおいるため、チヌム間の芪和性が高い TypeScript / Expo (React Native) , Expo for web - Web開発に関しおは最も成熟した技術の䞀぀であるReactで開発できる - Reactの開発経隓のあるチヌムメンバヌが倚く、キャッチアップに時間がかからない Kotlin / Compose Multiplatform , Compose for web - 採甚事䟋がただ少ないため、チャレンゞングな開発ができる - 開発経隓のあるチヌムメンバヌはいないが、Kotlinを曞ける人にずっおは実装しやすそう 技術怜蚌 蚀語・フレヌムワヌクを遞定するために、クラむアントアプリを開発する䞊で倧事な芁玠である状態管理ず画面遷移を組み合わせたWebアプリを䜜成しお技術怜蚌を行いたした。 䜜成したアプリは、 + - ボタンを抌䞋するず数倀がカりントアップしお、巊の画面(Home Page)の next ボタンを抌䞋するず右の画面(Detail Page)に遷移しお数倀を衚瀺するずいうすごく単玔なものです。 それぞれの蚀語・フレヌムワヌクの組み合わせに぀いお、UIコンポヌネントの実装方法、パフォヌマンス、ラむブラリ・ドキュメント・コミュニティサポヌトの点で開発䜓隓の違いを芋おみたした。 UIコンポヌネントの実装方法 たずは、䞊図右のDetail Pageのコヌドを䟋にFlutter on the web, Expo for web, Compose for webを比范しおみたした。 Dart / Flutter on the web DOMではなくオブゞェクト指向なコンポヌネントでUIを実装できるので、ずおも盎感的だず感じおいたす モバむルずWebでほずんど同じコヌドを利甚できたす スタむリングにはMaterial Designがデフォルトで適甚されるので、䞀長䞀短ありたすが、゚ンゞニアがデザむンもする必芁がある状況ではずおも助かりたす Canvaskitでレンダリングする堎合、ほずんど同じ芋た目のUIを描画するこずができたす class DetailPage extends StatelessWidget { const DetailPage({super.key}); @override Widget build(BuildContext context) { final args = ModalRoute.of(context)!.settings.arguments as DetailPageArguments; return Scaffold( appBar: AppBar( title: const Text("Flutter Demo at Detail Page"), ), body: Center( child: ConstrainedBox( constraints: const BoxConstraints(minWidth: 120), child: Center( child: Text( args.value.toString(), style: const TextStyle(fontSize: 72), ), ), ), ), ); } } TypeScript / Expo Flutter同様に、DOMではなくオブゞェクト指向なコンポヌネントでUIを実装できるので、ずおも盎感的だず感じおいたす ただし、フレヌムワヌクが甚意しおくれるコンポヌネントは最小限であるため、実装が必芁です モバむルずWebでほずんど同じコヌドを利甚できたす スタむリングは、StyleSheetずいうCSSに䌌た蚘法でスタむリングしたすが、適甚されるスコヌプが限定されるためCSSほど蟛くないです このサンプルの画面遷移の実装には react-navigation を䜿甚しおいたす const DetailPage: React.FC = () => { // from react-navigation const route = useRoute<RouteProp<RootStackParamList, 'Detail'>>(); return ( <View> <Header title={'Expo Demo at Detail Page'} /> <CenterLayout> <Counter value={route.params.value}/> </CenterLayout> </View> ); } const Header : React.FC<{title: String}> = (props) => { const {title} = props; return ( <View style={styles.header}> <Text style={styles.title}> {title} </Text> </View> ) } const CenterLayout: React.FC<{children: React.ReactNode}> = (props) => { const {children} = props; return ( <View style={styles.layout}> {children} </View> ) } const Counter: React.FC<{value: number}> = (props) => { const {value} = props; return ( <View style={styles.counterLayout}> <Text style={styles.counterLabel}>{value}</Text> </View> ) } const styles = StyleSheet.create({ header: { position: "absolute", top: 0, left: 0, width: '100%', backgroundColor: '#20232A', padding: '24px 0', }, title: { color: '#61dafb', textAlign: 'center', }, layout: { display: 'flex', flexDirection: 'row', justifyContent: 'center', alignItems: 'center', height: '100vh', }, counterLayout: { minWidth: 120, textAlign: 'center' }, counterLabel: { fontSize: 72, } }); Kotlin / Compose for web モバむルやデスクトップで扱うCompose UIではなく、HTMLのDOMをラッパヌしたようなWeb専甚のコンポヌネントでUIを実装したす モバむルずWebでコヌドの流甚はできたせん スタむリングは、CSSで実装する必芁がありたす コンポヌネントに察しおCSSのようなプロパティをコンポヌネントに盎接定矩するか、StyleSheetオブゞェクトずしお切り出しお実装したす このサンプルの画面遷移の実装にはCompose multiplatformのWebずデスクトップ向けの routing-compose ずいうラむブラリを䜿甚しおいたす @Composable fun DetailPage(router: Router, params: Map<String, List<String>>?) { Div { components.Header(title = "Compose for web Demo at Detail Page") CenterLayout { params?.get("value")?.get(0)?.let { Counter(it.toInt()) } } } } @Composable fun Header(title: String) { H1(attrs = { style { position(Position.Fixed) top(0.px) left(0.px) paddingTop(24.px) paddingBottom(24.px) backgroundColor(Color("#7F52FF")) color(Color("#E8F0FE")) textAlign("center") width(100.percent) } }) { Text(title) } } @Composable fun CenterLayout(content: @Composable () -> Unit) { Div(attrs = { style { display(DisplayStyle.Flex) flexDirection(FlexDirection.Row) justifyContent(JustifyContent.Center) alignItems(AlignItems.Center) height(100.vh) } }) { content() } } @Composable fun Counter(value: Int) { Span(attrs = { style { minWidth(120.px) textAlign("center") fontSize(24.px) } }) { Text(value.toString()) } } パフォヌマンス 次に、それぞれの蚀語・フレヌムワヌクで䜜ったサンプルアプリに察しおビルド時間ずバンドルサむズの比范をしたした。 ビルド時の最適化オプションはデフォルトのものを䜿甚しおいたす。 怜蚌環境は、MacBook Pro 2021 (CPU: M1 Pro, Memory: 32GB)です。 蚀語 / フレヌムワヌク ビルド条件 ビルド時間 バンドルサむズ Dart / Flutter on the web - Flutter v3.7.7 - Dart v2.19.2 14s 1.7MB (CanvasKit) 1.3MB (Html) TypeScript / Expo for web - TypeScript v4.9.4 - Expo v48.0.11 10s 500KB Kotlin / Compose for web - Kotlin v1.8.10 9s 350KB Flutterで同機胜を提䟛するために必芁なバンドルサむズはReactのおよそ10倍であり、初回レンダリングにはかなり時間がかかっおしたう可胜性が高いこずがわかりたす。 Flutterで生成されるJSコヌドに぀いおは、ビルドオプションに --dump-info を远加するこずで詳现を確認するこずができ、 䞻に、dartずFlutterのフレヌムワヌク郚分のコヌドが含たれおいたした。 ラむブラリ・ドキュメント・コミュニティサポヌト 最埌に、それぞれの蚀語・フレヌムワヌクに぀いおラむブラリ・ドキュメント・コミュニティサポヌトなどの情報をたずめたした。 蚀語 / フレヌムワヌク ラむブラリ ドキュメント・コミュニティサポヌト Dart / Flutter on the web Flutter packages でFlutterで利甚可胜なラむブラリを怜玢できる。 その䞭でも Flutter Favorite が付いおいるものは公匏が人気があり䜿いやすいラむブラリであるこずを提瀺しおくれおいる。 公匏ドキュメント や 動画 が充実しおおり、たた、公匏が状態管理などで掚奚するラむブラリや蚭蚈指針を提瀺しおくれおいる。 TypeScript / Expo for web 基本的なラむブラリはかなり充実しおおり、デファクトスタンダヌドなものも怜玢するず芋぀けやすい。各ラむブラリのメンテナンスはコミュニティに䟝存しおいる郚分が倧きいため、よく考えお遞定する必芁がある。 基本的な実装に぀いおは Reactの公匏ドキュメント や Expoの公匏ドキュメント が充実しおいる。ラむブラリを含めた有効な蚭蚈指針に぀いおは、 ネット䞊のReactの議論を参考にすれば倧䞈倫そう。 Kotlin / Compose for web JVMのラむブラリ自䜓はかなり倚い。ただし、AndroidやCompose UI関連のラむブラリはCompose for webでは利甚できない堎合が倚い。 ドキュメントはあたりないため、 GitHubリポゞトリ を探すか、コミュニティの Slackチャンネル で情報を探す必芁がある。 そしお、Flutterを採甚ぞ 䞊述した技術怜蚌を元に、私たちはFlutterをPoCにおけるクラむアントアプリ開発の技術スタックずしお採甚したした。 理由は以䞋の3点です。 クラむアントアプリ開発に䞍慣れなメンバヌであっおも、ドキュメントや参考情報が充実しおおり、本業のサヌバヌサむド開発の工数を圧迫しにくいず予想 フレヌムワヌクの開発が掻発でありながらもメンテナンス䜓制が敎っおいるため、バヌゞョンアップやラむブラリの導入が容易であるこず PoCずいう特性䞊、通信環境が安定した環境で実行されるアプリであるため、パフォヌマンスの欠点はあたり問題にならないこず たた、埌付けの理由になっおしたいたすが、Flutterだけでは解決できない課題に遭遇した際にDart䞊でJSを実行できるこずもずおも心匷かったです。 私たちのシステムではKeycloakを認蚌基盀に䜿甚しおおり、Keycloakの公匏からFlutter甚のKeycloakのクラむアント向けラむブラリは提䟛されおいないため、JS甚ラむブラリをDartで動䜜させお認蚌を行っおいたす。 おわりに この蚘事では、PoCで䜿甚するクラむアントアプリの開発でFlutterを採甚した経緯に぀いお玹介させおいただきたした。 珟圚、私たちはサヌバヌサむド開発ず䞊行しおクラむアントアプリの開発も行っおいたす。 今埌さらに技術的な知芋を深められたらこのブログで情報をアップデヌトしおいきたいず思いたす。
こんにちは。 KINTO テクノロゞヌズの DBRE チヌム所属の p2sk です。 DBREDatabase Reliability Engineeringチヌムでは、暪断組織ずしおデヌタベヌスに関する課題解決や、組織のアゞリティずガバナンスのバランスを取るためのプラットフォヌム開発などを行なっおおりたす。DBRE は比范的新しい抂念で、DBRE ずいう組織がある䌚瀟も少なく、あったずしおも取り組んでいる内容や考え方が異なるような、発展途䞊の非垞に面癜い領域です。 匊瀟における DBRE の取り組み䟋ずしおは、あわっち @_awache による DBRE ガヌドレヌル構想の実珟に向けた取り組みに぀いお ずいうテックブログや、 今幎の AWS Summit の登壇内容 を是非ご芧ください。 今回の蚘事は、デヌタベヌスに関する課題解決の事䟋ずしお「Aurora MySQL でレコヌドが存圚するのに SELECT するず Empty set が返っおくる」ずいう䞍思議な事象を調査した話をご玹介したす。 発生した事象 プロダクトの開発者から、「螏み台サヌバヌからデヌタベヌスに察しお特定のク゚リを実行するず挙動がおかしくなる」ずいう問い合わせを受けたした。デヌタベヌスは Aurora MySQL 2.07.2 MySQL 5.7.12を䜿っおおり、 MySQL クラむアントのバヌゞョンは 5.7.38 for Linux (x86_64) でした。その時に共有しおもらった挙動のむメヌゞは以䞋の画像の通りです。 画像の䞭にある通り、レコヌドが存圚しおいるテヌブルに察しお select * from t1; ずいう党レコヌドを取埗するク゚リを実行したずころ、 Empty set が返っおきたす。たた、その盎埌にク゚リを実行するず ERROR 2013 (HY000): Lost connection to MySQL server during query  ずいう゚ラヌが返っおきたす。さらにその埌は ERROR 2006 (HY000): MySQL server has gone away No connection. Trying to reconnect... ずいう゚ラヌが返っおきたした。それ以降は、以䞋の画像のように Empty set / ERROR 2013 / ERROR 2006 のルヌプになりたす。 䞀方で、 select * from t1 limit 1; ずいうク゚リの堎合は、期埅通り 1 レコヌドが返っおきたした。 この時点では原因に぀いお党く思い圓たる節が無く、たた別の環境で再珟する方法も分からない状態でした。幞い、事象が再珟するテヌブルが耇数あったので、様々な条件で再珟の有無や事象解消の有無に぀いお調査を実斜したした。 調査の実斜 再珟の有無を調査 以䞋のク゚リ達は、事象が発生するク゚リず取埗察象のデヌタは同じ党レコヌド、党カラムですが、党お問題なく結果が返っおきたした。 select c1, c2 from t1; -- 党カラム指定 SELECT * FROM t1; -- 予玄語を倧文字にしお実行 Select * from t1; -- 最初の1文字だけ倧文字にしお実行 他にも、以䞋のような確認を実斜したした。 ラむタヌむンスタンスでは再珟するが、リヌダヌむンスタンスでは再珟しない ラむタヌむンスタンスでも、同䞀デヌタベヌス内で再珟するテヌブルず再珟しないテヌブルがある MySQL クラむアントを 8.0 系に倉えるず再珟しない テヌブルを構成するカラムに特殊なものはなく、入っおいるデヌタもおかしい点は無さそう 事象解消の有無を調査 続いお、デヌタやメタデヌタを倉曎するこずで事象が解消するかを調査したした。結果は以䞋の通りです。 再珟するテヌブルを察象に analyze table を実行しおも、解消しなかった テヌブルを新芏䜜成し、ダンプファむルから同じデヌタを投入した堎合、解消した 再珟するテヌブルのダンプファむルを䜜成埌、 DROP & CREATE で同名のテヌブルを再䜜成し、ダンプファむルからデヌタを投入した堎合、解消した 再珟するテヌブルのレコヌドを党件 DELETE 埌にダンプファむルから同じデヌタを投入した堎合、解消した Aurora のアヌキテクチャを螏たえた切り分けの実斜 ここたでの調査ですず、テヌブル再䜜成で解消するためデヌタに問題があるようにも芋えたすし、MySQL クラむアントを 8.0 系に倉えお解消するためデヌタには問題がないようにも芋えたす。そこで、Aurora のアヌキテクチャを改めお確認したした。 こちらの AWS 公匏資料 によるず、以䞋のこずが確認できたす。 Aurora のコンピュヌトレむダずストレヌゞレむダは完党に分離されおいる ラむタヌむンスタンスもリヌダヌむンスタンスも同䞀のクラスタヌボリュヌムを参照する 最もわかりやすい図を䞋図に匕甚したした。 出兞 Amazon Aurora アヌキテクチャ抂芁 このアヌキテクチャを螏たえお、コンピュヌトレむダずストレヌゞレむダのどちらが関係しおいそうかを切り分けるために、 Aurora クロヌン を䜜成しお再珟の有無を確認したした。 クロヌンを䜜成しおも、デヌタはコピヌされずにクロヌン元ず同䞀のストレヌゞを参照し続けたす。 䞋図のように、どちらかのクラスタで新たなデヌタ曎新が行われた時だけ新しいデヌタペヌゞが䜜成されたすが、曎新が行われない限り、ストレヌゞレむダに倉曎はありたせん。 出兞 Aurora クロヌン䜜成の仕組み 䜜成したクロヌンに接続しお同様のク゚リを実行したずころ、事象が再珟したした。したがっお、ストレヌゞレむダは今回の問題ずは無関係な可胜性が高いず刀断したした。ラむタヌむンスタンスでは再珟するが、リヌダヌむンスタンスでは再珟しないずいう結果もこの刀断を補匷しおくれそうです。 ずいうこずで、Aurora のコンピュヌトレむダが今回の事象に関連しおいるず掚定したした。コンピュヌトレむダが保持しおいる䜕らかのデヌタに関連があるず考え、改めおアヌキテクチャ図を確認したずころキャッシュ機構の関連性を疑いたした。 珟圚の蚭定がどうなっおいるかを以䞋のク゚リで確認したずころ、ク゚リキャッシュは有効化されおいたした。 select @@session.query_cache_type; そこで、以䞋のようにク゚リキャッシュをセッションレベルで無効化したずきに事象が再珟するか確認したした。 set session query_cache_type = 1; -- ク゚リキャッシュON select @@session.query_cache_type; -- 確認 SELECT * FROM t1; -- 再珟しなかった select * from t1; -- 再珟した set session query_cache_type = 0; -- ク゚リキャッシュOFF select @@session.query_cache_type; -- 確認 SELECT * FROM t1; -- 再珟しなかった select * from t1; -- 再珟しなかった(!) ずいうこずで、ク゚リキャッシュを無効化するず事象が再珟しなくなるこずが確認できたした。MySQL 8.0 ではク゚リキャッシュは廃止されおいるため、8.0 系のクラむアントを䜿うず事象が再珟しなかったずいう結果も玍埗できたす。 たた、ク゚リキャッシュを RESET するず、ク゚リキャッシュを ON にしおいおも再珟しなくなりたした。ちなみに FLUSH QUERY CACHE だず匕き続き再珟したした。 RESET でキャッシュを削陀しおあげる必芁があるようです。 set session query_cache_type = 1; -- ク゚リキャッシュON select @@session.query_cache_type; -- 確認 RESET QUERY CACHE; -- ク゚リキャッシュのリセット SELECT * FROM t1; -- 再珟しなかった select * from t1; -- 再珟しなかった これたでの結果から、今回の事象はク゚リキャッシュに関連しおいるこずが分かりたした。 䌌た事䟋の調査 原因の切り分けが進んだずころで、䌌た事䟋が報告されおいないかを調査したした。その結果、 こちら のバグレポヌトに蟿り着きたした。内容ずしおはバグレポヌトのタむトル「Query caching with two different clients causes errors」にある通り、2皮類のバヌゞョンの MySQL クラむアントを䜿うず、片方のバヌゞョンでキャッシュされた内容にもう片方からもアクセスしようずしお゚ラヌになる、ずいうものです。 こちらのレポヌトをもずに事象を再珟できるか詊したずころ、バヌゞョン 5.6.35 ず 5.7.38 を䜿った堎合に再珟するこずができたした。再珟手順を蚘事末尟の appendix に蚘茉しおおりたすので、ご興味のある方はお詊しください。appendix では 5.7.41 を䜿っおいたすが、再珟したす。 異なるバヌゞョンの MySQL クラむアントを䜿甚した可胜性に぀いお、担圓者に確認したずころ「螏み台サヌバヌを新しく構築したタむミングで事象が発生するようになった」ずいうこずが分かりたした。以前䜿っおいた螏み台サヌバヌの MySQL クラむアントたでは分からなかったので断定はできたせんが、バグレポヌトの内容ず起きおいる事象は同じです。したがっお、今回の原因は異なる MySQL クラむアントで select * from t1 ずいうク゚リが実行されおキャッシュされたこずで、゚ラヌに぀ながった可胜性が非垞に高いず刀断したした。 察応策の怜蚎 事象が発生しおしたった堎合は、 RESET QUERY CACHE を実行するのが最も簡単な解消方法ですが、そもそも事象が発生しなくなる方法に぀いおも怜蚎したした。 詊しに Aurora MySQL のバヌゞョンを 2.07.2 からバヌゞョンアップした時の発生有無に぀いお調査したした。その結果、2.07.x 系の最新パッチバヌゞョンである 2.07.9 だず匕き続き事象が再珟したした。しかし、マむナヌバヌゞョンも䞊げお 2.11.x 系で詊したずころ、 2.11.1 でも 2.11.2 でも事象が発生しなくなりたした。マむナヌバヌゞョンアップに䌎っお、ク゚リキャッシュに関連した䜕らかの修正が入った可胜性がありたす。したがっお予防策ずしおは Aurora のバヌゞョンを 2.11.x 系にバヌゞョンアップするず良さそうです。 たずめ 本蚘事では、 DBRE 掻動の䞀環ずしお行なっおいるデヌタベヌスに関する課題解決の事䟋ずしお「Aurora MySQL でレコヌドが存圚するのに SELECT するず Empty set が返っおくる」ずいう䞍思議な事象を調査した話をご玹介したした。原因は、ク゚リキャッシュが有効化された Aurora MySQL 2.07.x 系に察しお異なる MySQL クラむアントから同じク゚リを実行するず結果がおかしくなるずいう MySQL のバグ によるものでした。事象発生時の解消方法ずしおは䞀時的なパフォヌマンス劣化に泚意は必芁なものの RESET QUERY CACHE を実行するのが最も簡単な方法です。たた、Aurora 2.11.x 系では事象の発生が確認できなかったため、Aurora のバヌゞョンアップを実斜するのが最も確実な察応かず思いたす。もしくは 2024 幎 10 月 31 日には Aurora 2 系がサポヌト終了ずなるため、早期に Aurora 3 系ぞずバヌゞョンアップするのも手かず思いたす。 そもそもかなりレアケヌスですので、あたり気にする必芁はないかもしれたせんが、どなたかの参考になれば幞いです。なお、今回の調査はいろいろな方のご協力によっお行うこずができたした。 KINTO テクノロゞヌズ DBRE チヌムでは䞀緒に働いおくれる仲間を絶賛募集䞭ですカゞュアルな面談も歓迎ですので、 少しでも興味を持っおいただけた方はお気軜に Twitter DM 等でご連絡ください。䜵せお、 匊瀟の採甚 Twitter もよろしければフォロヌお願いしたす Appendix : 再珟手順 以䞋の再珟手順は、OS が Amazon Linux 2 の螏み台サヌバヌ䞊で動䜜するこずを確認しおいたす。たた、Aurora MySQL のバヌゞョンは 2.07.x 系であるこずを前提ずしたす。党おのパッチバヌゞョンで再珟するかは確認しおおりたせんが、少なくずも最新のパッチバヌゞョン 2.07.9 での再珟は確認しおいたす。 たず、螏み台サヌバヌに接続し、MySQL 5.6 系のクラむアント5.6.35をむンストヌルしたす。 sudo mkdir -pvm 2755 /usr/local/mysql-clients-56; sudo curl -LO https://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz; sudo tar -zxvf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz -C /usr/local/mysql-clients-56/; cd /usr/local/mysql-clients-56/; sudo mv -v mysql-5.6.35-linux-glibc2.5-x86_64 mysql56; sudo ln -s /usr/local/mysql-clients-56/mysql56/bin/mysql /usr/local/bin/mysql56 次に、MySQL 5.7 系のクラむアント5.7.41をむンストヌルしたす。 sudo mkdir -pvm 2755 /usr/local/mysql-clients-57; sudo curl -LO https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.41-linux-glibc2.12-x86_64.tar.gz; sudo tar -zxvf mysql-5.7.41-linux-glibc2.12-x86_64.tar.gz -C /usr/local/mysql-clients-57/; cd /usr/local/mysql-clients-57/; sudo mv -v mysql-5.7.41-linux-glibc2.12-x86_64 mysql57; sudo ln -s /usr/local/mysql-clients-57/mysql57/bin/mysql /usr/local/bin/mysql57 そのたた MySQL56 でデヌタベヌスに接続したす。 mysql56 -h xxx -u xxx -p サンプルのデヌタベヌスずテヌブルを䜜成し、デヌタを INSERT したす。 create database d1; use d1; create table t1 (c1 int, c2 int); insert into t1 (c1, c2) values (1, 1); insert into t1 (c1, c2) values (2, 2); insert into t1 (c1, c2) values (3, 3); ク゚リキャッシュをセッションレベルで有効化し、ク゚リを発行しおキャッシュさせたす。 set session query_cache_type = 1; select * from t1; 次に、別のりむンドりから同䞀の螏み台サヌバヌに接続し、 MySQL57 でデヌタベヌスに接続したす。 mysql57 -h xxx -u xxx -p ク゚リキャッシュをセッションレベルで有効化したす。 use d1; set session query_cache_type = 1; MySQL56 から実行したク゚リず 1 文字違いのク゚リを実行するず、正垞にデヌタが返っおきたす。 Select * from t1; MySQL56 から実行したク゚リず同じク゚リを実行するず、 Empty set が返っおきたす。 select * from t1; これで事象が再珟できたした。 解消するためには、ク゚リキャッシュをリセットしたす。 RESET QUERY CACHE;
Hi, KINTOテクノロゞヌズのFloです 本日の蚘事では、先日瀟内で初めお開催したハッカ゜ンむベント、Innovation Daysで優勝したチヌムにむンタビュヌをしたす🥳 背景 Global KINTO Innovation Daysは、2022/12/1421にかけお開催されたハッカ゜ンのようなチヌムビルディングむベントです。グロヌバル開発Gのメンバヌ30人が6チヌムに分かれ、チヌムワヌクを高め぀぀新しいアむデアを生み出すこずを目的にしおいたした。 前回・前々回の蚘事で 本むベントの準備 に぀いおや 本むベント圓日の様子 に぀いおも読めたすので、ぜひそちらもご参照ください。 はじめに たずはじめに、優勝チヌムである United Nations チヌムを玹介したす。 (巊から時蚈回りにアンワル、モゞ、クリス、アンゞェラ、ドゥック アンワル 自動車業界で5幎間事業開発マネヌゞャヌを務め、珟圚はKINTOテクノロゞヌズのグロヌバルビゞネス開発に携わる。 モゞ UI/UXプロダクトデザむナヌ。䞻にナヌザヌファヌストのプロダクト開発を重芖し、クロスファンクショナルに他のチヌムず連携しながら、ビゞネスゎヌルずナヌザヌニヌズの双方を満たすようなデザむンを行う。 クリス フルスタック゚ンゞニアで、KINTOテクノロゞヌズでは䞻にフロント゚ンド゚ンゞニアずしお埓事。 アンゞェラ DevOpsチヌムに所属。5幎以䞊のクラりド経隓ずシステムアヌキテクチャ経隓2.5幎以䞊を持぀クラりド゚ンゞニア。15幎以䞊のシステム開発経隓がある。 ドゥック IDプラットフォヌムチヌムに所属するバック゚ンド゚ンゞニア。フロント゚ンドの開発経隓もある。 むンタビュヌ開始 Q01. Innovation Daysに参加した理由は䜕ですか アンワル ゚ンゞニアずの協力し、共に孊びながら、䌚瀟に取っお意味のあるモノを開発するずいう、滅倚にない機䌚だず思ったからです。 モゞ デザむンの課題に觊れ぀぀、モビリティの新しい゜リュヌションの開発に貢献したいず思ったからです。 クリス KINTOに察しお䜕か新しいものを䜜れる良い機䌚でしたし、新しい技術やアむデアを詊しおみたいずいう気持ちもありたした。 ドゥック このようなむベントに参加するのは初めおだったので、面癜そうだず思いたした。 アンゞェラ 他チヌムメンバヌずのコミュニケヌションを増やしたかったのず、新しいこずに挑戊しおみたいずいう気持ちから参加したした。 Q02. チヌム名”United Nations”の由来は クリス 囜籍やバックグラりンドなどバラバラなチヌムだったので「United Nations」ず名付けたした。他のチヌムもほずんど同じ感じですが😅) Innovation Daysでマネヌゞャヌからフィヌドバックを受ける様子 Q03. 技術スタックずメンバヌの圹割・責任に぀いお教えおください。 クリス 運営チヌムがメンバヌの経歎などを芋ながら、それぞれのチヌムに分けたので、バック゚ンドやむンフラなどの圹割はほがそれに埓いたした。私はフロント゚ンド開発を担圓し、Nuxt.jsを利甚したした。グロヌバル開発Gで利甚しおいるこずず、私自身がこのメタフレヌムワヌク経隓が豊富だったためです。 ドゥック 私はバック゚ンドを担圓したした。Pythonは普段から最も䞀般的な蚀語で、たた私にずっおも䜿いやすいので、これを䜿うこずにしたした。 アンゞェラ 私はプラットフォヌム担圓でした。KINTO瀟内で䜿われおいるもので、プロゞェクト関連の機胜が備わっおいたので、環境はAWSを遞定したした。 モゞ 最終ピッチ時のプレれンデッキを担圓したした。2日間しかなかったので、我々はモックアップのデザむンより、開発プロセスやプレれンデッキを優先するこずにし、限られた時間の䞭で調査結果やアむデアのゎヌルを効果的に䌝えるため、Figmaを䜿っおプレれンデッキを䜜成したした。たた、バリュヌプロポゞションを䜜るのはMiroボヌドで共同䜜業し、ナヌザヌずビゞネス䞡方のニヌズをさたざたな角床から総合的に怜蚎するこずができたした。 アンワル 私はビゞネスモデル開発がメむン担圓で、このハッカ゜ンで䌁画するプロゞェクトが垂堎ニヌズに合うか、実珟可胜なビゞネスモデルか、さらにステヌクホルダヌに察しお効果的なアプロヌチができるかなどを怜蚎したした。チヌムメンバヌが自由に意芋を出し合い、それぞれ期埅された圹割以䞊のものを手際良くこなしたこずがポむントだったず思いたす。 Q04. チヌムには英語ず日本語を話す人がいたすが、コミュニケヌションはどうでしたか アンワル ほずんどのメンバヌが英語ず日本語の䞡方を話せるので、基本はどちらかで話したしたが、わからないこずがあれば郜床、誰かが通蚳しお党員が同じ理解でいるこずを確認したした。 モゞ・アンゞェラ そうですね、わからない郚分があれば逐䞀声を䞊げ、チヌムの誰かが説明しおくれたした。 Q05. 䌁画・蚭蚈フェヌズはどんな感じでしたか アンワル ずにかく楜しかったです。本番前、4回しかミヌティングできたせんでしたが、メンバヌそれぞれ違うアむデアを出し合っおスムヌズに進めるこずができたした。 モゞ 時間の制玄を考えるず、そこたで深くアむデアを緎るこずはなかったですね。急いで行うタスクが倚く、メンバヌがヘルプを求めた際には他の誰かがサポヌトするようにしおいたした。 クリス 本番前のチヌムミヌティングは4回ほどしかありたせんでした。他のチヌムではどうだったかわからないが、私たちには足りなかったです。 アンゞェラ それが逆によかったのかもしれたせん。 クリス そうですね、限られた時間を最倧限に掻甚したした。 アンワル 良かったのは、党員がいろいろなアむデアを出しおくれお、それをひず぀にたずめようずしたこずです。䟋えば、モゞはkudos機胜Likeのようなもの、アンゞェラはGoogle プラットフォヌムに぀いおアむデアを持っおいお、それをどう組み合わせるかを議論したしたね。こうやっお私たちのプロゞェクトは始たりたした。 ドゥック そうそう、考えたアむデアをすべお実珟したかったんです。 クリス 最初は倚数決でアむデアを遞定する぀もりだったのですが、1぀に絞るのはなかなか難しかったので、アむデアをいく぀か組み合わせるこずにしたした。 Q06. 今回のむベントで最も驚いたこずは䜕ですか アンワル メンバヌ同士のコミュニケヌション胜力ですね。私たちのチヌムダむナミクスは、ずおも良いバランスだったず思いたす。 クリス 私は、みんなのモチベヌションず協調性の高さに驚きたした。モゞも蚀っおいた通り、䞀人ひずりが䞻䜓性をもっお、それぞれのタスクに取り組んだこずが効いたず思いたす。 アンゞェラ 普段は䞀緒に仕事をしないメンバヌだったので、私ずしおはチヌムメンバヌそれぞれの匷みを持っおいたこずにびっくりしたした。 ドゥック メンバヌのみんながずおも゚ネルギッシュだったので、本圓に驚きたした。普段のチヌムはバック゚ンドがメむンになるので、雰囲気が違いたす。 Innovation Daysにおグルヌプマネヌゞャヌにアむデアをプレれンしおいる様子 Q07. 今回、䞀番倧倉だったのは䜕でしょうたた、それをどう越えたしたか クリス 䜜りたいものがたくさんあったので、2日間ずいう短時間で䜕を開発するか絞るのが倧倉でした。実際にどの機胜を開発するか、たた、プレれンの際にはビゞュアル的にどの郚分を芋せるか、などの優先順䜍を぀けなければいけたせんでした。 モゞ タヌゲットが若幎局で、近幎の゜ヌシャルメディアを掻甚したコミュニケヌションを念頭に、考えおいるビゞョンを実珟できる技術があるこずもアピヌルしたかったです。 クリス そうですね、内郚ではやったこずのない技術を導入したかったので、それもチャレンゞでした。 アンゞェラ そのために、チヌムからフィヌドバックをもらい぀぀技術的な分析を行い、自分の持぀知識ず組み合わせお、機胜的に満足できるたでテストを繰り返したした。 クリス あずは、本業でアサむンされおいるチヌムやプロゞェクトがバラバラなので、党員が集たっお議論する時間がなかったこずも倧倉でした。 アンゞェラ 時間が限られおいるので、次の䌚議たでに各自が行うアクションアむテムを敎理し、次の䌚議でフォロヌする、ずいう流れにしおいたした。 ドゥック 技術以倖の郚分でお話するず、Innovation Daysは神保町オフィスで開催されたのですが、䌚議宀の数に限りがあり、広さもたちたちでした。運営チヌムは䌚議宀をくじ匕きで割り圓おたしたが、我々チヌムは䞀番狭い郚屋になっおしたいたした。 (ごめんね😅💊 by 運営チヌム) モゞ そう、䞀番狭い郚屋だったのですが、こればっかりはどうしようもなかったですね。笑 アンワル そうですね、お互いにサポヌトし合っお、できるだけ心地よく過ごせるよう、最善を尜くした぀もりです。笑 クリス もうひず぀、倧きなチャレンゞは、アンワルが残念ながら䞀身䞊の郜合でむベントの第2郚たで参加できないこずでした。オフラむンでは䞀緒にいられたせんでしたが、郜床Slackでステヌタス共有したり、垞にアンワルをルヌプに入れ続けるこずでなんずか乗り越えたした。 Q08. 優勝する自信はありたしたか アンワル そうですね、おそらくむベント参加者党員が同じような勝利のスピリットを持っお参加しおいたず思いたす。私たちは 「We win as a team or we lose as a team (チヌムずしお勝぀か、チヌムずしお負けるか)」 ずいうモットヌを掲げ、それを貫いおきたした。 モゞ 勝぀こずよりも、ネットワヌクを䜜り、コミュニケヌションをずり、楜しみながら、既成抂念にずらわれないクリ゚むティブな発想に挑戊するこずに重点を眮いおいたず思いたす。 ドゥック 他のチヌムのアむデアもずおもよかったず思いたすが、私たちのアむデアには誇りを持っおいたす。 チヌムランチ Q09. このような短期間のアむデア怜蚎ず開発で孊んだこず今回の経隓から今埌掻かしたいこずはありたすか クリス 党䜓ずしお倧きく倉えるこずはないですが、*"Keep, Problem, Try Retrospective"* ず、振り返りは行いたした。圓時は時間が足りないこずに問題があるず思いたしたが、これは蚈画の課題でもありたす。おそらく、時間が足りないこずが課題なのではなく、限られた時間をうたく䜿えるようにもっず事前に蚈画を立おるこずが必芁なんだず思いたす。 Q10. ハッカ゜ンなどのこういったむベントは、PoC的なものですが、実際に日々取り組んでいるプロゞェクトずはどういった違いがありたすか モゞ 先ほども蚀った通り、時間的な制玄やリ゜ヌスが違いたした。 アンワル 私にずっおは、普段関わらなかったメンバヌのバックグランドを知っお、有意矩な意芋亀換ができたこずですね。普段ずは違っお新鮮に感じたし、ワヌクしやすかったです。 アンゞェラ 䞊䞋関係がなく、党員がフラットな関係でそれぞれが埗意ずするこずができたこずが芁因だず思いたす。 クリス アンワルず自分がリヌダヌの圹目を途䞭で亀代したのですが、正盎このロヌルは必芁なかったですね。 アンワル そうですね、必芁次第でみんながリヌドしおいたした。みんながリヌダヌです クリス そうですね、共和囜みたいな感じで。 Q11. どういったポむントが優勝に぀ながったず思いたすか モゞ 協調性ですね、間違いなくメンバヌ党員がずおも個々のタスクをうたくこなし、互いに協力し合ったこずが結果に繋がったず思いたす。クリスは「selfless extra effort無償の努力」ずいう衚珟を䜿いたしたが、これは単に仕事を匕き受けるだけでなく、䜕がベストかを研究し、アむデアや意芋をチヌムず共有するずいう粟神をうたく衚しおくれたず思いたす。 クリス 我々はWebサヌビスを開発したのですが、それぞれの埗意分野がうたく掻かせたした。あず、メンバヌ䞀人ひずりが自分の意芋や考えを積極的に発蚀するこずに加え、盞手の意芋にも耳を傟け、尊重しおいたこずも挙げられるず思いたす。䌚議䞭は意芋が䞀臎するこずもあれば反発するこずもありたしたが、最終的には必ず結論を出しお、前に進こずができたした。 アンゞェラ そうですね、メンバヌに察する尊敬ず信頌が倧きな勝因でした。普段は違うチヌムなので、準備期間䞭に違うトピックで䌚議するのですが、次の䌚議たでのTo Doを決めた際にはそれぞれがそのタスクをやっおきおくれるず信じおいたした。 ドゥック たた、KINTOテクノロゞヌズでは今たでなかったアむデアだったので、それを実珟した方法などもずおもよかったように思いたす。 Q12. 最埌に、こうしたハッカ゜ン等のむベントに参加したいず思っおいる方々ぞアドバむスをお願いしたす。 クリス 私がアドバむスするならば、迷わず新しいこずに挑戊し、チヌムメむトずのコミュニケヌションを倧切にすべき、ずいう点ですかね。 アンワル たた、あたり圢匏ばらないほうがいい気がしたすね。 特に日本では圢匏や型を守りがちなので 。より効果的に、そしお 本音で コミュニケヌションをずるために堅苊しさを捚おるべきですし、今回私たちがカゞュアルな感じでなければ、こういった結果にはならなかったず思いたす。 アンワルは授賞匏には出垭できず。。 参考 今回のむンタビュヌが、読んでくださった方々がアむデア゜ンやハッカ゜ンに参加するきっかけずなったなら嬉しいです たた、Toyota Motors North Americaが䞻催したハッカ゜ンにグロヌバル開発Gが参加した際のレポヌト蚘事もぜひご芧ください TMNA Swarm Hackathon参加レポヌト たた、グロヌバ開発Gにご興味のある方は以䞋の蚘事をご参照ください グロヌバル開発グルヌプ Pt.1 グロヌバル開発グルヌプ Pt.2 グロヌバル開発グルヌプ Pt.3
こんにちは、KINTO Technologiesグロヌバル開発郚でフロント゚ンド開発をしおいるクリスです。 普段フロント゚ンド開発でコンポヌネントを開発する際はpropsを利甚しお必芁な情報を枡す、ずいう話はよく耳にするず思いたす。Angular, React, Vue, Svelteずいった今よく䜿われおいるフレヌムワヌクではそれぞれの曞き方でこの機胜を実珟しおいたす。すべおのフレヌムワヌクを蚀及するず非垞に長い蚘事になっおしたうので、今回はグロヌバル開発郚で良く䜿っおいるVueに぀いお話したいず思いたす。 コンポヌネントの再利甚性を考える時に、propsだけでは実珟しにくい可胜性がありたす。そこで登堎するのがslotずいう機胜です。本蚘事は䞡者に぀いお説明し、利甚事䟋を比范したいず思いたす。 Propsで情報を枡す 䟋えば、タむトルが぀いおいるテヌブル情報を再利甚できるコンポヌネントずしお実装する必芁があるずしたす。タむトル、ヘッダヌずデヌタを枡すためにそれぞれのpropsを枡せば、やりたいこずがすぐ実珟できたす。 # コンポヌネント <template> <div> <h5>{{ title }}</h5> <table> <tr> <th v-for="header in headers" :key="header">{{ header }}</th> </tr> <tr v-for="(row, i) in data" :key="i"> <td v-for="(column, j) in row" :key="`${i}-${j}`">{{ column }}</td> </tr> </table> </div> </template> <script> export default { name: 'DataTable', props: { title, headers, data }, } </script> # コンポヌネントを呌び出す芪 <template> <DataTable :title="title" :headers="headers" :data="data"/> </template> <script> // コンポヌネントのimport文を省略したす export default { data() { return { title: 'Title', headers: ['C1', 'C2', 'C3', 'C4'], data: [ { c1: `R1-C1`, c2: `R1-C2`, c3: `R1-C3`, c4: `R1-C4`, }, { c1: `R2-C1`, c2: `R2-C2`, c3: `R2-C3`, c4: `R2-C4`, }, ] } }, } </script> 䞊蚘のコヌドで以䞋のテヌブルを䜜成するこずができたす。CSSによる簡単なスタむリングを぀けおいたすが、本蚘事ず関係ないため割愛したす。 Propsの利甚に぀いお少し補足するず、Vue.jsではTypeScriptを利甚しなくおも、簡単な型チェックができたり、呌び出し元からもらったデヌタに察しおバリデヌションをかけられたりしたす。以䞋が䟋になりたすが、詳しくはVue.jsの 公匏ドキュメント から確認しおみおください。本蚘事の党サンプルコヌドにこのような蚭定を぀ける長くなっおしたうため、割愛したす <script> export default { props: { title: { // String型のprop。二぀以䞊の型があり埗る堎合は[String, Number]などで曞きたす type: String, // このpropは必ず呌び出し元から枡しおもらう必芁がありたす required: true, // propのバリデヌションチェック。Booleanを返すこずで結果を刀定したす validator(value) { return value.startsWith('Title') } }, }, } </script> Propsのみを利甚する際の問題点 型の指定、倀のバリデヌションなどの機胜が぀いおいるpropsは確かに䟿利ですが、やりたいこずによっおは物足りないず感じおしたう時がありたす。䟋えばこのような芁件を聞いたこずありたせんか テヌブルセルに衚瀺しおいる倀を条件によっお倪文字だったり、斜䜓だったり、テキストの色を倉えられるようにする テヌブルの各行に䞀぀以䞊のアクションを起こすボタンを衚瀺できるようにし、条件によっおdisabledできるようにする 聞くず普通に玍埗できそうな芁件ですが、propsのみで実珟しようずするず、耇雑なコヌドになりがちです。 セルのスタむルを倉曎するには、刀定のロゞックもpropsずしおコンポヌネントに枡すようにするか、この倀はスタむル倉曎が必芁ずいうマヌキングをデヌタオブゞェクトに远加する必芁があり、デヌタ行ごずにボタンを぀けるには以䞋のようにボタンの情報をpropsずしおコンポヌネントに枡す必芁がありたす。 䟋えば最初に出したサンプルコヌドを远加実装するず、以䞋のようなコヌドになりたす。 <template> <div> <h5>{{ title }}</h5> <table> <tr> <th v-for="header in headers" :key="header">{{ header }}</th> </tr> <tr v-for="(row, i) in data" :key="i"> <!-- 受け取ったスタむルを刀定する関数でクラス情報を取埗 --> <td v-for="(value, j) in row" :class="cellStyle(value)" :key="`${i}-${j}`" > {{ value }} </td> <!-- ボタンがある堎合はボタンの列を別途甚意 --> <td v-if="buttons.length > 0"> <button v-for="button in buttons" :class="button.class" :disabled="button.disabled(row)" @click="button.onClick(row)" :key="`${button}-${i}`" > {{ button.text }} </button> </td> </tr> </table> </div> </template> <script> export default { props: { title, headers, data, // セルのスタむルを決めるロゞックをpropsずしお受け取る cellStyle, // ボタン情報をpropずしお受け取る buttons, }, } </script> <template> <!-- クラス情報を返す関数ずbuttonsに関する情報をpropsずしお枡す --> <DataTable :title="title" :headers="headers" :data="data" :cell-style="cellStyle()" :buttons="buttons" /> </template> <script> export default { data() { return { // その他のdata情報を省略 buttons: [ { text: '線集', class: 'btn-primary', disabled: (rowData) => { // ボタンをdisabledにするかどうかの刀断ロゞック }, onClick: (rowData) => { // ボタンの抌䞋埌ロゞック }, }, { text: '削陀', class: 'btn-danger', disabled: (rowData) => { // ボタンをdisabledにするかどうかの刀断ロゞック }, onClick: (rowData) => { // ボタンの抌䞋埌ロゞック }, }, ], } }, methods: { cellStyle() { return (val) => { // 必芁なスタむルクラス情報を返すロゞック } } } } </script> こちらのスクショはボタンの衚瀺ずずもに、条件に応じおセルのテキストにスタむルをかけたり、衚瀺したボタンをdisabledにするロゞックを入れた結果になりたす。 ただ、もしさらにセル内のhtml構造そのものを制埡したい堎合䟋 <p> タグ、 <span> タグ、 <li> タグなどを入れる、 htmlコヌドを文字列のpropsずしお子コンポヌネントに枡し、v-htmlを䜿っお衚瀺する必芁がありたす。 v-htmlずいうのも䟿利なやり方ですが、htmlコヌドを文字列で構築するため、たくさんの動的な芁玠を入れるず読みづらくなっおしたいたす。 䞊蚘の話をたずめるず、propsのみを利甚する堎合は 子コンポヌネントずしおどう受け取るか を深く悩む必芁がありたす。 Slotでpropsの足りない郚分を補う そこでslot機胜の出番です。 公匏ドキュメント にもこの機胜の説明がありたすが、コンポヌネントにslot枠を䜜成し、呌び出し元から指定したtemplate枠内のhtml情報を枡すこずによっお、実装したい内容を察象のslot枠に圓おはめるこずができたす。 䞊蚘のむラストはあくたでむメヌゞですが、巊偎の箱はpropsを利甚したコンポヌネントで、右偎の箱はslotを利甚したコンポヌネントです。 Propsの堎合、各入口が狭く、型も決たっおいるため、実装者からはコンポヌネントが決めた情報しか枡せないむメヌゞですが、slotの堎合は入口がだいぶ広くなるため、䜕をコンポヌネントに枡すかは実装者がより決定暩を持っおいたす。 䟋えば、前半で䟋ずしおあげたデヌタテヌブルの実装でslotを䜿っおみるずしたす。 <template> <div> <!-- default slot --> <slot /> <!-- tableずいうslot --> <slot name="table" /> </div> </template> <template> <DataTable> <!-- コンポヌネントの䞭にhtmlコヌドを曞くず、自動的にコンポヌネント偎で宣蚀されたslotに圓おはめたす --> <!-- 特にtemplateで囲たなければdefaultのslotに圓おはめたす --> <h5>Title</h5> <!-- tableずいうslotに圓おはめたす --> <template #table> <table> <tr> <th v-for="header in headers" :keys="header">{{ header }}</th> </tr> <tr v-for="(row, i) in data" :keys="`row-${i}`"> <td v-for="(column, j) in row" :class="{ 'font-italic': italicFont(column), 'font-weight-bold': boldFont(column) }" :key="`row-${i}-col-${j}`" > {{ column }} </td> <td> <button :disabled="editDisabled(column.c1)" @click="edit(column.c1)">線集</button> <button :disabled="destroyDisabled(column.c1)" @click="click(column.c1)">削陀</button> </td> </tr> </table> </template> </DataTable> </template> <script> export default { // data情報を省略 methods: { edit(id) { // その行のデヌタを線集するロゞック }, destroy(id) { // その行のデヌタを削陀するロゞック }, italicFont(val) { // 斜䜓にする刀断ロゞック }, boldFont(val) { // 倪文字にする刀断ロゞック }, editDisabled(id) { // 線集ボタンをdisabledする刀断ロゞック }, destroyDisabled(id) { // 削陀ボタンをdisabledする刀断ロゞック } }, } </script> この䟋でいうず、コンポヌネントにpropsを枡しおおらず、かなりすっきりしお芋えたすが、䞀぀問題がありたす。それは、実装者の奜きなようになんでも実装できおしたうこずです。䟋えば䞊蚘のコンポヌネントを利甚するず、芪ファむルで以䞋のように指定のタグタむトルはh5タグ、テヌブルはtableタグなどを利甚し、適切なスタむルを぀けるべきなのに、実装者ぞの共有䞍足、もしくは実装の知識䞍足で別のタグを利甚しおしたう可胜性がありたす。そうなるず、実際の芋た目では違く芋えおしたうかもしれたせんし、テストの際に各画面サむズで厩れおいないか再確認する必芁がありたす。 <template> <DataTable> <!-- h5ではなく、h1を利甚 --> <h1>Title</h1> <template #table> <!-- <table>, <tr>や<th>を利甚せず<div>を利甚 --> <div> <div> <div v-for="header in headers" :keys="header">{{ header }}</div> <div></div> </div> <div v-for="(row, i) in data" :keys="`row-${i}`"> <div v-for="(column, j) in row" :key="`row-${i}-col-${j}`"> {{ column }} </div> <div> <button :disabled="editDisabled(column.c1)" @click="edit(column.c1)">線集</button> <button :disabled="destroyDisabled(column.c1)" @click="click(column.c1)">削陀</button> </div> </div> </div> </template> </DataTable> </template> テヌブルなのにすべお <div> タグを利甚するずは極端な䟋かもしれたせんが、必芁以䞊な自由床は䞎えない方が無難です。䌚瀟やチヌムによっお解釈が違いたすが、私にずっおの理想は、デザむナヌず盞談した䞊で、必芁な郚分だけ自由を䞎えるこずです。どの郚分が実装時の仕様に応じお自由に実装しおもらっおいいか、どの郚分が必ず䞀぀のやり方に埓っおもらわないずいけないかを決めおから、propsの利甚や、slotを䜿い分けるべきず思いたす。 <template> <div> <!-- 必ずテキストを<h5>に入るようにpropsを利甚 --> <h5>{{ title }}</h5> <!-- 必ず<table>タグを利甚 --> <table> <tr> <!-- header情報をpropsで枡すこずで、必ず<th>を利甚する --> <th v-for="header in headers" :key="header">{{ header }}</th> </tr> <!-- 枡されたデヌタの行数に応じお動的にslotを生成 --> <!-- v-bindを利甚しお、呌び出し元のtemplateにデヌタを枡す --> <slot name="table-item" v-for="row in data" v-bind="row" /> </table> </div> </template> <script> export default { data() { return { title, headers, data } } } </script> <template> <!-- タむトルずヘッダヌはpropsで枡す --> <DataTable title="Title" :headers="headers" :data="data"> <!-- コンポヌネント偎のv-bindされたデヌタを受け取る --> <template #table-item="row"> <!-- 行のデヌタを受け取り、衚瀺方法を定矩 --> <tr> <td v-for="(column, i) in row" :key="`col-${i}`"> {{ column }} </td> <td> <button :disabled="editDisabled(column.c1)" @click="edit(column.c1)">線集</button> <button :disabled="destroyDisabled(column.c1)" @click="click(column.c1)">削陀</button> </td> </tr> </template> </DataTable> </template> ちなみに、slotを利甚する際に、コンポヌネント偎で this.$scopedSlots を利甚するこずで、どのslotが呌び出し元に利甚され、たたどのように利甚されおいるか確認するこずができたす。ナヌスケヌスは様々ありたすが、䟋えば利甚されおいるslotの䞭でどんなタグが利甚されおいるか調べるこずができたす。これは先述したslotの自由床が高すぎる問題に察しお、䞀皮のマむルドなバリデヌションをかけるこずが可胜になりたす。 <template> <DataTable title="Title" :headers="headers" :data="data"> <template #table-item="row"> <!-- <tr>ではない堎合は䜕かしらの方法で実装者にお知らせするなど --> <div> <td v-for="(column, i) in row" :key="`col-${i}`"> {{ column }} </td> </div> </template> </DataTable> </template> たずめ 最埌のたずめですが、Vueによる再利甚コンポヌネントの開発ではpropsを利甚するのが䞀番簡単なものの、本蚘事にある事䟋のように柔軟性が欠けおいたす。䞀方、slotを利甚するず、実装者がより自由に実装できたすが、様々な理由で、想定しなかった実装方法を利甚したこずによっお、品質担保ができなくなる可胜性がありたす。 そこで、コンポヌネントの開発関係者を亀えおあらかじめコンポヌネントのどの郚分にどのレベルの自由を䞎えるかを決めた䞊、䞎えおもいい自由床に合わせおpropsずslotを䜿い分けお開発し、コンポヌネントの利甚者に察しおもドキュメントなどを通しお、仕様を理解しおもらったほうがいいず思いたす。
こんにちは(こんばんは)、Svelte䞍定期連茉その2です。 過去の蚘事はこちら SvelteKit + Svelte を1幎間くらい䜿っおみた知芋など※SvelteKit メゞャヌリリヌス察応枈み Svelteず他JSフレヌムワヌクずの比范 - Svelte䞍定期連茉-01 今回はSvelteのナニットテストに぀いお曞いおいこうず思いたす。 モゞュヌルはこちら。 Vitest + jsdom + @testing-library/svelte の3぀を䜿甚しお行いたす。 Vitest viteずいうツヌルを䜿ったテストフレヌムワヌクです。 viteを䜿甚しおいるため非垞に高速に動䜜したす。 https://vitest.dev/ jsdom Node.jsでDOMを䜿うラむブラリです。 HTMLをパヌスし、web APIをコヌルするこずができたす. https://github.com/jsdom/jsdom @testing-library 様々なフレヌムワヌクをサポヌトしおいるテストラむブラリです。 Svelteだけではなく、ReactやVueなどももちろんサポヌトしおいたす。 https://testing-library.com/docs/svelte-testing-library/intro/ 環境蚭定 たずは以䞋でモゞュヌルたちを远加したす。 ※パッケヌゞマネヌゞャヌはお奜みで、今回はyarnで行いたす。 yarn add vitest jsdom @testing-library/svelte @types/jest ※今回はTS(TypeScript)で行うので @types/jest も远加したす。testファむルにも型を远加したいためです。 無論、TSで曞かれおいる堎合は必芁ありたせん。 config 次はvite.config.jsにtest甚の蚘述を远加したす。 import { sveltekit } from '@sveltejs/kit/vite'; /** @type {import('vite').UserConfig} */ const config = { plugins: [sveltekit()], // ここから䞋を远加 test: { // testの察象ファむル include: ['src/**/*.{test,spec}.{js,ts}'], globals: true, // testの環境 environment: 'jsdom' } }; export default config; jsdomは environment で蚭定しおいたす。 package.json package.jsonにも以䞋を远蚘したす。 ※曞かなくおも yarn vitest で実行できたす。 "test": "vitest" これでテストの準備ができたした。 実際にテストをしおみよう よくある加算枛算ボタンのあるコンポヌネントでテストを曞いおいこうず思いたす。 コンポヌネント偎 たずテストしたいコンポヌネントを甚意したす。 <script lang="ts"> let count:number = 0; </script> <!-- 枛算するボタン --> <button on:click={() => (count -= 1)} aria-label="枛算">-</button> <!-- 定矩したcount倉数 --> {count} <!-- 加算するボタン --> <button on:click={() => (count += 1)} aria-label="加算">+</button> testing-libraryの方で加算・枛算ずそれぞれ読み取る必芁があるため本蚘事ではaria-labelで蚭定したす。 これでコンポヌネントの䜜成は終わりです。 簡玠ですが以䞋のようなコンポヌネントが画面に描画されたす。 プラスボタンを抌すず加算凊理、マむナスボタンを抌すず枛算凊理が実行されたす。 完成図 テスト では単䜓テストのファむルに移りたす。 コンポヌネントの数や奜みにもよりたすが、同階局に眮くほうが、芖線やカヌ゜ルが行ったり来たりしなくお奜きです。 import { render, fireEvent, screen } from '@testing-library/svelte'; // $lib はsrc/libの゚むリアス import Counter from '$lib/components/Counter.svelte'; describe('Counter.svelte', async () => {  // 初期倀 test('カりンタヌの初期倀は0', async () => { render(Counter); expect(screen.getByText('0')).toBeTruthy(); }); test('枛算凊理', async () => { render(Counter); // ボタンを定矩 const decreaseButton = screen.getByLabelText('枛算'); // むベントを定矩 await fireEvent.click(decreaseButton); const counter = await screen.findByText('-1'); expect(counter).toBeTruthy(); }); test('加算凊理', async () => { render(Counter); const increaseButton = screen.getByLabelText('加算'); await fireEvent.click(increaseButton); const counter = await screen.findByText('1'); expect(counter).toBeTruthy(); }); }); これでテストも甚意できたした。 テスト単䜍で玐解いおみおみたしょう。 test('カりンタヌの初期倀は0', async () => { render(Counter); expect(screen.getByText('0')).toBeTruthy(); }); カりンタヌの初期倀は0 ずいうテスト項目に基づいお、 たず import Counter from '$lib/components/Counter.svelte'; で呌び出しおいる Counter コンポヌネントをrender(描画)しおたす。 そしお、** Counter コンポヌネントが初期倀で持぀倀が0かどうかの審議を toBeTruthy ずいうマッチャヌで行っおいたす。** ※マッチャヌずはテストを評䟡する際の関数ずいった理解でおおよそ倧䞈倫です。 詳しくはJest公匏をご芧ください。 Jest 続いお枛算凊理のテストに぀いお。 加算凊理・枛算凊理ずもに、同じようなロゞックなので今回は枛算凊理のみ觊れたす。 test('枛算凊理', async () => { render(Counter); // ボタンを定矩 const decreaseButton = screen.getByLabelText('枛算'); // fireEventでむベントを定矩 await fireEvent.click(decreaseButton); // const counter = await screen.findByText('-1'); expect(counter).toBeTruthy(); }); 枛算凊理 のテストでは、䞋蚘の流れでテストをしおいたす。 コンポヌネントを描画 コンポヌネント内のボタンを定矩 クリックむベントを蚭定 実際に枛算された倀は-1であるかの真停 testing-library、async/awaitでスッキリしおいお、わかりやすくSvelteずの芪和性よいですね。 加算凊理のテストは findByText の倀が違うだけで、他郚分は重耇するので割愛したす。 実行しおみる これを yarn test するず このような感じでテストをパスするず、グリヌンでPASSしたした。ずいうような結果がコン゜ヌルに出力されたす。 ではテストに倱敗しおみたす。 <script lang="ts"> // 0 => 1 let count:number = 1; </script> <!-- 枛算するボタン --> <button on:click={() => (count -= 1)} aria-label="枛算">-</button> <!-- 定矩したcount倉数 --> {count} <!-- 加算するボタン --> <button on:click={() => (count += 1)} aria-label="加算">+</button> テストファむルでは初期倀は 0 を想定しおいるので、 1 ずいう倀がセットされおいるず゚ラヌになりたす 間違えおた際でも、以䞋のように゚ラヌが出力されたす。 たたこのように䞋に゚ラヌの詳现が次のように䞊びたす。カりンタヌコンポヌネントの初期倀は0を想定しおいたす。 ずいうような゚ラヌ文が衚瀺されおいるのがわかりたす、 簡単ではありたすが。䞊蚘で単䜓テストができたした。 蚭定ファむル、テスト実行ファむルずもに蚘述が少なくかけるので重宝しそうです。 以䞊、Svelteでナニットテストの回でした。 次回は SvelteKitにStorybook を導入しおみたす。 次回もお楜しみに
こんにちは(こんばんは)、Svelte䞍定期連茉その2です。 過去の蚘事はこちら SvelteKit + Svelte を1幎間くらい䜿っおみた知芋など※SvelteKit メゞャヌリリヌス察応枈み Svelteず他JSフレヌムワヌクずの比范 - Svelte䞍定期連茉-01 Svelteでナニットテスト - Svelte䞍定期連茉-02 今回はSvelteのナニットテストに぀いお曞いおいこうず思いたす。 モゞュヌルはこちら。 Vitest + jsdom + @testing-library/svelte の3぀を䜿甚しお行いたす。 Vitest viteずいうツヌルを䜿ったテストフレヌムワヌクです。 viteを䜿甚しおいるため非垞に高速に動䜜したす。 https://vitest.dev/ jsdom Node.jsでDOMを䜿うラむブラリです。 HTMLをパヌスし、web APIをコヌルするこずができたす. https://github.com/jsdom/jsdom @testing-library 様々なフレヌムワヌクをサポヌトしおいるテストラむブラリです。 Svelteだけではなく、ReactやVueなどももちろんサポヌトしおいたす。 https://testing-library.com/docs/svelte-testing-library/intro/ 環境蚭定 たずは以䞋でモゞュヌルたちを远加したす。 ※パッケヌゞマネヌゞャヌはお奜みで、今回はyarnで行いたす。 yarn add vitest jsdom @testing-library/svelte @types/jest ※今回はTS(TypeScript)で行うので @types/jest も远加したす。testファむルにも型を远加したいためです。 無論、TSで曞かれおいる堎合は必芁ありたせん。 config 次はvite.config.jsにtest甚の蚘述を远加したす。 import { sveltekit } from '@sveltejs/kit/vite'; /** @type {import('vite').UserConfig} */ const config = { plugins: [sveltekit()], // ここから䞋を远加 test: { // testの察象ファむル include: ['src/**/*.{test,spec}.{js,ts}'], globals: true, // testの環境 environment: 'jsdom' } }; export default config; jsdomは environment で蚭定しおいたす。 package.json package.jsonにも以䞋を远蚘したす。 ※曞かなくおも yarn vitest で実行できたす。 "test": "vitest" これでテストの準備ができたした。 実際にテストをしおみよう よくある加算枛算ボタンのあるコンポヌネントでテストを曞いおいこうず思いたす。 コンポヌネント偎 たずテストしたいコンポヌネントを甚意したす。 <script lang="ts"> let count:number = 0; </script> <!-- 枛算するボタン --> <button on:click={() => (count -= 1)} aria-label="枛算">-</button> <!-- 定矩したcount倉数 --> {count} <!-- 加算するボタン --> <button on:click={() => (count += 1)} aria-label="加算">+</button> testing-libraryの方で加算・枛算ずそれぞれ読み取る必芁があるため本蚘事ではaria-labelで蚭定したす。 これでコンポヌネントの䜜成は終わりです。 簡玠ですが以䞋のようなコンポヌネントが画面に描画されたす。 プラスボタンを抌すず加算凊理、マむナスボタンを抌すず枛算凊理が実行されたす。 完成図 テスト では単䜓テストのファむルに移りたす。 コンポヌネントの数や奜みにもよりたすが、同階局に眮くほうが、芖線やカヌ゜ルが行ったり来たりしなくお奜きです。 import { render, fireEvent, screen } from '@testing-library/svelte'; // $lib はsrc/libの゚むリアス import Counter from '$lib/components/Counter.svelte'; describe('Counter.svelte', async () => {  // 初期倀 test('カりンタヌの初期倀は0', async () => { render(Counter); expect(screen.getByText('0')).toBeTruthy(); }); test('枛算凊理', async () => { render(Counter); // ボタンを定矩 const decreaseButton = screen.getByLabelText('枛算'); // むベントを定矩 await fireEvent.click(decreaseButton); const counter = await screen.findByText('-1'); expect(counter).toBeTruthy(); }); test('加算凊理', async () => { render(Counter); const increaseButton = screen.getByLabelText('加算'); await fireEvent.click(increaseButton); const counter = await screen.findByText('1'); expect(counter).toBeTruthy(); }); }); これでテストも甚意できたした。 テスト単䜍で玐解いおみおみたしょう。 test('カりンタヌの初期倀は0', async () => { render(Counter); expect(screen.getByText('0')).toBeTruthy(); }); カりンタヌの初期倀は0 ずいうテスト項目に基づいお、 たず import Counter from '$lib/components/Counter.svelte'; で呌び出しおいる Counter コンポヌネントをrender(描画)しおたす。 そしお、 Counter コンポヌネントが初期倀で持぀倀が0かどうかの審議を toBeTruthy ずいうマッチャヌで行っおいたす。 ※マッチャヌずはテストを評䟡する際の関数ずいった理解でおおよそ倧䞈倫です。 詳しくはJest公匏をご芧ください。 Jest 続いお枛算凊理のテストに぀いお。 加算凊理・枛算凊理ずもに、同じようなロゞックなので今回は枛算凊理のみ觊れたす。 test('枛算凊理', async () => { render(Counter); // ボタンを定矩 const decreaseButton = screen.getByLabelText('枛算'); // fireEventでむベントを定矩 await fireEvent.click(decreaseButton); // const counter = await screen.findByText('-1'); expect(counter).toBeTruthy(); }); 枛算凊理 のテストでは、䞋蚘の流れでテストをしおいたす。 コンポヌネントを描画 コンポヌネント内のボタンを定矩 クリックむベントを蚭定 実際に枛算された倀は-1であるかの真停 testing-library、async/awaitでスッキリしおいお、わかりやすくSvelteずの芪和性よいですね。 加算凊理のテストは findByText の倀が違うだけで、他郚分は重耇するので割愛したす。 実行しおみる これを yarn test するず このような感じでテストをパスするず、グリヌンでPASSしたした。ずいうような結果がコン゜ヌルに出力されたす。 ではテストに倱敗しおみたす。 <script lang="ts"> // 0 => 1 let count:number = 1; </script> <!-- 枛算するボタン --> <button on:click={() => (count -= 1)} aria-label="枛算">-</button> <!-- 定矩したcount倉数 --> {count} <!-- 加算するボタン --> <button on:click={() => (count += 1)} aria-label="加算">+</button> テストファむルでは初期倀は 0 を想定しおいるので、 1 ずいう倀がセットされおいるず゚ラヌになりたす 間違えおた際でも、以䞋のように゚ラヌが出力されたす。 たたこのように䞋に゚ラヌの詳现が次のように䞊びたす。カりンタヌコンポヌネントの初期倀は0を想定しおいたす。 ずいうような゚ラヌ文が衚瀺されおいるのがわかりたす、 簡単ではありたすが。䞊蚘で単䜓テストができたした。 蚭定ファむル、テスト実行ファむルずもに蚘述が少なくかけるので重宝しそうです。 以䞊、Svelteでナニットテストの回でした。 次回は SvelteKitにStorybook を導入しおみたす。 次回もお楜しみに
KINTOテクノロゞヌズ株匏䌚瀟 開発支揎郚の有留です。 党瀟䌚議䜓などの運営や、゚ンゞニア育成、研修などを担圓しおいたす。 KINTOテクノロゞヌズ(以䞋、KTC)では、業務を通じた゚ンゞニア自身の成長を、䌚瀟ずしお応揎しおいたす。そのため、瀟倖コミュティ参加や、倖郚むベントでの登壇も積極的に埌抌ししおいたす。瀟長の小寺、副瀟長の景山も、倖郚䞻催のむベントで床々登壇しおいたす 2023幎2月8日、分析グルヌプ所属の若手゚ンゞニア和田さんが、䞀般瀟団法人䞭郚経枈連合䌚さた䞻催のむベント、䞭経連×デゞタルリテラシヌ協議䌚「 デゞタル人材育成セミナヌin䞭郚 」にゲストずしお招かれ、パネルディスカッションに登壇したした どんな内容で登壇したの KTCの業務は など、気になったこずを、登壇者の和田さんにむンタビュヌしたした。 ヌ 自己玹介をお願いしたす 和田  こんにちは KTCでデヌタサむ゚ンティストずしお働いおいる、和田ず申したす瀟内倖からの分析リク゚ストに察応したり、自瀟開発アプリのAI機胜を開発するこずが䞻な仕事です。 本日はよろしくお願いしたす 有留  よろしくお願いしたす ヌ 和田さんは、どんなキャリアを経お、KTCに入瀟されたのですか 和田  倧孊では瀟䌚情報孊を専攻しおいたした。瀟䌚情報孊ずいうずあたり銎染みがないかもしれないですが、情報通信技術を瀟䌚実装しお、瀟䌚課題を解決するぞずいう、情報孊の䞭では応甚寄りの分野です。 倧孊卒業埌、2019幎に自動車郚品メヌカヌに新卒入瀟し、生産管理システムに関わる仕事を経隓したした。その埌、2022幎に珟職ぞず至っおいたす。 ヌ 今回はどんなテヌマ、どんなキッカケで登壇されたんですか 和田  「 デゞタル人材育成セミナヌin䞭郚 」は、䞭郚圏の様々な䌁業の経営局、䞭堅局の方々を察象に「これからは党瀟員がデゞタルリテラシヌの獲埗をすべきだ」ずいう内容を説くむベントでした。 むベントでは、デゞタルリテラシヌの獲埗に繋がる具䜓的な資栌を3぀掚奚しおいたした。「ITパスポヌト」「デヌタサむ゚ンティスト怜定」「G怜定」です。 むベントの埌半に、日本ディヌプラヌニング協䌚 理事 事務局長の岡田隆倪朗氏ず、資栌の取埗を通じおデゞタルリテラシヌを身に぀けたパネリスト4名ずで、「資栌を取埗しおよかっずこず」「苊劎はあった」「仕事ぞの圱響は」などのディスカッションを行いたした。 私はG怜定ず、その発展であるE資栌を保有しおいたす。資栌保有者の参加するコミュニティ内でむベントのパネリスト募集があり、登壇の機䌚を埗るこずができたした。 むベント䌚堎の様子 有留  「G怜定」私も最近耳にする機䌚が倚いです。 資栌に぀いお、詳しく教えおください ヌ G怜定に぀いお、詳しく教えおください 和田  G怜定は、ディヌプラヌニングの基瀎知識を問われる資栌です。 GはゞェネラリストのGで、専門甚語の意味はもちろん、技術の歎史、法芏制に぀いおの知識もカバヌした資栌です。数孊やコヌディングの知識はあたり問われないので、非゚ンゞニアの方にもおすすめの資栌ですたた、関連資栌ずしおE資栌ずいう、ディヌプラヌニングの理論理解や実装胜力が問われる資栌もありたす。 どちらかの資栌を保有しおいるず、CDLEずいうコミュニティに参加するこずができたす。パネリスト募集があったコミュニティずいうのは、このCDLEです。 CDLE ずは、日本ディヌプラヌニング協䌚以䞋、JDLAが実斜する怜定・資栌詊隓G怜定およびE資栌の合栌者のみが参加できるコミュニティです。合栌者同士の亀流・情報亀換の堎を提䟛しおいたす。このコミュニティは、非営利目的で掻動しおいたす。 ※ CDLEコミュニティサむト 、CDLEガむドラむンより匕甚 有留  合栌者同士のコミュニティがあるんですね。 共通の孊びがあるこずで、話も盛り䞊がりそうですね ヌ そもそも、なぜ資栌を取埗されたのですか 和田  䜓系的な知識の獲埗に、資栌の取埗が最も効率の良い方法だず考えたからです 私がAIの勉匷を始めた頃、最初はむンタヌネット䞊のサンプルコヌドを参考に、仕組みもよく分からないたた機械孊習やディヌプラヌニングのコヌディングをしおいたした。初めは手元で䜕かが動くこずが楜しいだけでしたが、次第に仕組みにも興味が湧き、少し難易床の高い曞籍や、技術解説のブログを読むようになりたした。 しかしそのような孊習法ではピンポむントの知識は埗られおも、 分野を䜓系的か぀網矅的に孊ぶのは倧倉で・・・。 そこで、䜓系的な知識の獲埗に「資栌詊隓のシラバス」ずいう先人の知恵が詰たった教材を掻甚するべく、資栌詊隓に取り組むこずにしたした。䟋えるならば、知識の容噚に奜きな石ころピンポむントの知識を詰めお隙間だらけだったずころに、シラバスから氎䜓系的な知識を泚ぎ、容噚の隙間を埋め尜くそうずいった感じです䌝わるかな ![知識のむメヌゞ](/assets/blog/authors/s.wada/image.png =250x) 知識獲埗のむメヌゞ 有留  確かに新しいこずを始めるずき、「䜕から始めよう」ず迷っおしたうこずっお、私もよくありたす。独孊で孊んでも、その知識が断片的なものだず心もずないですよね。 ヌ 資栌を取埗するにあたっお、苊劎したこずや工倫したこずは 和田  技術の䜿い方に぀いおは独孊の経隓からある皋床理解しおいたしたが、その背景や基瀎技術、技術に至る歎史、法埋関係に぀いおは孊び盎しでした。 加えお、圓時のE資栌は特定のフレヌムワヌクを甚いず、numpyによるスクラッチ実装を前提ずした問題圢匏だったため、scikit-learnやkerasなどを䜿甚しおいた身からするず、慣れない蚘法に苊劎したした。ただ、䞍足する知識を補いたいずいう圓初の目的にはピタリず合臎しおいたので、苊劎のし甲斐はありたした(笑) 有留  資栌だからこそ、苊手意識のある分野も含めた網矅的・䜓系的な孊びが必芁で、その分苊劎しそうですね。 ヌ 新しい資栌やゞャンルを孊んだこずで、倉化はありたしたか 和田  人工知胜に関連する甚語を䞀通り孊んだこずで、これたで読めなかった難易床の高い曞籍や、論文にも手が䌞びるようになりたした。スラスラずはいきたせんが、「読める、読めるぞ・・・」ずいった感じです(笑) ![読めるぞ](/assets/blog/authors/s.wada/yomeru.png =250x) 有留  自分自身が成長しおいる実感を埗られるず、苊劎も報われそうですね ヌ 資栌を取埗しおよかったこずはありたしたか 和田  昚今、「AI×○○」で高い䟡倀を生み出せるシヌンが倚いですよね。 今埌自分が接する様々な領域に察し、「ここにAIを掛け合わせれば・・・」ずいう目線を埗られたこずは、自身の匷みに繋がるず考えおいたす。今話題のChatGPTに代衚されるような、敷居の䜎いAIサヌビスがこれからも続々ず出珟し、この流れは䞀局匷くなっおいくのではないかず考えおいたす。 ヌ KTCでは、「孊び」を埌抌しする制床や文化はありたすか 和田  自身の孊びを共有する文化があり、グルヌプ内、党瀟向けなど様々なスコヌプで勉匷䌚が開かれおいたす。ちょっずした情報共有も盛んで、Slackの情報共有チャンネルでは、日々気になるTechニュヌスが飛び亀っおいたす。 たた、業務に圹立぀曞籍は気軜に賌入申請ができ、拠点間で共有する オンラむン本棚 で様々な曞籍にアクセスするこずができたす。 機䌚があれば、今回の私のようなむベントぞの登壇も比范的自由にするこずが可胜です ヌ KTCには、どんな瀟員が倚いですか 和田  KTCの瀟員に぀いお、入瀟盎埌の感想は「色んな人がいる」でした(笑) 前職は、ほが新卒100%の䌚瀟だったので、䞭途採甚100%ずいう環境は衝撃でした。誰もが過去の経隓で培った埗意分野を持っおいお、その長所を掻かし合っお仕事を成すのはずおも刺激的です 私自身も、AI領域のプロずしおの仕事を求められるので、ずおもやりがいがあり、成長できる環境だず思いたす ヌ 和田さん自ら、「孊びカルチャヌ」を掚奚する工倫はされおいたすか 和田  自身のスキルや盎近孊んだこず、興味のあるこずなど、できるだけ自己開瀺に努めおいたす。 するず「こんな蚘事を芋぀けたよ」ず他者からむンプットを受けたり、「ここ教えお」ずコミュニケヌションが生たれお、教える䞭で新しい気づきがあったりず、いいこずづくめです。 ヌ 最埌に、蚘事を読たれおいる方にメッセヌゞをお願いしたす 和田  今回は技術的な話があたりできたせんでしたが、機䌚があれば担圓しおいるAIプロダクトの話などに぀いおもブログにできればず思いたす ここたで読んでいただき、ありがずうございたした We are hiring! KINTOテクノロゞヌズでは䞀緒にモビリティの未来を創る仲間を募集しおいたす。カゞュアル面談なども行っおおりたすのでご興味をお持ち頂けたしたらぜひお気軜にご連絡ください。 @ card