GastHUBアクションを使用してHashicorpパッカーを使用してAWS AMIをビルドする


セキュリティベストプラクティスは、クラウド上でVMを回転させる最新のベースイメージ(例えばAWS AMI)を推奨します.最新のソフトウェアパッチは、どんなセキュリティ違反の危険性を減らします.これは、最新のソフトウェアバージョンでイメージ作成プロセスを自動化するためにイメージファクトリをセットアップする強いニーズを強調します.
また、すべての組織は、与えられたイメージのためにインストールされるソフトウェアの標準的なリストを持っています.唯一の重要なソフトウェアは、セキュリティ面から爆発面を減らすためのリストの一部である必要があります.ソフトウェアのこのリストは、VMが作成されるか、または、VMが創造の過程にあるならば、インストールされることができます.しかし、両方のこれらのテクニックは、時間がかかり、したがって、推奨されません.
ベースイメージ自体でこのソフトウェアリストを焼くのが好ましいでしょう.HashiCorp Packer 単一のソース構成から複数のプラットホームのために自動化されたマシンイメージを構築することを専門とするオープンソース・ツールです.

Hashicorpパッカーインストール


ハシコップを参照documentation あなたのハードウェアOSに基づくパッカーインストールのために.

ギタブアクション


このデモのために、我々はこのワークフローを自動化して、結局、AWSで焼かれたイメージ(AMI)を押すために、CI/CDパイプラインをつくるために、Githubアクションを使用します.これは、ソフトウェア開発ライフサイクル内のタスクを自動化するプラットフォームです.それはevent-driven フレームワークは、与えられたイベントのための一連のコマンドを運ぶことができることを意味するか、1回または繰り返しのタスクのためにスケジュールすることができます.(例えば、プルリクエスト作成にテストスイートを実行し、問題にラベルを追加したり、lint checkなど)
アクションはYAMLファイルで定義されます.これは、プルリクエストの作成、コードコミット、およびはるかに多くのGithubイベントを使用してパイプラインワークフローをトリガーすることができます.

