Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

ChatGPTでPythonのdiagramsを使ってAWSのサービス構成図生成コードを作ってもらう

夏の暑さもだいぶ落ち着いてきていよいよ秋めいてきました、そろそろサンマがおいしい季節ですね、菅野です。

AWSを用いて様々なアーキテクチャを作成することが可能ですが、どういった構成になっているのかを一目で表すには図が効果的です。
手動でPowerPointや、draw.io等の作図ツールを用いて作成することも多いのではないか、と思いますが、ChatGPTで簡単に出力できたら便利ですよね。

Advanced Data Analysysの動作環境ではDiagramsライブラリがインストールされていないため、Pythonコードを直接ChatGPTで動かして構成図を出力してもらうことはできませんでした。
なので、今回はChatGPTにPythonのライブラリDiagramsを用いてクラウドの構成図を作成するPythonコードを作成してもらいましょう。

今回の検証ではGPT-4モデルを利用します。

Diagrams

Pythonのライブラリで、AWS、Azure、k8sといった様々なクラウド、サービスの構成図を作成するためのライブラリです。 diagrams.mingrammer.com

Diagramsを用いる準備

Diagramsを用いて構成図を作成するため、ローカル環境に以下の準備を実施します。

diagramsのインストール

以下のコマンドを実行してdiagramsをインストールします。

pip install diagrams

graphvisのインストール

diagramsでは、graphvisを用いて図の作成をします。
以下のサイトからgraphvisをインストールしましょう。

graphviz.gitlab.io

Windowsでのインストール実行時にはPathに追加するオプションがデフォルトオフになっていますが、追加するようにするとスムーズに利用できます。
入れ忘れてしまった場合には手動で実行ディレクトリをPathに追加しましょう。

クラウドアーキテクチャ図を作成してもらう

下準備がととのったので、さっそくChatGPTでクラウドの構成図を作成してもらいましょう。

Webアプリケーションの例

WebアプリケーションをAWSで作成した場合の構成図を作成してもらいましょう。

(中略)

出力されたコードを実行したところエラーが発生したため、何度か修正を実施してもらいました。
(中略)
ただしこの出力でもVPCGatewayEndpointのimportエラーが発生しました。このあと何パターンか試したのですが、ChatGPTの出力ですと、importするモジュールのパッケージを間違えるケースが散発しました。このあともう1回やり取りして、最終的に修正されたものが次のコードです 。

from diagrams import Cluster, Diagram
from diagrams.aws.network import Route53, ELB, VPC, Endpoint  # <-- 修正箇所
from diagrams.aws.compute import EC2
from diagrams.aws.storage import S3
from diagrams.aws.database import RDS

with Diagram("Web Application Architecture", show=False):
    dns = Route53("dns")
    
    with Cluster("VPC"):
        with Cluster("ELB"):
            load_balancer = ELB("ELB")
            dns >> load_balancer
            
            with Cluster("EC2 Cluster"):
                ec2_1 = EC2("EC2 AZ1")
                ec2_2 = EC2("EC2 AZ2")
                load_balancer >> ec2_1
                load_balancer >> ec2_2

        db = RDS("RDS")
        ec2_1 >> db
        ec2_2 >> db
        
    s3_bucket = S3("S3 Bucket")
    vpc_endpoint = Endpoint("VPC Endpoint")  # <-- 修正箇所
    
    ec2_1 >> vpc_endpoint >> s3_bucket
    ec2_2 >> vpc_endpoint >> s3_bucket

実行した結果以下のファイルが出力されました。

矢印が変なところもありますが、おおむね期待した形に出力できていますね。

機械学習を行う構成

AWSでは機械学習もサポートしています。
そちらを用いた構成図を作成してもらいましょう。

ただしこの出力でもまたimportエラーが発生しました。SageMakerのところです
ChatGPTにSageMakerのImport元を修正する案を出してもらいましたが、それでもエラーは解消しませんでした。

SageMakerモジュールは現在のドキュメントを見ると、diagrams.aws.ml には存在しているみたいですがSageMakerではなくSagemakerとなっている模様です。
DiagramsのGithubからSageMaker部分のコードを確認しても、SageMakerのモジュール名は2020年時点ですでにSagemakerであったのでChatGPTのモデルの学習データにないから出力できないというわけではなさそうです。
考えうる可能性としては一般的に利用されているSageMakerという語に引っ張られてしまっている可能性がありますね。

手動で修正した結果は以下です。

from diagrams import Diagram
from diagrams.aws.compute import Lambda
from diagrams.aws.network import APIGateway
from diagrams.aws.ml import Sagemaker
from diagrams.aws.storage import S3

with Diagram("Machine Learning App on AWS", show=False):
    api_gateway = APIGateway("API Gateway")
    lambda_function = Lambda("Lambda")
    sagemaker = Sagemaker("SageMaker")
    s3 = S3("Model in S3")

    api_gateway >> lambda_function >> sagemaker >> s3

実行して出力した結果が以下です。

APIGatewayを介して学習を実行、実行に用いたデータ、出力結果等を保存するアーキテクチャ図が作成されました。

Fargate(ECS)を用いた構成図

Fargate(ECS)を用いたAWSの構成も作ってもらいましょう。

追加でChatGPTに以下の修正をしてもらいました

  • コンテナのアイコンにFargateのアイコンを使っていたのでコンテナのアイコンを使うようにした。
  • Fargateのクラスター内にFargateのアイコンを置いてもらった。
  • ECSのクラスター内にECSのアイコンを置いてもらった。

また、DynamoDBのモジュール名(Dynamodb)がサービス名のDynamoDBに引っ張られて間違っているため手動で直しました。
最終的な出力はこちら。

from diagrams import Cluster, Diagram
from diagrams.aws.compute import ECS, Fargate, ElasticContainerServiceContainer
from diagrams.aws.network import CloudFront, ELB
from diagrams.aws.database import Dynamodb

with Diagram("Web Application Architecture with AWS Fargate and ECS", show=False):
    
    # CloudFront
    cloudfront = CloudFront("CloudFront")
    
    # LoadBalancer
    load_balancer = ELB("LoadBalancer")
    cloudfront >> load_balancer

    with Cluster("ECS Cluster"):
        ecs_icon = ECS("ECS Service")
        
        # Fargate
        with Cluster("Fargate Cluster"):
            fargate_icon = Fargate("Fargate Service")
            containers = [ElasticContainerServiceContainer("Container 1"), 
                          ElasticContainerServiceContainer("Container 2"), 
                          ElasticContainerServiceContainer("Container 3")]
            
            fargate_icon >> containers
            load_balancer >> fargate_icon
        
    # DynamoDB
    dynamodb = Dynamodb("DynamoDB")
    containers >> dynamodb

実行した結果の画像がこちら。

幾つか指示を出して途中で修正してもらいましたが、意図通りの出力ができました。

まとめ

ChatGPTを用いてAWSの構成図を作成するPythonコードを作成してもらいました。
正式サービス名と異なる一部のモジュールに関しては、正式サービス名に引っ張られエラーになる可能性が高いです。 エラーが出た場合はおとなしくDiagramsのドキュメントを参照し手動で修正した方が早そうでした。
今後もChatGPTでどういった使い方ができるか探求していこうと思います。

Acroquest Technologyでは、キャリア採用を行っています。
  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSクラウドサービスを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長
  少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。 www.wantedly.com