【AWS】ECRにイメージをプッシュするメモ
AWS CLIの導入
AWSコマンドをローカルで叩けるようにするAWS CLIを導入する必要がある。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-windows.html
使えるようになったら、IAMでユーザーを登録する。
アクセスキーとシークレットアクセスキーを手に入れる。
既にユーザーを作っている場合はIAMのダッシュボードから認証情報へ行き、アクセスキーとシークレットキーを取得する。
aws configure
とし、入力。
Default region nameはどこのリージョンで使うかを入力。 ap-northeast-1 など。
Default output formatはデフォルトの出力形式。jsonを選択。
入力後はS3にバケットを作っている場合は
aws s3 ls
などとして作成してあるバケットが出れば接続は成功している。
ECRへイメージをプッシュする
まずはECRのダッシュボードから適当なリポジトリを作成する。
リポジトリ名はnginxなどプッシュするイメージに合わせておく。
その後、コマンドプロンプトからDockerを起動した状態でコマンドを打ち込んでいく。
aws ecr get-login --no-include-email
これを打つとログイン用のコマンドが出現するのでコピーして実行する。
ECSに上げるイメージのイメージ名を編集し、プッシュする。
docker image tag 名前を変更するイメージの名前 ECRリポジトリのURI/リポジトリ名:latest
docker push ECRリポジトリのURI/リポジトリ名:latest
ダッシュボードからリポジトリ作成→AWS CLIを用いてプッシュ
これをイメージの数だけ繰り返す。
ダッシュボードを確認し、プッシュしたイメージが表示されていれば成功。
【Docker】用語整理
先日からDockerに手を出したのですが、初学者なもので大量の新しい用語の整理が付かない状態です。
言葉の定義がわからないと、何がわからないのかわからないと言った状況に陥りやすいので自分なりに整理してみました。
- イメージ…コンテナーを作成するために必要な情報を含むパッケージのこと。相互に積み重ねられたレイヤーをまとめたもの。
- コンテナー…Dockerイメージのインスタンス。一種の仮想環境。
- デーモン…コマンドを受け取る処理をする場所。runなどのコマンドはここに受け取られ、それを処理してくれている。
- Dockerfile…Dockerイメージをビルドする手順を含むファイル。目的となる作業環境になるまでを書いたバッチスクリプトのようなもの。
- タグ…同じイメージの各種バージョンを識別できるようにしたマークのこと。
- ビルド…Dockerfileと、イメージがビルドされるフォルダ内のファイルに基づいてイメージを作成すること。
【AWS】EC2+RDSでRailsアプリを動かすメモ
あくまで学習の一環としてのメモ。
VPCの作成
まずはVPCの作成。
CIDRブロックは10.0.0.0/16で。
EC2用のサブネットを作成
EC2用なので、外部と通信できるサブネットを作る。
CIDRブロックは10.0.0.0/24
インターネットゲートウェイを作成
EC2用のサブネットがインターネットと通信できるようにゲートウェイを作成する。
ルートテーブルを作成
EC2用のサブネットを、先程作成したゲートウェイを通るというルールを作る。
作成後、下のタブからルート>ルート追加から、
送信先を0.0.0.0/0、ターゲットを先程のゲートウェイにして保存。
これでルートテーブルを作ったので、これをEC2用サブネットに適応する。
サブネットのダッシュボード下のルートテーブルから関連付け編集。
そこからルートテーブルを選択し保存する。
これでEC2用サブネットにインターネットと通信するルートテーブルを適応することができた。
セキュリティグループの作成
セキュリティグループはホワイトリスト形式で、許可する通信を設定できるもの。
なのでデフォルトでは基本全部拒否するようになっている。
ネームタグ、グループ名は同じ好きな名前で。
インバウンドとアウトバウンドというルールを追加できて、その名の通り、
インバウンド:こっちに来るどんな通信を許可するか
アウトバウンド:こっちから送るどんな通信が許可されるのか
となっている。
今回はインバウンドにSSH通信とHTTP通信を許可したい。
SSHはタイプにSSHとし、送信元を自分のグローバルIP/34に設定する。
HTTPはタイプをHTTPとし、送信元を0.0.0.0/0とする。
これでSSHは自分のPCからEC2を操作するとき用に通信ができて、
HTTPは誰でも自分が作ったサーバーにHTTP通信できるようになった。
これを後にEC2を作成したとき、それに適応させる。
RDSの前準備
RDS用のサブネットを作る。
DBは外部と通信させたくないので、それ専用のサブネットを作り、EC2とだけ通信することで安全なDBを作ることができる。
EC2用のサブネットと、RDS用のサブネットはAZを別にし、それをサブネットグループでまとめる。
(AZを別にしなければサブネットグループを作れない。)
DBのパラメーターグループを設定する。
これはDBのパラメーターの設定をテンプレートとして登録するもの。
RDSのパラメーターグループから新規作成、どのデータベース向けなのかを選択し、あとは名前を説明を入力する。
作成したら、名前をクリックするとパラメーターを設定できる。
項目 | 値 |
---|---|
character_set_client | utf8 |
character_set_connection | utf8 |
character_set_database | utf8 |
character_set_server | utf8 |
character_set_system | utf8 |
とすると文字コードの設定が完了する。
RDS用のセキュリティグループを作る。
インバウンドに下記を追加。これでVPC内からだけDBにアクセス可能にした。
Type | Protocol | Port Range | Source |
---|---|---|---|
Mysql | TCP | 3306 | 10.0.0.0/16 |
RDSの作成
RDSを作成する。
無料枠として使うを選択したら基本そこまで変えるところはない。
インスタンスサイズはdb.t2.micro
ストレージの自動スケーリングは無効。マルチAZも無効。
EC2の作成
自動割当パブリックIPは有効
タグにはNameに適当な名前を付けておく。
セキュリティグループには予め設定しておいた、HTTPとSSHを許可したものを適応する。
鍵は後で接続に使うのでわかりやすい場所に保存しておく。
ElasticIPの設定
EC2ダッシュボードからElasticIPへ。
選択し、割り当てる。
作成したものをアクションから関連付けへ、対象のEC2インスタンスを選択肢、関連付けを押す。
各種インストール
SSHでEC2に接続。ec2-userという名前で接続。
$ sudo su - #rootユーザーになる $ yum -y install git $ git --version $git clone https://github.com/rbenv/rbenv.git /usr/local/rbenv vi /etc/profile.d/rbenv.sh export RBENV_ROOT=/usr/local/rbenv export PATH="$RBENV_ROOT/bin:$PATH" eval "$(rbenv init -)" $ source /etc/profile.d/rbenv.sh $ rbenv --version $ git clone https://github.com/rbenv/ruby-build.git /usr/local/rbenv/plugins/ruby-build $ rbenv install -list $ yum -y groupinstall "Development Tools" $ yum -y install gcc-c++ glibc-headers openssl-devel readline libyaml-devel zlib zlib-devel libffi-devel libxml2 libxslt libxml2-devel libxslt-devel mysql-devel readline-devel $ yum -y install ImageMagick ImageMagick-devel $ rbenv install バージョン $ rbenv versions $ rbenv global バージョン $ rbenv exec gem install bundler $ rbenv rehash
gitを入れて、Rubyを入れ、bundlerまでの導入メモ。
その後、対象のアプリをgit cloneするまでは別の記事でまとめた。
https://tkmrtech.hateblo.jp/entry/2019/10/27/000000
アプリケーションサーバーのUnicornのインストール。
group :production, :staging do gem 'unicorn', "5.4.1" end
$ vi config/unicorn.conf.rb
gemに追加し、bundle。
設定ファイルを新規作成し、
# set lets $worker = 2 $timeout = 30 $app_dir = "/var/www/rails/アプリケーション名" $listen = File.expand_path 'tmp/sockets/.unicorn.sock', $app_dir $pid = File.expand_path 'tmp/pids/unicorn.pid', $app_dir $std_log = File.expand_path 'log/unicorn.log', $app_dir # set config worker_processes $worker working_directory $app_dir stderr_path $std_log stdout_path $std_log timeout $timeout listen $listen pid $pid # loading booster preload_app true # before starting processes before_fork do |server, worker| defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect! old_pid = "#{server.config[:pid]}.oldbin" if old_pid != server.pid begin Process.kill "QUIT", File.read(old_pid).to_i rescue Errno::ENOENT, Errno::ESRCH end end end # after finishing processes after_fork do |server, worker| defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection end
上記のように設定する。
Nginx
$ amazon-linux-extras install nginx1.12 $ nginx -v $ service nginx start $ sudo chkconfig nginx on #nginxの自動起動
今回やった手順で、普通にNginxを入れようとするとエラーが出たので、上のようにして導入する
$ cd /etc/nginx/conf.d/ $ sudo vi アプリケーション名.conf
Ningxの設定をする。
# log directory error_log /var/www/rails/アプリケーション名/log/nginx.error.log; access_log /var/www/rails/アプリケーション名/log/nginx.access.log; # max body size client_max_body_size 2G; upstream app_server { # for UNIX domain socket setups server unix:/var/www/rails/アプリケーション名/tmp/sockets/.unicorn.sock fail_timeout=0; } server { listen 80; server_name アプリケーションのElasticIP; # nginx so increasing this is generally safe... keepalive_timeout 5; # path for static files root /var/www/rails/アプリケーション名/public; # page cache loading try_files $uri/index.html $uri.html $uri @app; location @app { # HTTP headers proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://app_server; } # Rails error pages error_page 500 502 503 504 /500.html; location = /500.html { root /var/www/rails/アプリケーション名/public; } }
$ cd /var/lib $ sudo chmod -R 775 nginx
その後、上のコマンドを実行し、設定完了。
$ yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm -y $ yum-config-manager --disable mysql80-community $ yum-config-manager --enable mysql57-community $ yum install mysql-community-client.x86_64
これでMysqlのインストールも完了。
EC2からRDSへ接続
RDSのダッシュボードから対象のDBのエンドポイントを確認し、
$ mysql -u ユーザー名 -p -h エンドポイント
パスワード入力を促されるので、RDS作成時に設定したものを入力。
ここで接続が成功するかどうかを確かめておく。
config/database.ymlを編集する。
とりあえず、defaultだけ設定しておいて、developmentやtestはdefaultを引き継がせ、database名だけ独自もものを設定しておく。
default: &default adapter: mysql2 encoding: utf8 reconnect: false pool: 5 username: root #RDS作成時に設定したもの password: <%= ENV["DATABASE_PASSWORD"] %> #RDS作成時に設定したもの socket: /var/lib/mysql/mysql.sock database: データベース名 #RDS作成時に設定したもの host: エンドポイント #RDSのダッシュボードから確認できるエンドポイント development: <<: *default database: データベース名 test: <<: *default database: テスト用のデータベース名
DBのパスワードは直接書いてはいけないので、環境変数などで設定しておく。
Nginxのコマンド
nginx #起動 nginx -s stop #停止 nginx -s reload #再起動
something went wrongが表示されたら
大体Unicornが起動していないせい。
unicorn -c /var/www/rails/アプリ名/config/unicorn.conf.rb -D
で起動。
また、unicornのバージョンは5.4.1以下じゃないと設定ファイルがエラーを起こすので(Gemfileに指定したから大丈夫だと思うけど一応)確認しておく。
【AWS】EC2でsshを用いてgit cloneするまで。
EC2環境でsshを用いてgit cloneするまでをメモしてみました。
$ cd ~/.ssh $ ssh-keygen -t rsa
名前の入力を促されるのでgithub_keyとでもしておく。その後は2回エンター押す。
$ vi config Host github HostName github.com User git IdentityFile ~/.ssh/github_key
configファイルを作り記述。
$ cat ~/.ssh/github_key.pub
出てきたパスワードを全てコピーする。ssh~から最後まで。
https://github.com/settings/keys
それをここにssh keyとして登録する。
$ chmod 600 ~/.ssh/config
$ ssh -T github
これでユーザー名が出れば成功。
その後、
$ eval `ssh-agent` $ ssh-add ~/.ssh/github_key
として、EC2側にkeyを登録する。
以上で、git clone できる。はず。
【AWS】S3を簡易的なWebサーバーとして機能させるメモ
AWSのマネージドサービスであるS3を簡単なWebサーバーとして機能させるメモになります。
あくまで学習の一環です。
S3のファイル置き場のことをS3バケットと言います。
ダッシュボードでの設定
S3のダッシュボードで、作成を押す。
パケット名(ドメイン名でアクセスしたいときはそのドメイン名で設定する。)を指定し、作成を押す。
(次へを押すと細かいオプションを設定できる。)
Webサーバーとして機能させる
ダッシュボードでパケット名を押しプロパティへ、Static Website Hostingを設定する。
これは、Webサーバーとしての機能を有効にさせる設定。
「このパケットを使用してウェブサイトをホストする」を選択
インデックスドキュメント(URLがスラッシュで終わるとき返すファイル)はindex.html
エラードキュメント(エラー発生時に返すファイル)はerror.htmlとかに各自設定する。
リダイレクトルール(指定したパスにアクセスしたとき、他のURLにリダイレクトさせる設定)は空欄で。
匿名アクセス可能にする
匿名アクセスを可能にするには、既存のポリシーでは設定できないので、カスタムポリシーを設定する。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/WebsiteAccessPermissionsReqd.html
にあるJSONデータの
{ "Version":"2012-10-17", "Statement":[{ "Sid":"PublicReadGetObject", "Effect":"Allow", "Principal": "*", "Action":["s3:GetObject"], "Resource":["arn:aws:s3:::example-bucket/*" ] } ] }
Resourceをカスタマイズする必要がある。
arn:aws:s3:リージョン名:アカウント:バケット名:パス名
:となっているのは指定しないという意味。*は全てという意味。
上のだとリージョン名とアカウント名が指定されていない状態。
ここではバケット名だけ、自分が指定したものにすればOK。
匿名アクセスのポリシーを設定できるようにする。
先程のプロパティの右にあるアクセス権限→ブロックパブリック→編集→上2つにチェック
更に上のバケットポリシーに先程のコードを入力。
ダッシュボードの概要から適当なファイルをアップロード。
http://www.バケット名.s3-website-ap-northeast-1.amazonaws.com/
でアクセス。
docker-composeの書き方メモ
とりあえず初心者なりに、用語を調べながらなんとかdocker-composeを理解できそうです。
これからも使うことになるので、メモとして説明を入れながら書いてみました。
version: '3' #docker-composeのバージョン指定 services: #各コンテナの設計を書いていくよ web: #Webコンテナを書いていくよ build: . #buildにはDockerfileに記述したことを元にするという指定 ports: - "3000:3000" #3000のポートが来たら3000のポートのコンテナを使用する command: bundle exec rails s -p 3000 -b '0.0.0.0' #コンテナ起動時に実行されるコマンド、 #-pでリッスンするポート番号の指定(3000)、 #-bで0.0.0.0を指定しているのでコンテナの全てのインターフェイスでリッスンする。 volumes: #ボリュームの指定。パスは相対パス。 - .:/myapp #カレントディレクトリ(ドットで指定)を/myappにバインドマウントアップしている - bundle:/usr/local/bundle #bundleという名前のボリュームを/usr/local/bundleに作成する depends_on: #webが起動する前にdbを起動するようにする。依存関係の定義。 - db db: #DBコンテナを書いていくよ image: mysql:5.7 #イメージにはこれを使うよ environment: #DBの環境変数の設定 MYSQL_ROOT_PASSWORD: "password" #DBのパスワード ports: - '3306:3306' #3006のポートが来たら3006のポートのコンテナを使用する volumes: - mysql_data:/var/lib/mysql #ボリュームの指定 volumes: #こんな感じにトップレベルでボリュームを指定することで、名前のあるボリュームになる。 bundle: mysql_data:
【Docker】用語整理
先日からDockerに手を出したのですが、初学者なもので大量の新しい用語の整理が付かない状態です。
言葉の定義がわからないと、何がわからないのかわからないと言った状況に陥りやすいので自分なりに整理してみました。
- イメージ…コンテナーを作成するために必要な情報を含むパッケージのこと。相互に積み重ねられたレイヤーをまとめたもの。
- コンテナー…Dockerイメージのインスタンス。一種の仮想環境。
- デーモン…コマンドを受け取る処理をする場所。runなどのコマンドはここに受け取られ、それを処理してくれている。
- Dockerfile…Dockerイメージをビルドする手順を含むファイル。目的となる作業環境になるまでを書いたバッチスクリプトのようなもの。
- タグ…同じイメージの各種バージョンを識別できるようにしたマークのこと。
- ビルド…Dockerfileと、イメージがビルドされるフォルダ内のファイルに基づいてイメージを作成すること。