必要条件

  • プログラムアクセスによるAWSユーザ
  • アクセスキー
  • 秘密アクセスキー
  • AWS IAM特権EC 2インスタンスを作成する(EC 2インスタンスを作成、変更、削除).参照documentation iam権限の完全なリストについては、Amazon EBSビルダーを実行する必要があります.
  • この投稿では、私たちのUbuntuベースイメージで開いたJDK(Java 8)を焼いて、AWSにプッシュします.パッカーの設定は、HCL(. pkr . hclファイル拡張子)とjson(. pkr . json)形式で記述できます.我々は、このデモのHCL言語を使用します.

    リファレンスgithubリポジトリpkr-aws-ubuntu-java

    コードタイム


    Packerの設定を書き始めましょう.私はLinux このデモ用マシン

    パッカーの設定


    プロジェクトフォルダpkr-aws-ubuntu-java
    mkdir pkr-aws-ubuntu-java && cd $_
    
    
    ファイル名aws-demo.pkr.hcl
    touch aws-demo.pkr.hcl
    
    
    お気に入りのIDEを開きます.以下のコードをコピーしてくださいaws-demo.pkr.hcl ファイル.
    packer {
      required_plugins {
        amazon = {
          version = ">= 0.0.2"
          source = "github.com/hashicorp/amazon"
        }
      }
    }
    
    The packer {} ブロックには、必要なパッカーのバージョンを含むパッカー設定が含まれます.The required_plugins Packerブロックのブロックで、テンプレートを使用してイメージを構築するために必要なプラグインを指定します.プラグインブロックにはversion and source 属性.

    ソースブロック


    ソースブロックは、特定のbuilder 次に、build ブロック.ソースブロックは、ビルダーとコミュニケータを使用して、仮想化タイプ、イメージの打ち上げタイプなどを定義します.
    次のコードをコピーしますaws-demo.pkr.hcl ファイル.
    variable "ami_prefix" {
      type = string
      default = "packer-aws-ubuntu-java"
    }
    
    locals {
      timestamp = regex_replace(timestamp(), "[- TZ:]", "")
    }
    
    source "amazon-ebs" "ubuntu_java" {
      ami_name = "${var.ami_prefix}-${local.timestamp}"
      instance_type = "t2.micro"
      region = "us-east-1"
      source_ami_filter {
        filters = {
          name = "ubuntu/images/*ubuntu-xenial-16.04-amd64-server-*"
          root-device-type = "ebs"
          virtualization-type = "hvm"
        }
        most_recent = true
        owners = ["099720109477"]
      }
      ssh_username = "ubuntu"
    }
    
    変数ami_prefix はami画像を定義するために使われる.ローカル変数timestamp アミの名前に一意性を確保するのに役立ちます.
    The amazon-ebs BuilderはソースAMIを起動し、このインスタンス内でプロビジョナーを実行し、EBSにバックアップされたamiにパッケージ化します.このビルダーの設定はt2.micro を使用してUS - East - 1領域のAMIubuntu:xenial ベースイメージとしてのアミ
    名前は阿弥をつくるpacker-aws-ubuntu-java+timestamp . ami名は一意でなければなりません.
    また、SSHコミュニケータを使用しますssh_username 属性.パッカーは、あなたのインスタンスを提供するために一時的なキーペアとセキュリティグループを使用してEC 2インスタンスにsshすることができます.

    ビルドブロック


    The build ブロックは、起動後にEC 2インスタンスでどのようにパッカーが行うかを定義します.
    build {
      name = "packer-ubuntu"
      sources = [
        "source.amazon-ebs.ubuntu_java"
      ]
    
      provisioner "shell" {
    
        inline = [
          "echo Install Open JDK 8 - START",
          "sleep 10",
          "sudo apt-get update",
          "sudo apt-get install -y openjdk-8-jdk",
          "echo Install Open JDK 8 - SUCCESS",
        ]
      }
    }
    
    provisioner ブロックは、ベースイメージに変更を自動化することができます.これは、シェルスクリプト、ファイルのアップロード、および現代的な構成管理ツールと統合可能な、シェフなどなどを活用します.
    上記のプロビジョナーは、シェルプロビジョナーを定義し、ベースイメージにオープンJDK 8をインストールします.
    最終ファイルaws-demo.pkr.hcl 以下のようになります.
    packer {
      required_plugins {
        amazon = {
          version = ">= 0.0.2"
          source = "github.com/hashicorp/amazon"
        }
      }
    }
    
    variable "ami_prefix" {
      type = string
      default = "packer-aws-ubuntu-java"
    }
    
    locals {
      timestamp = regex_replace(timestamp(), "[- TZ:]", "")
    }
    
    source "amazon-ebs" "ubuntu_java" {
      ami_name = "${var.ami_prefix}-${local.timestamp}"
      instance_type = "t2.micro"
      region = "us-east-1"
      source_ami_filter {
        filters = {
          name = "ubuntu/images/*ubuntu-xenial-16.04-amd64-server-*"
          root-device-type = "ebs"
          virtualization-type = "hvm"
        }
        most_recent = true
        owners = ["099720109477"]
      }
      ssh_username = "ubuntu"
    }
    
    build {
      name = "packer-ubuntu"
      sources = [
        "source.amazon-ebs.ubuntu_java"
      ]
    
      provisioner "shell" {
    
        inline = [
          "echo Install Open JDK 8 - START",
          "sleep 10",
          "sudo apt-get update",
          "sudo apt-get install -y openjdk-8-jdk",
          "echo Install Open JDK 8 - SUCCESS",
        ]
      }
    }
    

    ギタブアクション


    新しいファイルを作成します.ワークフローディレクトリgithub-actions-packer.yml
    私たちは、このワークフローをwee時間で実行するようにスケジュールします.name - ワークフローの名前です.githubはリポジトリのアクションページにワークフローの名前を表示します
    name: AWS AMI using Packer Config
    
    
    on -(必須)ワークフローをトリガーするGitHubイベントの名前.我々は、スケジュールのワークフローをトリガするように構成している.
    on:
      schedule:
        # * is a special character in YAML so you have to quote this string
        - cron: '0 4 * * *'
    
    jobs - ワークフローは1つ以上のジョブで構成されます.これらのジョブは並列または順次実行することができます.それぞれのジョブはrun onで指定されたランナー環境で実行されます.job name - Githubに表示されるジョブの名前です.runs-on - (必須)ジョブを実行するマシンの種類を決定します.マシンのいずれかgithubホストランナーまたは自己ホストランナーです.利用可能なgithubホストランナータイプは以下の通りです.
    jobs:
      packer:
        runs-on: ubuntu-latest
        name: packer
    
    steps - ジョブ内のステップと呼ばれるタスクのシーケンス.彼らは、コマンドを実行することができますタスクを設定したり、リポジトリ、パブリックリポジトリで動作を実行したり、アクションをDockerレジストリで公開.
    最初のステップは、ランナー環境でソースコードをチェックアウトすることです.Checkout V2 - このアクションはあなたの倉庫を$ GithubMountワークスペースの下でチェックします.
        steps:
          - name: Checkout Repository
            uses: actions/checkout@v2
    
    AWSクラウド環境へのアクセスを確保するには、設定する必要がありますAWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY ランナー環境で.これらの変数の値は、以下のセクションのGithub秘密として設定されます.Configure AWS Credentials - このアクションは、他のGithubアクションで使用するAWS資格と領域環境変数を設定します.
          - name: Configure AWS Credentials
            uses: aws-actions/configure-aws-credentials@v1
            with:
              aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
              aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
              # aws-session-token: ${{ secrets.AWS_SESSION_TOKEN }} 
              # if you have/need it
              aws-region: us-east-1
    
    Init Github actionワークフローで使用されるパッカー設定を初期化します.
          # Initialize Packer templates
          - name: Initialize Packer Template
            uses: hashicorp/packer-github-actions@master
            with:
              command: init
    
    Validate 設定が正しく書き込まれているかどうかを調べます.それ以外の場合はエラーをスローします.
          # validate templates
          - name: Validate Template
            uses: hashicorp/packer-github-actions@master
            with:
              command: validate
              arguments: -syntax-only
              target: aws-demo.pkr.hcl
    
    Build パッカーの設定を実行します.
          # build artifact
          - name: Build Artifact
            uses: hashicorp/packer-github-actions@master
            with:
              command: build
              arguments: "-color=false -on-error=abort"
              target: aws-demo.pkr.hcl
            env:
              PACKER_LOG: 1
    
    完全なファイルgithubアクションパッカー.以下のようになります.
    name: AWS AMI using Packer Config
    
    on:
      schedule:
        # * is a special character in YAML so you have to quote this string
        - cron: '0 4 * * *'
    
    jobs:
      packer:
        runs-on: ubuntu-latest
        name: packer
    
        steps:
          - name: Checkout Repository
            uses: actions/checkout@v2
    
          - name: Configure AWS Credentials
            uses: aws-actions/configure-aws-credentials@v1
            with:
              aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
              aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
              # aws-session-token: ${{ secrets.AWS_SESSION_TOKEN }} 
              # if you have/need it
              aws-region: us-east-1
    
          # Initialize Packer templates
          - name: Initialize Packer Template
            uses: hashicorp/packer-github-actions@master
            with:
              command: init
    
          # validate templates
          - name: Validate Template
            uses: hashicorp/packer-github-actions@master
            with:
              command: validate
              arguments: -syntax-only
              target: aws-demo.pkr.hcl
    
          # build artifact
          - name: Build Artifact
            uses: hashicorp/packer-github-actions@master
            with:
              command: build
              arguments: "-color=false -on-error=abort"
              target: aws-demo.pkr.hcl
            env:
              PACKER_LOG: 1
    
    ソースコードは準備ができて、githubリポジトリにプッシュすることができます.構成通り、ワークフローは午前4時00分に起動されます.