継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

プライベートサブネットのサーバー接続をするために AWS Client VPN を使ってみる

タダです.

リモートワークが広がる中で AWS Client VPN を使って各種業務システムへの接続を検証する必要があり,AWS Client VPN を検証したので何記事かに分けて検証した内容をまとめます.この記事で Get Started な内容を書いていきます.既に同様の内容の記事は多くあるのですが,やった内容整理するために記事を書きます.

AWS Client VPN とは

AWS Client VPN は下記引用文のようなサービスです.Client VPN 登場前はインターネット VPN のためにサーバーを用意する必要がありましたが,それが無くなりマネージドサービスして提供されているためスピーディーに使えてかつサーバー運用不要なところがいいなと思っています.

AWS Client VPN は、AWS リソースやオンプレミスネットワーク内のリソースに安全にアクセスできるようにする、クライアントベースのマネージド VPN サービスです。クライアント VPN を使用すると、OpenVPN ベースの VPN クライアントを使用して、どこからでもリソースにアクセスできます。

docs.aws.amazon.com

課金体系

Client VPN の課金対象となるのが下記の2項目です.

課金項目 課金額
AWS Client VPN エンドポイントアソシエーション $0.15/時間
AWS Client VPN 接続 $0.05/時

aws.amazon.com

AWS Client VPN を使ってプライベートネットワークにある EC2 に接続する

検証のシナリオとしてプライベートサブネットにある EC2 に Client VPN を使って接続してみます.

f:id:sadayoshi_tada:20201227143437p:plain

Client VPN では認証方式が3つあり,AD 認証,SAML 認証,相互認証があります.今回は相互認証,サーバーとクライアント間で証明書認証を行います.証明書は ACM に登録しておきます.

相互認証では、クライアント VPN は証明書を使用してクライアントとサーバー間の認証を実行します。証明書とは、認証機関 (CA) によって発行された識別用デジタル形式です。クライアントがクライアント VPN エンドポイントに接続を試みると、サーバーはクライアント証明書を使用してクライアントを認証します。サーバー証明書とキー、および少なくとも 1 つのクライアント証明書とキーを作成する必要があります。

サーバーおよびクライアント証明書とキーの生成

サーバーおよびクライアント証明書とキーの作成を行いますが,ドキュメントに記載のフローで対応してきます.キーの作成には easy-rsa を使用します.

docs.aws.amazon.com

$ git clone https://github.com/OpenVPN/easy-rsa.git
$ cd easy-rsa/easyrsa3
$ ./easyrsa init-pki #PKI 環境を初期化
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /XXXX/XXXX/easy-rsa/easyrsa3/pki

$ ./easyrsa build-ca nopass #新しい認証機関 (CA) を構築
Using SSL: openssl LibreSSL 2.8.3
Generating RSA private key, 2048 bit long modulus
......................................................................................+++
..............................................+++
e is 65537 (0x10001)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:awsclient-vpn #任意の名前を入力

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/XXXX/XXXX/easy-rsa/easyrsa3/pki/ca.crt


$ ./easyrsa build-server-full server nopass #
Using SSL: openssl LibreSSL 2.8.3
Generating a 2048 bit RSA private key
................................................+++
.............................................................+++
writing new private key to '/XXXX/XXXX/easy-rsa/easyrsa3/pki/easy-rsa-12050.LbZL9a/tmp.B8ySWj'
-----
Using configuration from /XXXX/XXXX/easy-rsa/easyrsa3/pki/easy-rsa-12050.LbZL9a/tmp.EXwFe7
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'server'
Certificate is to be certified until Mar 26 06:03:31 2023 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

$ ./easyrsa build-client-full client1.domain.tld nopass
Using SSL: openssl LibreSSL 2.8.3
Generating a 2048 bit RSA private key
....+++
............................+++
writing new private key to '/XXXX/XXXX/easy-rsa/easyrsa3/pki/easy-rsa-10663.vj9o3i/tmp.7GLYfD'
-----
Using configuration from /XXXX/XXXX/easy-rsa/easyrsa3/pki/easy-rsa-10663.vj9o3i/tmp.TXc5fX
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'client1.domain.tld'
Certificate is to be certified until Mar 26 04:03:38 2023 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

