SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

BizReach Tech Blog

AWSネットワーク構成図の手動更新がつらい? よろしい、ならばCloudMapperだ

BizReach Tech Blog 第3回


運用自動化に向けて行ったこと

 実運用にあたって、ネットワーク構成図の作成と更新に加え、CloudMapper自体のバージョンアップ反映もすべて自動化することにしました。

  • ネットワーク構成図の更新
    • CloudMapperは起動時に最新の情報を取得して構成図を更新するため、毎朝7時に再起動するようにした
    • 再起動処理は、CloudWatch Events -> Lambdaで実装
  • CloudMapperのバージョンアップや設定変更の反映
    • 公式サイトのセットアップ手順を参考にしてDockerfileやentrypoint.shを作成し、これらのファイルをGitHubのリポジトリで管理
    • ECS上でサービスとして稼働させた。ECSに関するAWSのリソースはTerraformでコード化しGitHubのリポジトリで管理
    • CodePipelineを利用し、GitHubのmasterにコミットがあったら、Docker Imageをbuildし、ECSのサービスにdeployを行うように設定

 これにより、ネットワーク構成図が毎日最新化されるのに加え、CloudMapperのバージョンアップや、情報取得対象のAWSのアカウント追加があった場合も、設定ファイルをコミットするだけで自動反映されるようになりました。

セキュリティとコスト上の工夫

nginxによるアクセス制御

 CloudMapperへのアクセスは社内のみに制限していましたが、それだけでは社内の誰でも参照できてしまうのでアクセス制限をかける必要がありました。CloudMapper自体にはユーザー管理や権限制御の機能はなかったため、CloudMapperとALBの間にnginxを挟み、Basic認証を入れるようにしました。

AWSアカウントごとの制御と、コスト節約のためのECSサービス化

 担当しているサービスでは複数のAWSアカウント(本番、検証など)を管理しており、これらすべてのアカウントでCloudMapperを利用するにあたり、閲覧制限をアカウント単位でかける必要がありました。このため、アカウント別にCloudMapperを構築することで、アカウント単位での閲覧制限をかけられるようにしました。しかし、アカウントの数だけECSのサービスを構築すると金銭的なコストもかかるため、サービスとしては1つ、タスク側でアカウント単位のコンテナを構築しました。また、1つのサービスで複数のCloudMapperにリクエストを分散させるため、nginxのproxyを利用しました。

register-task-definition.jsonの中身を抜粋
{
  "name": "sandbox", #sandboxサービス
  "image": "xxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/cloudmapper:latest",
  "logConfiguration": {
    "logDriver": "awslogs",
    "options": {
      "awslogs-group": "/aws/ecs/task/cloudmapper",
      "awslogs-region": "ap-northeast-1"
    }
  },
  "memory": 512,
  "portMappings": [
    {
      "hostPort": 8010,
      "containerPort": 8000,
      "protocol": "tcp"
    }
  ],
  "environment": [
    {
      "name": "ACCOUNT",
      "value": "sandbox"
    },
    {
      "name": "AWS_DEFAULT_REGION",
      "value": "ap-northeast-1"
    },
    {
      "name": "AWS_REGION",
      "value": "ap-northeast-1"
    }
  ],
  "essential": true
},
{
  "name": "sandbox-us", #sandbox-usサービス
  "image": "xxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/cloudmapper:latest",
  "logConfiguration": {
    "logDriver": "awslogs",
    "options": {
      "awslogs-group": "/aws/ecs/task/cloudmapper",
      "awslogs-region": "ap-northeast-1"
    }
  },
  "memory": 512,
  "portMappings": [
    {
      "hostPort": 8020,
      "containerPort": 8000,
      "protocol": "tcp"
    }
  ],
  "environment": [
    {
      "name": "ACCOUNT",
      "value": "sandbox-us"
    },
    {
      "name": "AWS_DEFAULT_REGION",
      "value": "us-east-1"
    },
    {
      "name": "AWS_REGION",
      "value": "us-east-1"
    }
  ],
  "essential": true
},
{
  "name": "cloudmapper-nginx-proxy",
  "image": "xxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/cloudmapper-nginx-proxy:latest",
  "links": ["sandbox", "sandbox-us"],
  "logConfiguration": {
    "logDriver": "awslogs",
    "options": {
      "awslogs-group": "/aws/ecs/task/cloudmapper-nginx-proxy",
      "awslogs-region": "ap-northeast-1"
    }
  },
  "memory": 256,
  "portMappings": [
    {
      "hostPort": 0,
      "containerPort": 80,
      "protocol": "tcp"
    }
  ],
  "environment": [
    {
      "name": "SANDBOX",
      "value": "sandbox:8000"
    },
    {
      "name": "SANDBOX_US",
      "value": "sandbox-us:8000"
    }
  ],
  "essential": true
}
nginxのproxy設定を抜粋
location /sandbox {
  # for sandbox
  auth_basic           "Welcome to sandbox";
  auth_basic_user_file /etc/nginx/.htpasswd;
  proxy_set_header        Host ${DOLLAR}host;
  proxy_set_header        X-Real-IP ${DOLLAR}remote_addr;
  proxy_set_header        X-Forwarded-For ${DOLLAR}proxy_add_x_forwarded_for;
  proxy_set_header        X-Forwarded-Proto ${DOLLAR}scheme;
  proxy_set_header        X-Forwarded-Host ${DOLLAR}http_host;
  proxy_pass http://${SANDBOX}/;
}

次のページ
導入結果

この記事は参考になりましたか?

BizReach Tech Blog連載記事一覧

もっと読む

この記事の著者

近藤 美沙(株式会社ビズリーチ)(コンドウ ミサ)

B2B、B2Cサイトの開発・運営、広告プラットフォームの運用等を経て、2017年からビズリーチへ入社。開発環境整備、アーキテクチャの設計・運用を担当。最近では、社内でSRE本の輪読会、Terraformの布教活動、k8sの勉強会など、周囲の愉快な仲間達と共にNoOPS!の世界に向けて歩んでいます。 twitter: @_zoo github: https://github.com/MisaKondo 株式会社ビズリーチについて

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/11090 2018/11/29 20:37

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー