ジャギ様のAWSチャレンジ

awsに関したことを書きます。

Mattermost構築の流れ(手動編)Part4 Lambda、Cloud9

Lambda

用途

  • Mattermost起動に必要な初期データをデータベースに作成するためにLambdaを使います。ただLambdaを使いたいが為に使います。
  • EC2からデータベースに接続してデータを作成する場合はskipしてもOKです。難易度がかなり高いので演習ではLamdbaはskipします。次は Mattermost構築の流れ(手動編)Part5 EC2 - ジャギ様の部屋 です。

Lambda用のセキュリティグループの作成

  • AWSコンソール画面の検索窓に「セキュリティグループ」と入力→セキュリティグループをクリック→セキュリティグループを作成ボタンをクリック
画面 設定項目 設定値
基本的な詳細 セキュリティグループ名 mattermost-lambda-sg
説明 Security group applied to Mattermost Lambda
VPC mattermost-vpc
インバウンドルール - -
アウトバウンドルール - -
タグ - オプション キー Name
値 - オプション mattermost-lambda-sg

Lambda用のIAMロールの作成

  • AWSコンソール画面の検索窓に「IAM」と入力し、IAMをクリックする。
  • 左メニューのロールをクリック→ロールを作成ボタンをクリック
  • 設定項目は以下
画面 設定項目 設定値
信頼されたエンティティを選択 信頼されたエンティティタイプ AWS のサービス
ユースケース Lambda
許可を追加 許可ポリシー AmazonRDSFullAccess
AWSLambdaVPCAccessExecutionRole
名前、確認、および作成 ロール名 mattermostRdsAccessRole
説明 This is the role that holds access to RDS and applies to Lambda.
タグを追加 キー Name
値 - オプション mattermost-lambda-role

関数(Lambda Function)の作成

  • AWSコンソール画面の検索窓に「Lambda」と入力し、Lambdaをクリックする。
  • 左メニューの関数をクリック→関数の作成ボタンをクリック→一から作成を選択する。
画面 設定項目 設定値
基本的な情報 関数名 mattermost-create-initdata
ランタイム Python 3.9
アーキテクチャ x86_64
デフォルトの実行ロールの変更 既存のロールを使用する
既存のロールを使用する mattermostRdsAccess
詳細設定 VPC を有効化 チェックを入れる
VPC mattermost-vpc
サブネット mattermost-subnet-private1-ap-northease-1a
mattermost-subnet-private2-ap-northease-1c
セキュリティグループ mattermost-lambda-sg

コード修正

  • lambda_function.pyを開き、このコードに書き換えます。
  • 書き換えた後、Ctrl + s で保存します。
  • その後、デプロイボタンをクリックします。関数 mattermost-create-initdata が正常に更新されました。と画面上部に表示されればOKです。

Cloud9

用途

  • Cloud9でLambdaの実行に必要なpymysqlモジュールをインストールします。Cloud9を使わなくても可能ですが、利用機会がないので使います。
  • 使い方がよくわからず、かろうじて使えてるといった手順になります。

Cloud9の画面起動

  • AWSコンソール画面の検索窓に「Cloud9」と入力し、Cloud9をクリックする。
  • Create environmentボタンをクリックします。

Cloud9の設定画面

  • Name environment画面が起動するので以下の設定を行い、Next stepボタンをクリックします。

Environment name and description

設定項目 設定値
Name mattermost-cloud9
Description (デフォルトのままでOK)

Environment settings

  • 続いてConfigure settings画面が起動します。設定は全てデフォルトのままでNext stepボタンをクリックします。

Review

  • 続いてReview画面が起動します。さらっと設定内容に目を通し、Create environmentボタンをクリックします。Cloud9はすぐ削除するので設定内容は気にしなくてOKです。

ここからCloud9の画面(コンソール)の操作

  • Cloud9の画面が起動したら左メニューのAWSLambdamattermost-create-initdata右クリックDownloadをクリックします。

  • Select a workspace folder for your projectにはmattermost-cloud9をクリックします。

  • するとダウンロードが始まるので、左メニューのEnvironmentLambdamattermost-create-initdataがあることを確認します。

  • 画面下部のコンソールで以下のコマンドを実行します。インストール後はzipコマンドで圧縮します。pymysqlはdbにアクセスするために必要なモジュールです。インストールするとCloud9のエクスプローラ上にフォルダが作成されていることが確認できます。

