【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用のサブネットがインターネットと通信できるようにゲートウェイを作成する。

作成後、「VPCにアタッチ」からVPCを選択。

ルートテーブルを作成

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

アプリケーションサーバーの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

その後、上のコマンドを実行し、設定完了。

Mysql

$ 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と、イメージがビルドされるフォルダ内のファイルに基づいてイメージを作成すること。