# 専用のカスタムフォルダーにサーバー及びクライアント証明書をコピーする
$ mkdir ~/client_vpn/
$ cp pki/ca.crt ~/client_vpn/
$ cp pki/issued/server.crt ~/client_vpn/
$ cp pki/private/server.key ~/client_vpn/
$ cp pki/issued/client1.domain.tld.crt ~/client_vpn
$ cp pki/private/client1.domain.tld.key ~/client_vpn/
$ cd ~/client_vpn/

証明書の ACM へのインポート

作成した証明書を ACM にインポートします.サーバー証明書とクライアント証明書をインポートします.コマンドがうまくいかない場合は画面から直接インポートでも証明書の登録可能です.

$ aws acm import-certificate --certificate fileb://server.crt --private-key fileb://server.key --certificate-chain fileb://ca.crt --region ap-northeast-1
$ aws acm import-certificate --certificate fileb://client1.domain.tld.crt --private-key fileb://client1.domain.tld.key --certificate-chain fileb://ca.crt --region ap-northeast-1

f:id:sadayoshi_tada:20201227091556p:plain

AWS Client VPN 設定を行う

Client VPN を使うための設定を行います.やるのは①クライアント VPN エンドポイント作成,②クライアントの VPN 接続の有効化,③クライアントのネットワークへのアクセスの承認です.

①クライアント VPN エンドポイント作成

クライアントが Client VPN との接続を確立するエンドポイントを作成します.IPアドレスの CIDR は /12~/22 の範囲で指定が必要です.検証用途のため一番小さいサイズで指定しています.また,ACM にインポートしたサーバー及びクライアント証明書を指定します.

IP アドレス範囲は、ターゲットネットワークまたはクライアント VPN エンドポイントに関連するいずれかのルートと重複できません。クライアント CIDR は、/12~/22 の範囲のブロックサイズが必要で、VPC CIDR またはルートテーブル内のその他のルートと重複できません。クライアント VPN エンドポイントの作成後にクライアント CIDR を変更することはできません。

f:id:sadayoshi_tada:20201227153102p:plain

残りとして関連するエンドポイントを紐付ける VPC とセキュリティグループを指定し,それ以外はデフォルト値でエンドポイントの作成を行います.

f:id:sadayoshi_tada:20201227153131p:plain

②クライアントの VPN 接続の有効化

次に,クライアントの VPN 接続の有効化を行います.エンドポイントと関連づけるサブネットを指定します.これでエンドポイントが有効化ステータスに遷移したり,ルートテーブルへの設定変更やセキュリティグループの関連付けが行われます.

f:id:sadayoshi_tada:20201227154839p:plain

クライアント VPN エンドポイントの状態が available に変わります。これで、クライアントは VPN 接続を確立できるようになりましたが、認証ルールを追加するまで VPC 内のリソースにアクセスすることはできません。

VPC のローカルルートは、クライアント VPN エンドポイントルートテーブルに自動的に追加されます。

VPC のデフォルトのセキュリティグループが、サブネットの関連付けに自動的に適用されます。

しばらくエンドポイント有効化までに時間を要するので待ちます.

f:id:sadayoshi_tada:20201227154155p:plain

③クライアントのネットワークへのアクセスの承認

そして,クライアントのネットワークへのアクセスの承認を行います.クライアントがアクセスできるサブネットの承認ルールを作成します.ユーザーは誰でもつなげるようにしておき,接続できるネットワークは EC2 がいる VPC の CIDR ブロックを指定しています.

f:id:sadayoshi_tada:20201227155851p:plain

VPN クライアント端末のセットアップ

Client VPN の設定は以上で,次に VPN クライアント側の設定をします.やるのは①クライアントアプリのインストール,②Client VPN 設定の取り込みです.

①クライアントアプリのインストール