$ cd mattermost-create-initdata
$ pip install pymysql -t ./
$ zip -r mattermost-create-initdata.zip *

  • 左メニューのAWSLambdamattermost-create-initdata右クリックUpload LambdaZip Archivemattermost-create-initdata.zip選択→Openボタンクリック→Yesボタンクリック
  • Lambdaの画面を見て、pymysqlフォルダが確認できればOK

S3にmattermost-create-initdata.zipアップロード

  • 手動編の手順では使わないのですが、自動編の手順で使うのでここでアップロードしておきます。
  • Cloud9からバケットの作成とファイルのアップロードが可能です
    • 左メニューのAWSS3→右クリック→Create Bucket...バケットcfn-lambda-mattermost
      • バケット名は他人のバケットを含めて一意のものである必要があります。エラーが起きたら名前を変えましょう。バケットcfn-lambda-mattermostは筆者が使っているので絶対使えません。
    • 左メニューのAWSS3cfn-lambda-mattermost右クリックUpload FilesZip Archivemattermost-create-initdata.zip選択→Uploadボタンクリック→Yesボタンクリック
  • S3の画面でアップロードされたことを確認しましょう。

テストイベントを設定

  • Testボタンを押下します。するとテストイベントを設定画面が起動しますので以下のように設定します。
設定項目 設定値
イベントアクションをテスト 新しいイベントを作成
イベント名 mattermost-createdata
イベント共有の設定 プライベート
テンプレート - オプション (デフォルトのままでOK)
イベント JSON (デフォルトのままでOK)
  • 保存ボタンをクリックします。

環境変数の設定

設定項目 設定値
DB_NAME mattermost
DB_PASSWORD adminadmin
DB_USER admin
DB_WRITER_ENDPOINT_ADDRESS (RDSのエンドポイントを設定します。RDSの画面からコピーしてください。書き込みの方です。読み取りの方はNG)



Lambda実行

  • Deployボタンの押下が必要かも。押せる状態なら押しておく。
  • Testボタンをクリックし、以下のような出力があれば実行は成功です。time outで失敗するときはセキュリティグループの設定が悪い、別のVPCに所属していることを疑います。
  • 実際にデータベースのデータを見るのはEC2の手順内で行います。

Cloud9の削除

  • AWSコンソール画面の検索窓にCloudFormationと入力し、CloudFormationを選択する

  • Cloud9から削除しましょう。

Mattermost構築の流れ(手動編)Part3 RDS

RDS

RDSの用途

Mattermostのデータを格納するデータベースとして利用します。

RDSのセキュリティグループ作成

  • EC2からデータベースにアクセスするためのセキュリティグループを作成します。
  • AWSコンソール画面の検索窓に「セキュリティグループ」と入力→セキュリティグループをクリック→セキュリティグループを作成ボタンをクリック
画面 設定項目 設定値
基本的な詳細 セキュリティグループ名 mattermost-db-sg
説明 Security group applied to Mattermost database
VPC mattermost-vpc
インバウンドルール タイプ MYSQL/Aurora
プロトコル TCP
ポート範囲 3306
ソース AnywhereIPv4
説明 - オプション Allow inbound communication on port3306 from source
アウトバウンドルール - -
タグ - オプション キー Name
値 - オプション mattermost-rds
  • VPCVPC IDで表示されているので一見どこのVPCが選択されているのか判断できません。デフォルトで表示されているVPCを削除すると、リストからVPC選択できるようになります。選択するときはVPC IDVPC名の両方が表示されてますので、目的のVPCを選択してください。
  • 説明は英数字が利用可能です。入力は省略可能です。
  • 値 - オプションは日本語と英数字が利用可能です。入力は省略可能です。
  • ※ アクセス元となるソースIPアドレス)は制限することが望ましいですが、演習なのですべて許可(AnywhereIPv4)します。
  • ※これはこの後の作業でも共通する内容となります。上記の説明は全作業で共通することになるので、以後は省略します。

作成されると以下のように確認できます。

