月21日


TLドクター


私は別の#CloudGuruChallenge.今月我々はRedicisのために弾力性を実装することによってPythonアプリのパフォーマンスを改善するために挑戦しました.
アプリケーションのパフォーマンスが業界で大きな話題になっているので、このチャレンジは本当に面白いと思いました.PythonとRedisは既に複数回使用しています.
残念ながら、この挑戦に必要なサービスの性質のため、私はServerlessなアプローチを取ることができなかった.それはまた、私があなたがこれを読んでいる時までに既にリソースを引き裂いたことを意味します.私は私たちのためにいくつかの写真を楽しんだが心配しないでください!

データベース応答



キャッシュレスポンス



あなたがコードをチェックアウトしたいか、LinkedInに接続したいならば、下記を見てください.
ギタブ
https://github.com/wheelers-websites/CloudGuruChallenge_21.06
リンケディン
要件に加えて、私は上とそれ以降に行くことを決めた.その興味の場合は、読んでください!

建築


私は、コストが他の理由の間で劇的に変わるので、アプリケーションとネットワークのために建築を管理することに決めました.

ネットワークアーキテクチャ


  • VPC
  • 公共のサブネット
  • 4プライベートサブネット
  • 公共ルートテーブル
  • の私設ルート表
  • インターネットゲートウェイ
  • NATゲートウェイ
  • パブリックセキュリティグループ(HTTPとSSH)
  • 私設セキュリティグループ( PostgreSQLとREDIS )
  • アプリケーションアーキテクチャ


  • EC 2インスタンス
  • EC 2キーペア
  • エラスティックキャッシュRedisインスタンス
  • エラスティックキャッシュサブネットグループ
  • RDS PostgreSQLのインスタンス
  • RDSサブネットグループ
  • この設定がこの単純なアプリケーションのために多分overkillであることは、本当です.しかし、私は生産シナリオの設計に自分自身をプッシュしたい.
    私がスコープから判断したこのアーキテクチャを改善するいくつかの次のステップは、ここにあります.
    HTTPS侵入
  • は、HTTP
  • の代わりにHTTPSを許可するために、公共セキュリティグループを更新します
  • セットアップNGinxを使用してHTTPS
  • フェイルオーバーゲートウェイ
    もう一つのAZ 24679182のセットアップフェールオーバーNATゲートウェイ
  • は、1つまたは両方のNATゲートウェイ
  • を使用するプライベートルートテーブルを更新します
    複数のアプリケーションサーバ
    代わりにASGの一部として実行するアプリを設定します
  • は、ASGの前でALB/NLBをセットして、バランス交通量
  • をロードします

    地形


    以前のプロジェクトのように、私はコード(IAC)としてインフラストラクチャのためにここでterraformを使うことに決めました.私はテラフォームを使用するたびに私はそれについて好きな何か新しいものを見つけるようです.
    以下は、私が最近このプロジェクトについて学び、使用した新しい発見された機能のリストです.

    ローカルブロック


    この機能は、ユーザーがテンプレート内のローカル変数を定義することができます.
    https://www.terraform.io/docs/language/values/locals.html
    locals {
      availability_zones = [
        "us-east-1a",
        "us-east-1b",
        "us-east-1c",
        "us-east-1d"
      ]
      cidr_anywhere_block = "0.0.0.0/0"
      ...
    }
    
    local.cidr_anywhere_block
    

    ファイル機能


    この機能を使用すると、ファイルをリソース宣言に簡単に渡すことができます.これにより、EC 2のインスタンスをブートストラップすることができました.いいえクレイジーフォーマットここに必要な!
    https://www.terraform.io/docs/language/functions/file.html
    resource "aws_instance" "server" {
      ...
      user_data = file("user-data.sh")
    }
    

    シャッフルプロバイダー


    この機能を使用すると、値のリストをシャッフルし、値の戻り値xを返します.私は、これが単に一つの価値とより柔軟にさえ提供するよりはるかに賢いと思いました!
    https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/shuffle
    variable "subnet" {
      description = "subnet ids"
      type = object({
        private = list(string)
        public  = list(string)
      })
    }
    
    subnet = {
      ...
      public  = [
        "subnet-01b36f97fa8490e43",
        "subnet-0a4272a81af160127",
        "subnet-03939599dd92f0f07",
        "subnet-0b6f2c6a35b31e4d5"
      ]
    }
    
    resource "random_shuffle" "public_subnet" {
      input        = var.subnet.public
      result_count = 1
    }
    
    subnet_id = random_shuffle.public_subnet.result[0]
    

    カウントメタ引数


    この機能を使用すると、自分自身を繰り返す必要はありませんので、ループの動作をテンプレートに提供することができます.
    https://www.terraform.io/docs/language/meta-arguments/count.html
    resource "aws_subnet" "public" {
      count = length(local.cidr_public_blocks)
      cidr_block        = local.cidr_public_blocks[count.index]
      ...
    }
    
    GitHub (Terraform)

    フラスコ、gunicorn、およびスタイル


    私はデビッドトマスが関連トピックにいくつかの新しい発見の知識を使用するために提供されたデフォルトのアプリケーションを変更しました.

    https://github.com/ACloudGuru/elastic-cache-challenge


    神社式


    これにより、HTML 5624 , 9142と同様のHTMLテンプレートにロジックを置くことができました.私がテストしたとき、私は空のセクションがスクリーンに描かれるのを見たくなかったので、私は主にこれをしました.値がngIf関数に渡されない場合は、それらは隠されます.
    {% if db_host %}
    <div class="section">
        <span class="section-title">
            Database Host
        </span>
        <span>{{ db_host }}</span>
    </div>
    {% endif %}
    
    また、エラーがない場合は画面にエラー表示を追加できます.私はいくつかのエラーログを表示するユーザーにリスクを知っているので、render_template変数がサーバー上で適切に設定されている場合は、実際のエラーを渡すためにコードを修正しました.
    debug = os.environ.get('DEBUG')
    debug = debug.lower() in ['1', 't', 'true', 'y', 'yes'] if debug is not None else False
    
    ...
    try:
        config = ini('postgres')
        db_host = config['host']
        db_version = select_version()
    
    except Exception as e:
        print('index() error:', e)
        error = e if debug else "we're currently experiencing technical difficulties"
    
    return render_template(
        html,
        error=error,
        db_host=db_host,
        db_version=db_version
    )
    

    神社遺産


    これは私が他のテンプレートを持っていれば、他のテンプレートでベーステンプレートを再利用することを可能にしたので、私は一貫したスタイルのアプリケーションを低いメンテナンスで広く保つことができました.
    <head>
      <meta charset="UTF-8" />
      <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}" />
      <title>CloudGuruChallenge_21.06</title>
    </head>
    <body>
      {% block content %}
      {% endblock %}
    </body>
    
    {% extends 'base.html' %}
    {% block content %}
    ...
    <div class="section">
        <span class="section-title">
            Elapsed Time
        </span>
        <span>{{ g.request_time() }}</span>
    </div>
    {% endblock %}
    

    Gunicornサーバー


    私はすぐに内蔵のフラスコサーバーは、生産で動作するように意図されていないことを学んだ.しかし、この単純なプロジェクトのために罰金だったかもしれないが、私は代わりにgunicornセットアップに余分なマイルに行きたかった.
    一度私はちょうど私のブートストラップスクリプトでデーモンとしてアプリケーションを実行してインストールされます.例えば、DEBUG

    スタイリング


    私は裸のHTMLページに耐えることができませんでした.スタイルに加えて、私はフラスコのgunicorn -D app:appの資産とstaticと同様にその知識を固めることを望みたかったです.url_forGitHub (Python)

    結論


    全体的に私は本当にこの挑戦を楽しんだ.私は、何が多分次でありえたかについて見るのを待つことができません.関係なく、私はタスクをされます!
    私はLinkedInに接続し、フィードバックを聞くのが大好きだ.あなたが同様に挑戦を完了するならば、私はあなたの仕事を見たいです.
    乾杯!
    ギタブ
    https://github.com/wheelers-websites/CloudGuruChallenge_21.06
    リンケディン