AWS から専用のクライアントアプリが Windows/Mac それぞれで提供されているので下記のサイトからダウンロード,インストールします.

aws.amazon.com

自分は Mac なのでアプリケーションアイコンとして次のものができていました.

f:id:sadayoshi_tada:20201227160402p:plain

②Client VPN 設定の取り込み

次に,Client VPN 設定の取り込みを行います.Client VPN 画面から クライアント設定のダウンロード ボタンから設定ファイルをダウンロードすると,downloaded-client-config.ovpn というファイルが保存されます.ダウンロードしたファイルをエディターで開き,末尾にクライアント証明書の情報を転記します.

<cert>
Contents of client certificate (.crt) file
</cert>

<key>
Contents of private key (.key) file
</key>

VPN クライアントに設定ファイルを取り込むためにはプロファイルを管理 > プロファイルを追加 していきます.接続名は任意のもの(今回は test というプロファイル名にしました)にし,VPN 設定ファイルはダウンロードした設定ファイルを指定します.これで AWS との接続する準備が整いました.

f:id:sadayoshi_tada:20201227160728p:plain

サーバーへの接続テスト

いよいよプライベートサブネットのサーバーに繋いでみます.サーバーの IP アドレスは XXX.XXX.2.163になります.VPN を経由して SSH で繋いでみましょう.VPN 接続後に端末の IP アドレスを確認すると Client VPN エンドポイントに割り当てたネットワークのアドレスが振られていました.

f:id:sadayoshi_tada:20201227161341p:plain

% ifconfig
~中略~
utun2: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
    inet XXX.XXX.0.2 --> XXX.XXX.0.2 netmask 0xffffffe0

そして,対象のサーバーにも SSH できました!

 % ssh -i .ssh/XXX.pem XXX@XXX.XXX.2.163

Last login: Mon Dec 21 07:04:45 2020 from XXX.XXX.2.45
XXX@ip-XXX-XXX-2-163:~$
XXX@ip-XXX-XXX-2-163:~$ exit

まとめ

まずは Client VPN をつかってプライベートサブネットの EC2 に接続することをやりました.次は Client VPN をプライベートサブネットにある EC2 にもつなぎつつ他システムで IP アドレスを制御するためグローバル IP アドレスを付与しつつ Client VPN を使う検証を行った内容をまとめます.

AWS のネットワークの専門知識を証明する『AWS 認定 Advanced Networking Speciality』の試験勉強でやったことを整理する

タダです.

勉強の一環で,12/24 に「AWS 認定 Advanced Networking Speciality」を受けて合格しました.今回は自分がどんな勉強をしたかを振り返り,今後受験される方の勉強の参考になればと思い書いていきます.

試験範囲について

試験範囲については試験のガイドで確認できます.ネットワーク関連サービスの特徴を理解して,各トピックでの設計や実装,運用管理に関する知識が問われそうだと認識しました.

AWS 認定高度なネットワーキング – 専門知識」 (ANS-C00) 試験は、複雑なネットワーキングタスクを実行する個人を対象としており、大規模な AWS とハイブリッド IT ネットワークアーキテクチャの設計と実装に関する高度な技術スキルと経験を認定します。この試験で評価する能力は次のとおりです。

AWS を使用してクラウドベースのソリューションを設計、開発、デプロイできる

アーキテクチャの基本的なベストプラクティスに従ってコアとなる AWS のサービスを実装できる

AWS のすべてのサービスで使用するネットワークアーキテクチャを設計および運用できる

・ ツールを活用して AWS のネットワーキングタスクを自動化できる

aws.amazon.com

試験の比率

試験の割合が以下のようになっています.分野1,2の比重が高くなっているのでこの分野を中心に勉強していく方が良いかと感じました.

試験分野 試験における比重
分野 1: 大規模なハイブリッド IT ネットワークアーキテクチャを設計し、実装する 23%
分野 2: AWS ネットワークを設計し、実装する 29%
分野 3: AWS タスクを自動化する 8%
分野 4: アプリケーションサービスとネットワークの連携を構成する 15%
分野 5: セキュリティとコンプライアンスを設計し、実装する 12%
分野 6: ネットワークの管理、最適化、トラブルシューティングを行う 13%