RDSの作成

  • AWSコンソール画面の検索窓にRDSと入力し、RDSをクリックする。
  • データベースの作成ボタンをクリック。
画面 設定項目 設定値
データベース作成方法を選択 データベース作成方法を選択 標準作成
エンジンのオプション エンジンのオプション Amazon Aurora
エディション Amazon Aurora MySQL 互換エディション
フィルターの表示 (デフォルトのままでOK)
利用可能なバージョン Aurora(MySQL 5.7) 2.10.2
テンプレート テンプレート 開発/テスト
設定 DB インスタンス識別子 mattermost-db
マスターユーザー名 admin
Manage master credentials in AWS Secrets Manager (チェックしません)
パスワードの自動生成 (チェックしません)
スターパスワード adminadmin
パスワードを確認 (マスターパスワードと同じものを入力)
インスタンスの設定 DB インスタンスクラス バースト可能クラス (t クラスを含む)
db.t2.small
(以前の世代のクラスを含めるにすると表示されます)
可用性と耐久性 マルチ AZ 配置 Aurora レプリカを作成しない
接続 コンピューティングリソース EC2 コンピューティングリソースに接続しない
Virtual Private Cloud (VPC) mattermost-vpc
DBサブネットグループ (デフォルトのままでOK)
※もしかすると自分で作ったプライベートサブネットとは違うサブネットに配置されるのかもしれない。
パブリックアクセス なし
VPC セキュリティグループ 既存の選択
既存の VPC セキュリティグループ mattermost-db-sg
アベイラビリティーゾーン ap-northease-1a
RDS Proxyを作成 (チェックしません)
追加設定 (デフォルトのままでOK)
データベース認証 データベース認証オプション パスワード認証
モニタリング (デフォルトのままでOK) (デフォルトのままでOK)
追加設定 最初のデータベース名 mattermost
上記以外の項目 (デフォルトのままでOK)

作成されると以下のように確認できます。

Mattermost構築の流れ(手動編)Part2 VPC、サブネット、ルートテーブル、インターネットゲートウェイ

VPC

VPCの用途

クラウド上に自分が自由にできる空間を作るという感じです。

VPCの作成

以下の設定でVPCを作成します。

  • AWSコンソール画面の検索窓に「VPC」と入力し、VPCをクリックする。
  • VPCを作成ボタンをクリックする。
  • 設定項目
設定項目 設定値
作成するリソース VPCなど
名前タグの自動生成 自動生成にチェック
自動生成のボックス mattermost
IPv4 CIDR ブロック 10.0.0.0/16
IPv6 CIDR ブロック IPv6 CIDR ブロックなし
テナンシー デフォルト
アベイラビリティーゾーン (AZ)
パブリックサブネットの数
プライベートサブネットの数
NAT ゲートウェイ ($) なし
VPC エンドポイント なし
DNS オプション DNS ホスト名を有効化
DNS 解決を有効化

Memo

  • 画面右側のプレビューを見ればわかりますが、ここではVPCだけではなく サブネット、ルートテーブル、インターネットゲートウェイ(ネットワーク接続)が自動で作成されます。この後の作業で作成したVPC等を使いますので名称を確認しておきましょう。

  • VPCを削除するとサブネット、ルートテーブル、インターネットゲートウェイ(ネットワーク接続)も削除されます。

  • VPC作成後の画面


Mattermost構築の流れ(手動編)Part1 ドメインの取得、ACM、Route 53

ドメインの取得

ドメインはMatterostにアクセスするときのURLとして利用します。取得するサイトはどこでもよく、Awsでも取得可能です。ドメインはなくても構築可能ですが、無料なので利用しない理由はありません。取得することでアクセスするURLが固定できるメリットもあります。 今回はお名前.com Naviドメインを取得しました。Awsで取得しなかった理由はAwsは価格面で高いと感じたからです。 取得手順はこちらでは画面にそって進めていけば簡単に取得できます。 契約後に年自動更新契約となったので、自動更新の設定を解除をしました。

取得サイト 取得したドメイン
お名前.com Navi jagisama.com

なお、このドメインは勉強期間が終われば処分します。

Route 53の設定とドメインの設定

