地形とコードとしてのインフラストラクチャ入門


この記事では、コード、アプローチ、利点としてインフラストラクチャについて学びますTerraform その基礎と有用なコマンドのいくつかを理解することによって.
また、基本的な地形のプロジェクトを作成し、いくつかのリソースを提供する!

コードとしてのインフラストラクチャは何か?


コード(IAC)としてのインフラストラクチャは、AWS、GCPコンソールなどを通してリソースを提供するような手動のプロセスを通してコードを通してインフラストラクチャの管理とプロビジョニングとして定義されることができます.

アプローチ


コードとして2つのアプローチインフラストラクチャがあります.
  • 命令
  • この方法では、ある順序で実行されるコマンド列として、希望する設定を定義します.
    例えば、bashスクリプトを使用するAWS CLI 資源を供給する.
  • 宣言
  • 宣言的なアプローチは、あなたが必要とするどんな資源と彼らが持たなければならないどんな資源も含むシステムの望ましい状態を定義します.
    例えば、AWS Cloudformation , Terraform , Ansible , など

    利益


    ここでは、コードとしてインフラストラクチャを使用する利点があります.
  • 一貫性
  • IACの目標は、我々のインフラストラクチャの進化として一貫性を維持しながら高速化を反復するのに役立つマニュアルプロセスを排除することです
  • シンプル
  • IACは、いくつかのスクリプトを実行することにより、インフラストラクチャアーキテクチャ全体をスピンすることができます.我々は開発のためだけでなく、ステージングのためにも、我々のソフトウェア開発ライフサイクル(SDLC)をより簡単にする生産環境を提供することができます.
  • 増加効率
  • IACは、開発者の手に電源を戻します.プロビジョニングがより信頼性が高く自動化されるにつれて、エンジニアはマニュアル作業を行う時間が少なくなり、より高い値のタスクを実行する時間が多くなる.
  • リスク最小化
  • あなたのインフラストラクチャのセットアップとそのインとアウトを知っている唯一の1つですdevopsエンジニアを想像してください.今、エンジニアがあなたの会社を去っていると想像してください.
    ここで、IACは完璧なフィットです.なぜなら、新しいエンジニアがオンボードされているので、インフラストラクチャがどのように提供されるかを理解するのに多くの時間を費やす必要はありません.

    どのような地形ですか?



    Reference: Terraform docs
    Terraformは、安全で効率的に構築、変更、およびバージョンインフラストラクチャを可能にするコード(IAC)ツールとしてインフラストラクチャです.
    TerraformはHashicorp言語(HCL)を使用しているプロバイダーに関係なくリソースを定義するためにその言語として使用します.

    基礎


    基本的な地形のプロジェクトのいくつかの基礎とビルディングブロックを見てみましょう.

    Terraformは我々のインフラストラクチャと構成についての状態を保存しなければなりません.この状態は、terraformによって我々のリソースを設定し、メタデータを追跡します.
    Terraformまた、どのように我々の状態を格納するためのオプションのトンを提供します.たとえば、我々がチームで複数の人々と一緒に働いているならば、我々はローカルにそれを保存するのではなくAWS
    プロバイダ
    プロバイダは基本的には、Arabe、GCP、Azureのようなクラウドプロバイダと対話するためにterraformを使用するプラグインです.Terraformは、すべてのインフラストラクチャのニーズのためのプロバイダのトンを持っていますterraform registry
    例:
    # AWS
    provider "aws" {
      region = "us-east-1"
    }
    
    # Google Cloud
    provider "google" {
      project     = "example"
      region      = "us-west1"
    }
    
    リソース
    リソースブロックは、計算機、ネットワーク、または任意の上位コンポーネントのようなインフラストラクチャオブジェクトを記述することができます
    例:
    resource "aws_apprunner_service" "some_name" {
      tags = {
        Name = "example-apprunner-service"
      }
    }
    
    データソース
    リソースは新しいインフラストラクチャコンポーネントを管理するために使用されます.データソースは、私たちにterraform自体によってprovisionedされなかったかもしれないか、またはそうしなかったかもしれない私達の基盤の既存のリソースへの読み取り専用のビューを与えます.
    例:
    data "aws_ebs_volume" "ebs_volume" {
      most_recent = true
    
      filter {
        name   = "volume-type"
        values = ["gp2"]
      }
    }
    
    モジュール
    terraformモジュールは、一緒に使用される複数のリソースのコンテナです.
    あなたが供給したい想像してくださいEKS しかし、私たちが知っているように、それはEKSリソースを定義するのと同じくらい単純でありません、我々はVPC、サブネットも必要とします、そして、リストは行きます.
    したがって、モジュールはあなたのインフラストラクチャを整理する良い方法になります、例えば、我々はちょうどEKSモジュールで我々のEKS特有のリソースを定義することができます!
    例:
    module "eks" {
      vpc       = "..."
      instances = 10
    }
    
    しかし、待って、もっと!
    モジュールとリソースが存在するTerraform registry それで、我々は多分我々のニーズに合うモジュールを見つけることができます.使えるようにEKS module
    また、独自のモジュールを公開することができますTerraform registry !
    関数
    Terraformのような文字列関数から関数のトンが付属してjoin , format を使う.
    変数
    変数は、リソース、データソース、モジュール、関数などの入力として機能し、より良い方法で共通の設定を整理するのに役立ちます.
    例:
    variable "bucket_name" {
      type    = string
      default = "example-value"
    }
    
    または一時的なローカル変数
    例:
    locals {
      random = "hello"
    }
    
    出力
    terraformの出力は、我々のterraformスクリプトが走るとき、我々が期待する出力を定義するのを助けます.
    例:
    output "service_endpoint" {
      value = aws_apprunner_service.service.domain_name
    }
    

    コマンド


    ここでいくつかの重要な地形コマンドを使用します.
    インプット
    プロジェクトの準備と初期化
    計画
    設定変更による変更を表示します
    適用
    変更を適用
    破壊する
    設定のすべてのリソースを破壊する

    インストール


    地形
    terraformのCLIはからインストールすることができますhere
    注意: Hashicorpも提供しますterraform docker image , あなたが余分な依存関係をインストールするのが好きでないならば
    AWSアクセス
    我々はまた、プログラムのアクセスとAWSAWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY .
    私の以前の記事を参照することができます


    ハンズオン!


    十分な理論は、今私たちが学んだと何かを提供する実際に使用してみましょう.物事を簡単にするためには、我々はプロビジョニング
    のS 3バケツ
    を作成しますterraform ディレクトリをmain.tf ファイル.
    $ mkdir terraform
    $ touch main.tf
    
    我々の好ましい地域で我々のAWSプロバイダーを定義しましょう
    provider "aws" {
      region = "us-east-1"
    }
    
    バケツ名の変数を作成します.
    注:バケット名が一意であることを確認します
    variable "bucket_name" {
      type    = string
      default = "sample-bucket"
    }
    
    定義するaws_s3_bucket リソース
    resource "aws_s3_bucket" "deploy_bucket" {
      bucket = var.bucket_name
      acl    = "private"
    }
    
    出力を追加する
    output "s3_bucket_arn" {
        value = aws_s3_bucket.s3_bucket.arn
    }
    
    プロジェクトを初期化しましょう

    偉大な、我々のプロジェクトを初期化されています.我々の変化を計画しましょう
    $ terraform plan
    

    すべては良いようです、適用しましょう
    $ terraform apply
    

    最後に、リソースをクリーンアップしましょう
    $ terraform destroy
    

    結論


    この記事では、コードとしてインフラストラクチャをカバーしています.私はこれが有用であり、常に任意の問題に直面している場合に手を差し伸べる自由に感じてほしい!