試験勉強で注力したこと

次に,試験に向けて注力して勉強したことをまとめていきます.大きく2つのことをやりました.

1. 問われるトピックを確認する

サンプル問題を解くことでどのような問題が問われるのかを確認しました.サンプル問題を解いてみた感じですが,Direct Connect,VPC,ELB,CloudWatch あたりが問われそうだと感じたのでこれらのサービスで足りてない知識を補うことにしました.

サンプル問題リンク

2. ネットワーク関連サービス知識を深める

ネットワーク関連サービスの理解を深めるために BlackBelt シリーズと各種ドキュメントをみていきました.特に分野1のトピックで Direct Connect が扱われるので Direct Connect のトピックを中心に知識を補填していきました.

分野 1: 大規模なハイブリッド IT ネットワークアーキテクチャを設計し、実装する

1.1 ハイブリッド IT の接続を実装する

1.2 シナリオに応じて、適切なハイブリッド IT アーキテクチャの接続ソリューションを導出する

1.3 AWS Direct Connect を使用して接続を拡張するプロセスについて説明する

1.4 AWS Direct Connect を利用する代替の設計を評価する

1.5 ハイブリッド IT アーキテクチャのルーティングポリシーを定義する

BlackBelt シリーズで見た物

ドキュメントで見た物

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

試験の結果

試験の結果は750点の合格ラインで752点でした.前回よりかなりギリギリ😇 f:id:sadayoshi_tada:20201225050616p:plain

まとめ

AWS 認定 Advanced Networking Speciality」に向けて勉強した内容をおおまかにまとめました.かなりギリギリで合格できたものの今後のネットワーク関連のアップデートを追っていけないと更新の時に悲惨になりそうだなと振り返って思います.「Alexa Skill Builder Speciality」は来年3月に廃止になりますが最後合格してフルコンプを狙いたいと思います!

aws.amazon.com

関連記事

sadayoshi-tada.hatenablog.com

sadayoshi-tada.hatenablog.com

sadayoshi-tada.hatenablog.com

microCMS + Nuxt.js + Vue.js のコンテンツを GitHub Actions でビルド&デプロイする

タダです.

microCMS + Nuxt.js + Vue.js のコンテンツを GitHub Actions を使ってビルド,S3 にコンテンツを配備する設定を行いました.また,コンテンツが更新された時にも自動でデプロイされるような設定も行ったので振り返り目的で各設定についてまとめていきます.

GitHub Actions の定義

まず,GitHub Actions の定義部分です.やっている処理は S3 にアップロードするためのアクセスキーとシークレットアクセスキーを設定 -> ビルド -> S3 にコンテンツを同期しています.また,アクセスキーとシークレットアクセスキー,S3 へのパスを GitHub Secrets に設定しています.これで GitHub の特定ブランチにコードがプッシュされたら自動でビルド,S3 にコンテンツ配備されるよう設定できました.

jobs:
    build:
        name: Build & Deploy
        runs-on: ubuntu-latest

        steps:
            - name: Checkout
              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-region: ap-northeast-1

            - name: Build
              run: |
                yarn install 
                yarn build
                yarn generate
            - name:  Contents sync to s3
              run: |
                aws s3 sync [contents path] ${{ secrets.S3_PATH }} 

参考情報

docs.github.com

microCMS 設定部分

次に,microCMS 設定です.microCMS のコンテンツを更新が走った時に自動でGitHub Actions が自動ビルド,デプロイするように設定していきます.管理画面の API 設定 > Webhook > GitHub Actions を選択し,下記の画面の設定を行いました.

f:id:sadayoshi_tada:20201218113117p:plain

GitHub Actions 定義