Route 53の設定とドメインの設定をします。目的は取得したドメインにアクセスしたときに、Awsにリクエストが流れるようにするためです。 設定は以下の記事を参照して行います。注意点としてネームサーバをメモする作業があるのですが、最後のドットは不要です。(例:ns-xxx1.awsdns-53.co.uk.ではなくns-xxx1.awsdns-53.co.uk

ACMの作成

用途

ACMとはSSL証明書を発行してくれるサービスです。今回はMatterMostとhttps通信をするために必要です。http通信でも構築可能ですが、無料なので利用しない理由はありません。またhttps対応してないとブラウザによっては危険サイトと見なされブロックされてしまうので、そういうことも回避したいです。

ACMの画面起動

  • AWSコンソール画面の検索窓に「ACM」と入力し、Certificate Managerをクリックする。
  • 証明書をリクエストボタンをクリックする。

証明書をリクエスト画面

  • 次へボタンをクリックする。

パブリック証明書をリクエスト画面

画面 設定項目 設定値
ドメイン 完全修飾ドメイン *.jagisama.com
サブドメイン運用をします。こうすることで1つのドメインでaaa.jagisama.com 、bbb.jagisama.com、ccc.jagisama.comといった複数のドメインを扱えます。こうすれば一つのドメインでたくさん利用可能です。
検証方法を選択 ドメインの所有権を検証する方法を選択 DNS 検証 - 推奨
キーアルゴリズム RSA 2048
タグ タグキー Name
タグ値 - オプション mattermost-acm

証明書画面

  • 証明書のステータスが保留中の検証になっています。この状態で証明書IDをクリックする。

証明書ステータス画面

  • route 53でレコードを作成ボタンをクリックする。

route53の画面

  • ここはroute53の画面
  • チェックボックスにチェックを入れて、レコード作成ボタンををクリックする。

レコード作成画面

  • ここはroute53のホストゾーンの画面です。
  • 作成したレコードをクリックし、CNAMEレコードが増えたことを確認する。

初期状態の画面


増えた画面


ACMの画面に戻ります。

  • 証明書のステータスが発行済みに変わることを確認。

Mattermost構築の流れ(自動編)

Mattermost構築の流れ(自動編)

事前準備

注意事項

コード取得

$ git clone https://github.com/tmoritoki0227/mattermost-cf-playbook.git

$ cd mattermost-cf-playbook

自分用にカスタムする箇所

$ vi ansible-cf-mattermost.yml
設定箇所 設定項目 用途
Parameters KeyNameのdefault 秘密鍵の名前
EnableMultiAzのdefault DBのマルチAZ設定。デフォルトはシングル構成
DomainNameのdefault Mattermostで利用するドメイン
SubDomainNameのdefault MattermostにアクセスするときのURL。サブドメイン
HostedZoneIdのdefault ホストゾーンのID。Route53で確認できます
SNSTopicNameのdefault SNSトピック
TestDataS3BucketArnのdefault Lambdaのzipをアップロードしたバケット
S3BucketNameのdefault Lambdaのzipをアップロードしたバケット

ネットワーク等のAWSリソースの作成

cloudformation実行

$ aws cloudformation deploy \
    --template-file ansible-cf-mattermost.yml \
    --stack-name mattermost \
    --capabilities CAPABILITY_NAMED_IAM

コマンド実行後、cloudformationのスタックで進行状況を確認してください。20分程度かかります。

Lambda実行

データベースにデータを投入するために動かします。

EC2のセットアップをする

PCからansible実行する場合

  • 秘密鍵の場所を指定する必要があります。
  • prodファイルサーバ名とRDSエンドポイントを修正する必要があります。スタックの出力に表示された名前をコピペするか、EC2、RDSの画面からコピペします。
# サーバ名とRDSエンドポイントの修正
$ vi inventories/prod

# ansible実行
$ ansible-playbook -i inventories/prod -u ec2-user --private-key="~/.ssh/id_rsa" site.yml

CodeBuildからansible実行する場合

  • 手動版のCodeBuildの実行手順と同じ手順です。

動作確認

Mattermost開発環境構築

Mattermost開発環境構築

  • 必須の意味は筆者のやり方では必須という意味です。awscliはCloud9を使うのであれば、自分でセットアップすることは不要です。

WSLのセットアップ(必須

AWS CLIのセットアップ(必須

VSCODEのセットアップ(任意)

Ansibleのセットアップ(任意)

コマンドはマニュアルと少し変えた。

$ sudo apt-get update
$ sudo apt-get install python3-pip git libffi-dev libssl-dev -y
$ sudo pip install ansible pywinrm
$ sudo apt install ansible-lint
$ ansible-playbook --version
$ sudo vi /etc/ansible/ansible.cfg

ansible.cfgに以下を追加する。[ssh_connection]セクションは既にあるので注意してください。

[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null

全部実施すると、こんな感じでVSCODEから操作できるようになります

AWS上にMattermostを構築する(TOPページ)

インフォメーション! youtu.be

概要

AWSMattermostを以下のような構成のクラウド環境で作成します。手動で行う方法と自動で行う方法を記載します。 ゴールはMattermostのログイン画面が表示されることです。作業時間は初心者の方で2~4時間程度かかると思います。画面操作に慣れれば1~2時間程度だと思います。

実施環境

注意事項

  • 本ドキュメントを参考に作業をする場合、jagisam.comは使えません。自身で取得したドメインに読み替えてください。
  • 作業中はEC2を停止しないでください。IPが変わると動かなくなります。
  • 手動編はEC2とRDSはシングル構成で構築します。時間短縮のためです。
  • 各ページの表記方法は意図的に統一感を出してません。これはmarkdownの記事の見え方を試しているからです。
  • 手順はまっさらな状態からテストはできてないので、どこかの手順でつまずく可能性があります。

構築の流れ(手動編)

  1. Mattermost構築の流れ(手動編)Part1 ドメインの取得、ACM、Route 53 - ジャギ様のAWSチャレンジ
  2. Mattermost構築の流れ(手動編)Part2 VPC、サブネット、ルートテーブル、インターネットゲートウェイ - ジャギ様のAWSチャレンジ
  3. Mattermost構築の流れ(手動編)Part3 RDS - ジャギ様のAWSチャレンジ
  4. Mattermost構築の流れ(手動編)Part4 Lambda、Cloud9 - ジャギ様のAWSチャレンジ
  5. Mattermost構築の流れ(手動編)Part5 EC2 - ジャギ様のAWSチャレンジ
  6. Mattermost構築の流れ(手動編)Part6 ALB - ジャギ様のAWSチャレンジ
  7. Mattermost構築の流れ(手動編)Part7 SNS、CloudWatch - ジャギ様のAWSチャレンジ
  8. Mattermost構築の流れ(手動編)Part8 S3、ASM、CodeBulid - ジャギ様のAWSチャレンジ
  9. Mattermost構築の流れ(手動編)Part9 SES - ジャギ様のAWSチャレンジ
  10. Mattermost構築の流れ(手動編)Part10 Mattermost起動後の設定 - ジャギ様のAWSチャレンジ

構築の流れ(自動編)

本記事は以上です。 クラウド環境の作成の手助けになれば嬉しいです。

参考文献

本記事の作成に当たり、以下の情報も参考にさせて頂きました。ありがとうございました。

その他にたくさんのページを参考にしました、急いで作ったら掲載元がわからなくなりました。

あとがき

  • 筆者はいつも自動構築を実施しているので、逆に手動構築の手順が難しかったです。しんどいです。
  • 実際に構築の経験させてくれる方のオファー待ってます。経験積んで週末副業に繋げるのが今の目標です。
  • コストカットを取り入れてます。その方法はIPを固定しないこと。ドメインを無料で利用していること。cloudformationを利用して、リソースの作成、削除を簡単にしていること。なお、IPは固定するとかなり楽になります。
  • 当ブログはこれまでの構築時のメモを元に一週間で執筆しました。構築は別途2週間程度かけて少しずつ進めました。
  • どういう表現をすると見やすくなるかという点を考えながら執筆しました。いろいろ試した結果、基本は表で示し、分かりづらい場面に画面の画像で補足する形が良いと感じました。また画像はgifアニメーションにした方が分かりやすいです。
  • 当ブログを執筆中に、markdown(文書)では表現しずらい箇所が多々あるのと、文書だけだとつまらないので、久々にゆっくりムービーメーカーで動画にしようかなと思いましたが、今回は一旦ここで区切りとします。