AnsibleとCodeBuildでEC2ユーザー作成を効率化してみる

AWS

こんにちは、最近Ansible にひそかにはまっているので、今日はAnsible の環境を自動化してみたので、それについて書いてみたいと思います。以前もAnsible でWordpress の環境を作成した記事を書いたので、Wordpress の環境も自動化したいよという方は、読んでみてください。

今回の実施する内容

まずはGemini に書いてもらった、やりたいことの内容です。

1 Github でソースコードをpush

2 トリガーでCodeBuild でAnsible が実行

3 Linux ユーザがサーバー内で作成される

+---------------------+      +---------------------+      +---------------------+
|                     |      |                     |      |                     |
|  Source Repository  |      |     AWS CodeBuild   |      |   Linux Server      |
|  (CodeCommit/GitHub)|----->|                     |----->|                     |
|  - Ansible Playbooks|      | - Build Environment |      | - Linux User created|
|  - buildspec.yml    |      | - buildspec.yml     |      |                     |
|                     |      | - Ansible execute   |      |                     |  
+---------------------+      +----------+----------+      +---------------------+
                                        |
                                        | (秘密鍵の成果物アップロード)
                                        v
                            +--------------------------+
                            |     Amazon S3 Bucket     |
                            | (生成された秘密鍵を一時的に保存) |
                            +--------------------------+
                                        ^
                                        | (ユーザーがS3からダウンロード)
                                        |
                            +--------------------------+
                            | ユーザーのローカルPC     |
                            +--------------------------+

※ ssh key はparameter store より取得することとします

今回の環境について

環境は上と一緒ですが、より見やすくするとこんな感じになります!使用したサービスは、大まかにGitHub・CodeBuild・EC2 になります。OS はUbuntu です。

ローカルはいつものごとく、WSL2 でAnsible のYaml の作成を実施しています。検証はVagrant に対して実施して、本番が以下の環境になる想定です。

Ansible の中身について

ここでpublic 公開しているので、こちらから確認してみてください。

GitHub - kentaindeed/ansible-codebuild-for-blog: blog 用の codebuild レポジトリです。
blog 用の codebuild レポジトリです。. Contribute to kentaindeed/ansible-codebuild-for-blog development by creating an account on G...

内容は、Linux のユーザ作成と秘密鍵の作成や、ssh するためのディレクトリの準備などを記載しています。variable については、test ユーザをおいていますので、テストは可能です。

Linux ユーザ作成まで

VPC の作成

Codebuild を実行して、EC2 と疎通をとるためにはCodebuild をprivate subnet に配置する必要があります。そのためにVPC などを作成していきます。NAT Gateway も作成します。

VPC などのリソースを作成して、以下のようにマッピングするように設定します。

セキュリティーグループの設定を忘れないでください。

まずはEC2 作成

特に特別な設定自体はしていませんので、Public IP が有効になっており、ssh 接続ができる状態であれば大丈夫だと思います!(今回はPublic subnet に配置しています)

codeBuild を作成

IAM role の作成

CodeBuild を作成する前にIAM Role を作成していきましょう。IAM Role の役割は今回は、Parameter Store からssh key を取得するためです。

CodeBuild に権限を与えてあげます。この「AmazonSSMReadOnlyAccess」ポリシーをあててあげてください。そうするとCodebuild からParameter Store に対して、Get の処理が可能になります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "codebuild.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

ソースを指定

最初に名前を決めて、GitHub をソースにします。

プライマリーリソースのwebhook イベントと環境はほとんどデフォルトにします。

code build のOS など

デフォルトのままなので、EC2 と同様Amazon Linuxが指定されています。

VPC の設定

Codebuild をVPC 内に配置する必要があるので、VPC の設定をしていきます。
private subnet に配置するようにしてください。そして、最後にVPC 設定の確認で「インターネットに接続されています」との文言がでたら設定は完了です。

Role と Buildspec の指定

今回はbuildspec を使って、Ansible を実行していくので、必要な設定になります。ここまでできたら、作成をしていきましょう。

Cloudwatch Logs に関して

これはトラブルシューティングの時に役に立つと思いますので、基本は有効にすることお勧めしますが、検証などの場合はオフでもいいかもしれません。

S3 artifact 設定

今回は、作成した秘密鍵をS3 に配置してダウンロードする必要があるので、Artifact の設定をしていきます。任意のバケットを指定してあげてください。

IAM Role 設定

先ほど作成したIAM Role を選択してください。

ここまでくれば、設定は完了になります。後はCodebuild を実行して、Ansible が問題なく実行できるかをテストしていきます。

Ansible 実行テスト

それぞれの実行フェーズが成功して、EC2 内にユーザが作成されていたら、成功です!また、S3 にも問題なく秘密鍵と公開鍵が入っていることを確認してください。

# ansible をcode build から実行する
version: 0.2

env:
  variables:
    my-ssh-key: "my-ssh-key"
    private-ip: "private-ip"

phases:
  install:
    commands:
      - echo "install ansible and python"
      - sudo yum update -y
      # - sudo yum install epel-release -y
      - sudo yum install -y ansible
      - sudo yum install -y python3 python3-pip
      # - sudo yum install -y openssh-server

# pre build ssh 接続準備
  pre_build:
    commands:
      - echo "start fetching private key from parameter store"
      - sed -i 's/# StrictHostKeyChecking ask/StrictHostKeyChecking no/' /etc/ssh/ssh_config
      - aws ssm get-parameter --name "my-ssh-key" --with-decryption --query Parameter.Value --output text > private_key
      - cat private_key
      - chmod 600 private_key
      - echo "finish fetching hosts from parameter store"



# ansible 実行
  build:
    commands:
      - echo "start executing ansible"
      - ansible-playbook -i "private-ip", target.yml --private-key private_key


# artifact の保存 ( s3 に秘密鍵と public key を保存)
  post_build:
    commands:
      - echo "start saving artifact to s3"
      - aws s3 cp private_key s3://<your-bucket-name>/private_key
      - aws s3 cp public_key s3://<your-bucket-name>/authorized_keys

参考サイト

AWS CodeシリーズでAnsible自動実行環境を構築する | NHN テコラス Tech Blog | AWS、Google Cloudなどのインフラ技術ブログ
AWSのCodeシリーズ(AWS CodePipeline+AWS CodeBuild)を使ってAnsibleの自動実行を行うCICDパイプラインを構築しました。Ansibleのコントロールノードを用意する必要がなく、便利に使えそうだったの...

\ 最新情報をチェック /

コメント

PAGE TOP
タイトルとURLをコピーしました