microCMS 側の設定後 GitHub Actions 側も設定を追加しています.GitHub Actions の定義でrepository_dispatch を指定して microCMS の記事が更新,削除されたりした時 update_post イベントが発行されてくるので そのイベントをトリガーに GitHub Actions が動くように設定しました.これで記事を更新したら自動でビルド,デプロイするようになりました.

on:
~中略~
    repository_dispatch:
      types: [update_post]

参考情報

docs.github.com

まとめ

microCMS + Nuxt.js + Vue.js のコンテンツを GitHub Actions を使ってビルド,S3 にコンテンツを配備するための設定を行ったのでその内容を振り返ってまとめました.設定自体は比較的簡単にできるけれど自動ビルド,デプロイされるのは非常にありがたいです.同様の設定する方の参考になれば嬉しいです.

関連記事

sadayoshi-tada.hatenablog.com

redash のアラート機能を使って Slack に通知する設定を試した

タダです.

データの可視化を redash で実現する中で特定のデータが閾値に達した時に Slack に通知して欲しいといった要件があり,redash のアラート機能をその要件に合うものかを検証してみたのでこの記事に検証した内容を整理してきます.

検証で使った環境

検証で使った環境は redash の AMI を使っています.東京リージョンのものを使ったので ami-060741a96307668be を指定しています.

redash.io

redash アラート機能設定

今回のケースではデータがリアルタイムで更新される社内システムがあり,そのデータを redash からクエリを発行して見たいといった条件を想定した検証しています.検証した内容にフォーカスするため redash の初期セットアップやデータソース,アラートに関連するクエリ結果の事前設定は割愛し,設定済み前提でアラート機能を使うために設定した内容を以下では書きます.

Slack の設定

まず,アラート発生後の通知先として Slack に通知したいので Slack の設定からです.Settings > Alert Destinations > New Alert Destinationから Slack を選択します. f:id:sadayoshi_tada:20201215054654p:plain

次に, Slack 自体の設定ですが設定名と Incoming Webhook URL を設定しました. f:id:sadayoshi_tada:20201215054708p:plain

以上でアラート先の設定自体は完了です.

アラート設定

そして,アラート設定に移っていきます.上部メニューのCreate > Alert を選択します.

  1. 最初にQuery 欄に事前定義したアラートに関連するクエリを選択します.
  2. 次にアラート通知したい結果が入っているカラムを指定します.
  3. そして,アラートの条件を指定していきます.今回は Value が 100 以下になった時にアラートを出すよう設定しています.
  4. 最後に先ほど指定した Slack の設定を通知先から選んで Add で追加し,Save ボタンで保存します.

f:id:sadayoshi_tada:20201215055531p:plain

以上でアラート設定が完了です.

Slack への通知結果

あとはデータが閾値に達するまで待つだけですが,閾値に達した時に以下の画像のように通知されます.このような形で Slack へのアラート投稿ができました.

f:id:sadayoshi_tada:20201215060504p:plain

設定中に感じた注意点

設定自体は完了なのですが,redash のアラート設定を試して感じた注意点を最後にまとめます.

  • アラート通知できる条件で指定できる値は1つだけなので,クエリ結果で複数レコードが返る場合1レコードしか返らないようにしないと意図したアラートは発行が難しい
  • 画面上で確認する限り条件分岐ができるわけではなさそうなので複雑な処理する場合はコードで制御が必要になると思われる

まとめ

redash のアラート機能で Slack 通知する設定を検証したのでまとめました.クエリの結果を1つに絞れればリアルタイムでコードを書くことなく通知できたのは手軽に設定できてよかったなという感覚でした.

毎週ブログを書くことを3年間続けてみた1年を振り返る

タダです.

この記事は『write-blog-every-week Advent Calendar 2020』の14日目の記事です.自分は3年間毎週ブログを書くことを続けてきたのですが,2年目とは違った1年を感じたのでこの記事でこの1年を振り返ってきます.

adventar.org

write-blog-every-week とは

