ECS(Fargate) デプロイ
ECS(Fargate) デプロイする流れ
アプリ構成としては Go, PostgreSql,Nginx
全体の流れ
*当初はdocker composeで本番環境を構築しようとしていたが、開発環境と本番環境は別物であると気づいた。開発と全く同じ環境を本番へと適用するわけではないので(dbはコンテナを使わずrdsを使う等)、あとdocker composeでやると勝手に作成されてしまうため、何が作られているのかよく分からないと思う。
そのため本番環境はdocker composeで作成せず、aws内で一つずつ作成していく形にする。
#メモ
・ECRにimageを上げ直した場合サービスを更新してデプロイの強制することで変更を反映(サービスの更新しなくても時間差で反映されるのかは分からないけど、こっちの方が確実)
・サービス内のタスクのログが見たい場合、タスクのページに行ってコンテナのタブをクリックすると色々表示されてCloudWatch のログを表示ってのが出るのでそっちいくとcloud watchのログ見れる。タスクのページにもログはあるが、こっちの方が反映は遅いし、cloud watchのほうがいい。ちなみにこの時クラスター作成時にcloud watchをオンにはしてなかったんだけど(お金かかるため)cloud watch使えた。課金してたら何か違いがあるのかは分からない。
#
・ECRにimageを上げる。
まず、それぞれのコンテナで使うimageをbuildする必要がある。
このimageを開発環境とは違うので本番用のimageを作成する。
またdocker-composeで作成するのではなく、一つずつDockerfile(本番用)からimageをbuildすることにした。
!!!!!超重要。m1 mac使用している場合はECRにimageを上げる時のimageは--platform amd64を指定すること。!!!!!!
今回、docker-composeはあくまで開発用という扱い。本番用のdocker-composeは存在しない。
またdbに関してはコンテナ運用するよりdbだけはコンテナと切り離して使用した方がいいらしい。(Elastic File System(efs)でvolumeを作るのも考えたけど、efsはdbにはあまり向かない?まぁRDSを使った方がいいのは確実だと思う)dbはRDSを使用するため、コンテナ使用しないのでECRに必要ない。そのため今回この作業で必要なのはGoとNginxだけ。
コマンド(ECR行ってpushコマンドを確認。手順2はしなくていい。)
1 ログイン
この時ログインできないことある。
下のようなエラー出た場合(AWS ACCESS KEYとAWS ACCESS SECRET KEYが正しくない)は以下のurl参照。
when calling the GetAuthorizationToken operation: The security token included in the request is invalid.
Error: Cannot perform an interactive login from a non TTY device
(https://qiita.com/kaito_program/items/7b9ba489e44d2295cf6f)
*ターミナルを閉じると効果が切れるらしいのでその時はまた同じ設定する感じ。効果永続できるようにしたいが自分はわかってない。
*ECR以外でもこのエラーが出る可能性は高いと思うので、他のとこでも参考にしてほしい。
2 imageをbuild(最初に上でやった工程なので既にやっていればしなくていい)
3タグ付け
(例)docker tag *go-nginx-production*:latest XXXYYYZZZ.dkr.ecr.ap-northeast-1.amazonaws.com/go-nginx-ecr:latest
**で囲んだ場所に関してはbuildしたimageの名前に変更すること。
今回の場合はbuildしたimage(go-nginx-production)とecrのimage(go-nginx-ecr)が異なるので、commandを修正している。同じなら修正しなくていい。
4 push これはcommandそのまま打つだけ
以上でECRにimageを上げるのは終了
---------------------------------------------------------------------
以降使うセキュリティグループ
go ...カスタムTCP port3000
nginx ...HTTP, HTTPS (ALBで使用)
postgresql(RDS) ... PostgreSql
---------------------------------------------------------------------
* 以降使うvpcは全て一緒にすること。ない場合は作成しとく。
・ クラスター作成
・タスク定義作成(goとnginx用それぞれ作成)
それぞれにコンテナを記述。コンテナimageはECRのurlをクリックして貼り付ける。
・サービス作成(goとnginx用それぞれ作成)
・それぞれ先ほど作ったタスク定義を割り当てる。
・サービス間の連携を行う場合、サービスの検出をオンにする。(サービスディスカバリ)。名前空間を設定してサービスを共通グループで囲み。サービス名をそれぞれ設定。これでそれぞれのサービスが繋がることできた(nginxのnginx.confにてproxy_pathにサービス名(go).名前空間とすることでgoのurlにいってる)
nginx.confにまだサービス名.名前空間を反映してない場合は変更してimage(本番用)をbuildし直し、再度ECRへupする動作を行う。
・この段階では、ALB(Nginxだけ)とAuto Scalingの設定はしない。ALBの設定に関してはサービス作成時でないといけないので、nginxサービスに関しては後で作り直す。
-------------------------------------------------------------------
RDS(PostgreSql)
dbはコンテナじゃなくてRDS使う。値段高いのが痛い。
作成し終えたらrdsのurl生まれるのでgoのpostgres接続のhostにこのurlを当てる。
imageに反映されてなかったら再度build ecrにup
---------------------------------------------------------------
ALB(Application Load Balancer)
--------------------------------------
*設定前の準備
独自ドメイン取得。
ACM(Aws Certificate Manager)で証明書発行
-----------------------------------
・まずはターゲットグループ作成(EC2に行ったらある)。
Ip address選択
HTTP port 80
protocol version Http1
*healthy checkのpathはアクセスできるpath(postやログイン必要なパスはunhealthy返ってくるのでNG)自分の場合はそういうpathなかったので、goでjsonでmessageを返すだけのpathを作ることにしてそれをhealthy checkのpathとした。
IPv4 addressはいじらなくておk(最後の1桁を勝手に決めてくれる設定)
---------------------------------------------------------
・ロードバランサー作成
Application Load Balancer選択
vpc選択してmappingしとく。
セキュリティーグループは上のサービスのnginxと同じに(HTTP,HTTPS)
Listner and RoutingにはHTTPとHTTPSを設定する(それぞれ先ほど作ったターゲットグループ付与)
Default SSLCertificateはACMで発行した証明書設定
以上でALB作成完了。
---------------------------------------------
・サービスとALB紐付ける
ALB設定はサービス開始時じゃないと行えないため先ほど作成したnginxサービスを削除、再度作成することにする。
ロードバランサーの設定に行ったら、Application Load Balancer選択、先ほど作成したALB名選択。
ロードバランス用のコンテナでロードバランサーに追加ボタンを押す。
プロダクションリスナーポートはHTTPS
ターゲットグループに先ほどロードバランサー作成時に作ったターゲットグループを設定(この時プロダクションリスナーポートが自動でHTTPになるけど、先ほどHTTPSとした意味はあったのか不明、元からHTTPでもいいと思うが・・・動きはする)
・Auto Scaling
Auto scalingの設定は簡単。サービスの更新で最後にauto scaling設定してあげればいい。
・独自ドメインとALBを紐づける
Route53で独自ドメインのホストゾーンに。レコードの作成クリック。
レコード名はからで。
エイリアスをオンにしてそこでロードバランサーを選択してレコード作成すればおk
これにて終了
PHP 関数
関数について〜
関数とは処理のこと Rubyでいうメソッドです。
難しくないよ。大変便利!!
関数に関して
関数は前に持ってくる。
前 後
RUbyのメソッドは後ろだったのでそこが違う!
例)
文字列に対する関数
strlen — ⽂字列の⻑さを得る
strtolower — ⽂字列を⼩⽂字にする strtoupperで大文字に
substr — ⽂字列の⼀部分を返す
explode — ⽂字列を⽂字列により分割する
implode — 配列要素を⽂字列により連結する
配列に関する関数
count — 変数に含まれるすべての要素を数える
array_reverse — 要素を逆順にした配列を返す
array_sum — 配列の中の値の合計を計算する
array_slice — 配列の⼀部を表示。配列自体はそのまま。要素を消したりせず一部表示
sort — 配列を並び替える。辞書順。アルファベット順である。
PHP学習2日目 反復 条件分岐 連想配列 等
PHP学習2日目になります!
学んだことブログにメモっていきま〜す
反復 while, for
ネストがある場合
外側の処理1回目
内側の処理が終わるまで繰り返す
外側の処理2回目
内側の処理が終わるまで繰り返す
・・・・
外側の処理最後
内側の処理が終わるまで
breakでforの処理を抜ける
この場合$i=5は行われない。
continueはその場合の処理を飛ばして続ける
$x == 1だった場合その処理をしない
$argv[1]
コマンドラインで入力した情報を返す
ターミナル
% php choice_tr3.php Andy secret 横に書く
ファイル名 $argv[1] $argv[2]];]
OK (出力結果)
$argv[0]はファイル名
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
論理演算子
==と===の違い
==は自動でデータ型を揃えてくれる。
(文字列と数値でも両方同じ型として扱う。)
===はデータ型を揃えない。
その為違う型同士であれば、falseになる。
また(int)このように書くことで整数型へと変換する
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
これはrubyのハッシュだよ。
連想配列の要素を削除するのはunset
配列ではarray_spliceを使っていたので注意。
for each 連想配列に入っているやつそれぞれ取り出す
キーとバリューを置いてあげて使う
おまけ
例えばenglishの要素を取り出し時は$score["english"]とする
これは[0]として取り出せない。配列のfor文は連想配列には使えない。添字ではないので。
=>あったら気をつけて
PHPマニュアル
説明のところ
()に引数 :の後ろに戻り値の型
phpマニュアルでは引数のことをパラメーターとして説明してる
戻り値のことは返り値としている。
PHP 変数 配列 他
PHP学習1日目今日学んだことメモ
変数には$ がつく
;忘れないでね
.は連結 文字列と数値も繋ぐことができる
論理値の場合
var_dump関数を使う
var_dumpは配列の詳細を見るにも使うよ
ターミナル
array(3) {
[0]=>
string(4) "Andy"
[1]=>
string(5) "Betty"
[2]=>
string(5) "Carol"
}
こう表示される。
var_dumpはこれからも色々出てきそう〜〜〜
改行 PHP_EOL;
ターミナル
Andy
Betty
おまけ コメントアウト
# を使えば改行しなくても横にコメントアウトを書くことができた。
丁度上のを見てもらえればわかる。
PHPの関数というのはRubyのメソッドみたいなものだと感じた!
PHP学習1日目
PHP学習1日目です。 メモがてらブログ書きます。
Udemyの基礎だけ学ぶPHPプログラミング講座を受講しています。
ターミナルコマンド
mkdir フォルダを作成する
mkdir helloword でhellowordというフォルダを作成できる。
historyコマンド
ターミナル内で入力したコマンドの履歴を見れる
cd .. これは使えると思う!
半角スペースいるので注意
子フォルダから親フォルダに移動できる(いつものcdと逆)
projects ←アプリフォルダ
例)
tutorial-app % cd ..
projects %
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
PHPプログラム
?>は省略しても構わない。省略することが多いみたい。
・echo命令を使うとターミナルにデータを出力できる。
・PHPプログラムはターミナル内でphpコマンドを使って実行できる
php.iniファイル
Macの場合、デフォルトでは作成されていないので、
以下のコマンドで作る
sudo cp /etc/php.ini.default /etc/php.ini
解説)cpはコピー /etc/php.ini.defaultを/etc/php.iniにコピーしている。
vsコード 右上の「開く」
コマンド+shift+gで
/etc/php.iniを探して開ける
Railsチュートリアル14章
テストコードはRspecで書いています。
フォローとフォロワーの関係ややこしいのでまとめる。
userモデル
has_many :following, through: :active_relationships, source: :followed
active_relationshipsのforeignキーはfollower_idで逆じゃないのか?ってなったがこれで正しい。
これは片方(逆の関係であるもの)を固定することによって片方の情報を持ってきている。
図を見た方がわかりやすい(14.7)
active
followed | folower
1 2
2 1
3 1
4 1
foreignキーでfollewer_idを指定する current_user(今回であれば1)によってフォローしているfollowedの情報を取ってくる。
has_many :followers, through: :passive_relationships, source: :follower
上と考え方一緒。逆の関係
図(14.9)
has_many active_relationshipsとhas_many following両方いる理由
has_many active_relationshipsではfollower_idとfollowed_idの2つの関係を取ってきている。
has_many followingでfollowed_idの情報だけ取ってきている。
そこからnameやemailなどuserの情報を持ってこれる。
これは多対多 中間テーブルの考え方 と一緒
---------------------------------------------------------------------------------------
Ajax 非同期通信
form_withをlocal trueからremote trueに変更する。
_follow.html.erb
_unfollow.html.erb
relationshipsコントローラー
javascriptが無効になっていた時の設定
config/application.rb
app/views/relationships/create.js.erb
escape_javascriptメソッド
JavaScriptファイル内にHTMLを挿入するときに実行結果をエスケープするために必要
app/views/relationships/destroy.js.erb
---------------------------------------------------------------------------------------
テストコード(Rspec)
relationshipモデル
system
follows_spec.rb
Railsチュートリアル13章
テストコードはRspecで書いています。
・複合キーインデックス
micropostのマイグレーションファイル
このようにして作成の逆順で取り出すよう設定している。
time_ago_in_wordsメソッド
何分前とかって出るようにする。例えば3分前、3時間前、3日前。
<%= render @feed_items %>
@feed_itemsはMicropostsのクラスを持っているため、micropostsのパーシャルを呼び出すことができた。_micropost.html.erbを呼び出してる
microposts作成失敗の場合に備えて
app/controllers/microposts_controller.rb
ページネートでエラーが出るので解決。
micropostsをcreateするcreateアクションがMicropostsコントローラーにあるので、Micropostsコントローラーでページネートしようとしている。
そこで、コントローラーとアクションを指定してあげることで解決する。
app/views/shared/_feed.html.erb
テストコード(Rspec)
factorybot
モデルテスト micropost
system spec micropost