まず『write-blog-every-week』は毎週月曜日から日曜日までの間にブログに目標にしている記事を作っていくこととその記事作成をみんなで後押しする会です. ブログのテーマは問わないことになっています.自分は昨年5月によしたく(id:yoshitaku_jp)さんに誘っていただいて参加させてもらいました.

各メンバーの記事はこのサイトから見ることができるので興味ある人はぜひご覧ください!

毎週ブログを書いて3年目の振り返りと所感

まず,3年目のブログの振り返りをしていきます.テーマ的には今年も AWS がベースにあるもののデータ分析ネタとコンテナネタを増やせたと感じてます.

継続年数が3年目に入るためAWS 以外の切り口で Python,データ分析,コンテナに関わる発信も力を入れていきブログをきっかけに人との繋がりを広げたいと思っています.

データ分析は実業務でも関わっているし AWS DevDay に登壇させていただきました.登壇することで興味をもってもらったりして他社さんとの交流もできてすごくよかったです.技術力も運用力もまだまだなのでこれからも力つけ続けていきます.

sadayoshi-tada.hatenablog.com

コンテナで言うと AWS Copilot のプレビュー段階から記事を書いていき,初めてですがリポジトリにコミットできたのも(ドキュメント修正ですが😅)いい経験でした.来年は業務で EC2 のシステムを ECS に置き換えたいので検証からネタ作りしていきたいです.

sadayoshi-tada.hatenablog.com

ホッテントリ入りする記事をを作る(2019年はホッテントリ数が16記事なので20記事を目指す)
月間のPV数を平均3,000超えを目指す

PV の推移で振り返ると3,000 PV を超えたのが11月時点で5回で昨年は3回だったので成長しているのですが,目標にしていた月間の平均を3,000 PV 以上という目標は達成しきれてないです.が,1日の平均PV 数が150を超えるようになってきたので来年も継続して狙い続けていきます.

PV 数
1 2253 pv
2 2259 pv
3 1433 pv
4 2474 pv
5 3484 pv
6 2363 pv
7 3008 pv
8 3391 pv
9 2796 pv
10 3740 pv
11 3279 pv
12 1730 pv(12/12時点)

ホッテントリの数ですが,12/12時点で15個とっている状況です.目標到達まであと5つなのでこっから連チャンで入ればワンチャン狙いたいですw

b.hatena.ne.jp

3年目で感じたこれまでとは違う経験

転職の時にブログのことを触れてもらう機会があった

9月に転職して今の会社にいるんですが,転職活動は今年の4月〜7月くらいまでやりました.コロナ禍を受けて Web ミーティングツールを使った面接だったんですが,全ての会社さんではないですけれど,ブログを面接前に見てくださったりしてくれていました.その中には自分の書いた記事をはてブで登録してくれている方もいて,単純に嬉しかったのを覚えています.ブログは書いていることを認知してくれる人はいたのですが,実際に記事見てくれてブックマークに保存してくれるほどの人には初めて出会ったので続けてきてよかったことだし,履歴書とは別でどんな技術に詳しいのかもわかるツールとなっていてブログを書く効果として自分が感じたことがない経験でした.

転職後のブログの立ち上げ時や立ち上げ後も相談してもらえた

入社した段階から情報発信の手法として何を使うのがいいかという話を CTO や同僚と話をしていた時に自分はブログを推してました.CTO からもブログを続けているからってことで相談をしてもらえたし,自分も速くやりたくて決めなきゃいけないことを CTO や同僚に確認して進めました.先月,最終的にブログアカウントを開設しています.今のところは自分しか書いてないのですが,ネタはあるし書きたいと思っているというメンバーの話もあるので何かサポートできることはガンガンやってきたいです.

labs.snaq.me

まとめ

毎週ブログを続けて3年目を振り返っていきました.続けることで目にしてくれる人が増え,ブログを書き続ける経験していることでその経験を頼ってもらえる経験は自分になかったことです.これからも止まることなく走り続けていきたいと思った1年でした.

関連記事

sadayoshi-tada.hatenablog.com

sadayoshi-tada.hatenablog.com

sadayoshi-tada.hatenablog.com