さゆフィクション http://it.kensan.net/it aws wordpress などなどゆるーく書いてます Sat, 18 May 2024 08:53:42 +0000 ja hourly 1 https://wordpress.org/?v=6.5.2 https://it.kensan.net/wp-content/uploads/2023/03/cropped-icon-32x32.png さゆフィクション http://it.kensan.net/it 32 32 Rails7.1をfargateで動かしてみる https://it.kensan.net/rails7-1-fargate.html Sat, 18 May 2024 06:53:21 +0000 https://it.kensan.net/?p=1931 Rails7.1をECS(Amazon Elastic Container Service)-Fagateにデプロイします!!!

以下の順で進めていきます。今回はとりあえずFargate上で動くことをゴールにしますので、MySQLは使いません。

  1. ローカルでRails7.1を立ち上げる
  2. ECR(Amazon Elastic Container Registry)にRailsイメージをpushする
  3. ECRのイメージを使って、ECS(Amazon Elastic Container Service)-Fagateにデプロイ

まずは、ローカルでRails7.1を起動していきます。

ローカルでRialsを動かしてみる

アプリケーションの作成

以下のコマンドでアプリケーションを作成して、作成したアプリケーションのフォルダに移動します。

rails new test_app

cd test_app/

 

まずはDockerfileを修正します。

Dockerfileの修正

Rails newで作成されたDockerfileを修正します。

vi Dockerfile

以下の2点変更します。

<変更①>「ENV RAILS_ENV="production"」をコメントアウトして、「ENV RAILS_ENV=$ENVIROMENTS」を追記します。#ENV RAILS_ENV="production" \
ENV RAILS_ENV=$ENVIROMENTS \
<変更②>
5行目のFORMの後に以下を追加
ARG ENVIROMENTS

上記変更を加えることで、Railsを以下の指定をして、起動できるようになります。

  • production
  • development
  • tesst

コンテナを立ち上げて動作確認

以下のコマンドでビルドします。

docker build . -t test_app --build-arg ENVIROMENTS='development'

以下のコマンドでコンテナを起動します。

docker run -it -p 3000:3000 --env RAILS_MASTER_KEY=`cat config/master.key` test_app bin/rails server -b 0.0.0.0

http://localhost:3000/にアクセスし、以下の画面が表示されれば、動作確認OKー

 

ECR(Amazon Elastic Container Registry)にRailsイメージをpush

以下のコマンドで、AWSの接続設定をしておきます。

aws configure

次にECRログインします。


aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com

以下のコマンドでリポジトリを作成します。


aws ecr create-repository \
        --repository-name rails \
        --image-scanning-configuration scanOnPush=true \
        --region ap-northeast-1 

Railsアプリのタグ作成します

docker tag test_app:latest {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/rails:latest

Railsアプリのpushです

docker push {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/rails:latest

 

次に、Fagateにデプロイします!

ECS(Amazon Elastic Container Service)-Fagateにデプロイ

クラスターの作成

以下の設定で作成します。指定箇所以外は任意の値で大丈夫です。

  • インフラストラクチャ:AWS Fargate (サーバーレス)

タスク定義の作成

以下の設定で作成します。指定箇所以外は任意の値で大丈夫です。

  • インフラストラクチャの要件
    • 起動タイプ:AWS Fargate
    • オペレーティングシステム/アーキテクチャ:自分のPCと一致するもの(基本はx86_64でOK、M1/M2 MacはARM64を選択)
      • この設定に誤りがあると「exec /usr/local/bin/start-container: exec format error」エラーになります。
    • タスクサイズ
      • CPU:.5 vCPU
      • メモリ:1GB
  • コンテナ – 1
    • 名前:app
    • イメージURI:{AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/rails:latest
    • コンテナポート:3000
    • アプリケーションプロトコル:HTTP
    • 環境変数
      • キー:RAILS_MASTER_KEY
      • 値:「config/master.key」の値を直接入力
        • cat config/master.key」を入力すると「ArgumentError: key must be 16 bytes (ArgumentError)」エラーになる
    • Docker設定
      • コマンドに以下を設定
        • /rails/bin/rails,server,-b,0.0.0.0

タスク起動

作成したクラスターのタスクタブにある「新しいタスクの実行」を押下

  • コンピューティング設定:起動タイプ
  • デプロイ設定
    • ファミリー:先ほど作成したタスクを設定
    • リビジョン:最新
  • ネットワーキング
    • セキュリティグループ:ポート3000の許可を追加

動作確認

作成したクラスターのタスクタブの任意のタスクの詳細を開きます。

パブリックIPが表示されるので、http://パブリックIP:3000でブラウザからアクセスします。

以下の画面が表示されればOKです。

]]>
Rails7.1をローカル環境で動かしてみる https://it.kensan.net/rails7-1-local.html Sat, 18 May 2024 06:39:28 +0000 https://it.kensan.net/?p=1928 Rails7.1をローカル環境で動かしてみます!

PC上で直接動かし、その後にDockerコンテナ上で動かしてみます。

コンテナでは、rails newで作成された公式のDockerfileを使用していきます。

Ruby・Railsのインストールから始めていきます!

Ruby/Railsのインストール

Rubyインストール

  • rbenvをインストールする
brew install rbenv
  • rbenvからインストールできるRubyのバージョンを確認する
rbenv install -l
  • リスト内から最新バージョンを確認して,Rubyをインストールする(ここでは3.3.1をインストールします)
rbenv install 3.3.1
rbenv global 3.3.1
  • rbenvのRubyに切り替えます
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
source ~/.zprofile

Railsインストール

  • Railsをインストールします
sudo gem install rails

rails --version

Rails 7.1.3.3

Rails7.1がインストールできました。

アプリケーションの作成

以下のコマンドでアプリケーションを作成して、作成したアプリケーションのフォルダに移動します。

rails new test_app

cd test_app/

ローカルでRialsを動かしてみる

以下のコマンドでRailsサーバーを立ち上げます。

bin/rails server

http://localhost:3000/にアクセスし、以下の画面が表示されれば、動作確認OKー

PC上にdockerコンテナを立ち上げ、その上でRailsを動かす

dockerコンテナを立ち上げ、その上でRailsを動かします。

まずはDockerfileを修正します。

Dockerfileの修正

Rails newで作成されたDockerfileを修正します。

vi Dockerfile

以下の2点変更します。

<変更①>「ENV RAILS_ENV="production"」をコメントアウトして、「ENV RAILS_ENV=$ENVIROMENTS」を追記します。#ENV RAILS_ENV="production" \
ENV RAILS_ENV=$ENVIROMENTS \
<変更②>
5行目のFORMの後に以下を追加
ARG ENVIROMENTS

上記変更を加えることで、Railsを以下の指定をして、起動できるようになります。

  • production
  • development
  • tesst

コンテナを立ち上げて動作確認

以下のコマンドでビルドします。

docker build . -t test_app --build-arg ENVIROMENTS='development'

以下のコマンドでコンテナを起動します。

docker run -it -p 3000:3000 --env RAILS_MASTER_KEY=`cat config/master.key` test_app bin/rails server -b 0.0.0.0

http://localhost:3000/にアクセスし、以下の画面が表示されれば、動作確認OKー

docker composeを使ってみる

docker composeで以下の3つのコンテナを立ち上げてみます。

  •  DBコンテナ
    • MySQL8
  • appコンテナ
    • Rails7.1
  • phpmyadmin
    • 最新のphpmyadmin

Rails アプリの作成

以下のコマンドでRailsアプリを作成します。

rails new . --force --database=mysql

Dockerfileの修正

Rails newで作成されたDockerfileを修正します。

vi Dockerfile

以下の2点変更します。

<変更①>「ENV RAILS_ENV="production"」をコメントアウトして、「ENV RAILS_ENV=$ENVIROMENTS」を追記します。#ENV RAILS_ENV="production" \
ENV RAILS_ENV=$ENVIROMENTS \
<変更②>
5行目のFORMの後に以下を追加
ARG ENVIROMENTS

上記変更を加えることで、Railsを以下の指定をして、起動できるようになります。

  • production
  • development
  • tesst

docker-compose.ymlの作成

以下の通り作成します。

vi docker-compose.yml

<ファイルの中身>


version: "3"
services:
  app:
    container_name: app_rails
    build:
      args:
        ENVIROMENTS: development
        RAILS_MASTER_KEY: 'cat config/master.key'
    command: bin/rails server -b 0.0.0.0
    volumes:
      - .:/rails
    ports:
      - 80:3000
    tty: true
    stdin_open: true
    depends_on:
      - db
  db:
    image: mysql:8.0.28
    container_name: db
    environment: 
      MYSQL_ROOT_PASSWORD: password
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:  
      - ./docker/db/data:/var/lib/mysql
    ports:
      - 3306:3306
  phpmyadmin:
    container_name: test_phpmyadmin
    image: phpmyadmin
    environment:
    - PMA_USER=root
    - PMA_PASSWORD=password
    ports:
    - 8080:80
    depends_on:
      - db

DB設定ファイルの修正

vi config/database.yml

<ファイルの中身>

default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  host: db

development:
  <<: *default
  database: test4_development

動作確認

以下のコマンドでコンテナを立ち上げます。

docker compose up

以下のコマンドでDB作成します。

docker-compose run app bin/rails db:create

http://localhost:3000/にアクセスし、以下の画面が表示されれば、動作確認OKー

アプリコンテナのOSを確認してみる

以下のコマンドでOSを確認してみました。

docker compose exec app bash

cat /etc/os-release

PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

Debian12が使われているようです。

rails newで作成された公式のDockerfileでは、Debian12が使われているようです…!

]]>
Laravel11をEC2で動かす https://it.kensan.net/ec2-laravel11.html Tue, 14 May 2024 22:56:28 +0000 http://43.207.159.108/it/?p=1917 Laravel11をEC2で動かしてみます。

なるべくお金をかけずに、かつ、高速なLaravel環境を構築したいので、CPUはArm、WEBサーバはNginxを使っていきます

まずは具体的な構成を記載していきます!

構成

  • EC2を使用
    • インスタンスはt4g.mediumを使用
      • t4gは、Arm ベースの AWS Graviton2 のインスタンスです
      • T3 インスタンスよりも価格パフォーマンスが最大で 40% 高いようです
Amazon EC2 T4g インスタンス – Amazon Web Services
AWS Graviton2 プロセッサを搭載した T4g インスタンスは、Amazon EC2 のバースト可能な汎用ワークロードとしては最高のコストパフォーマンスを提供します。
  • OS
    • Amazon Linux 2023
  •  Webサーバ
    • Nginxを使用
    • Apacheより高速
  • PHP
    • バージョン:8.2.15
    • WordPressを動かすのに必要なもの
  • Webサーバで動かすもの
    • WordPress

では実際にEC2起動からLaravelインストールまでやっていきます!

EC2起動

  • 以下の設定でEC2を起動します
    • Amazon マシンイメージ (AMI)でAmazon Linux 2023を指定する
    • アーキテクチャで64ビット(Arm)を指定する
    • インスタンスタイプでt4g.mediumを指定する
    • ネットワーク設定で「からの SSH トラフィックを許可」「インターネットからの HTTP トラフィックを許可」を指定する
      • セキュリティを考慮して、アクセス元は絞った方がいい
    • EC2へはEC2 Instance Connectで接続するため、キーペアはなしでOK

EC2の中に入る

  • 諸々設定するため、以下の流れで起動したEC2の中に入ります
    • AWSコンソールのEC2の一覧で、該当のEC2を選択して、接続を押下
      • EC2 Instance Connectタブの接続を押下

もろもろインストール

パッケージ最新化

  • パッケージ最新化
sudo dnf update -y

Nginxインストール〜設定

  • Nginxインストール
sudo dnf -y install nginx
  • Nginx設定変更
sudo vi /etc/nginx/nginx.conf

serverの箇所を以下通り修正


    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /usr/share/nginx/html/public;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        index index.php;
        location / {
            try_files $uri $uri/ /index.php?$query_string;
        }
        location ~ \.php$ {
            fastcgi_pass unix:/var/run/php-fpm/www.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
            include        fastcgi_params;

       }
    }
  • Nginx起動
sudo systemctl start nginx
  • Nginx自動起動をON
sudo systemctl enable nginx
  • ブラウザでNginxが正常に動作していることを確認
    • EC2に割り当てられているパブリックIPにhttpでアクセスする
      • Welcome to nginx!」が出れば、Nginxが起動できているので問題なし

PHPインストール

  • PHPをインストールする
sudo dnf install -y php-fpm php-mysqli php-json php php-devel

php-fpm起動

  • php-fpmを起動します
sudo systemctl start php-fpm.service

 

composerをインストールする

    • composerインストールします
    php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
    php composer-setup.php
    php -r "unlink('composer-setup.php');"
    sudo mv composer.phar /usr/local/bin/composer

     

    Laravel11をインストール

    • Laravel11をインストールします。
    composer create-project --prefer-dist laravel/laravel laravel-project "11.*"
    • 出来上がったファイルをNginxのルートディレクトリにコピー
    sudo cp -r laravel-project/* /usr/share/nginx/html/
    • storageディレクトリの権限設定
    cd /usr/share/nginx/html/
    chmod -R 777 storage
    • .envファイルの作成
    
    vi .env
    
    <ファイルの中身>
    APP_KEY={APIキー}
    DB_CONNECTION=sqlite
    
    APIキーは
    php artisan key:generate
    で発行可能
    •  以下のコマンドでsqlite用ファイルを作成し権限を付与します。
    
    touch database/database.sqlite
    chmod 777 database/database.sqlite
    

    動作確認

    • 動作確認
      • 「http://{EC2のIPアドレス}」にアクセスして、以下の画面表示されればOK〜〜

      ]]>
      Laravel11をECS-Fagateにデプロイする https://it.kensan.net/laravel11-ecs-fagate-deploy.html Sun, 12 May 2024 07:14:00 +0000 http://13.231.204.68/it/?p=1888 Laravel11をECS(Amazon Elastic Container Service)-Fagateにデプロイします!!!

      以下の順で進めていきます。今回はとりあえずFargate上で動くことをゴールにしますので、MySQLは使いません。

      1. ローカルでLaravel11を立ち上げる
      2. ECR(Amazon Elastic Container Registry)にLaravelイメージをpushする
      3. ECRのイメージを使って、ECS(Amazon Elastic Container Service)-Fagateにデプロイ

      まずは、ローカルでLaravel11を起動していきます。

      ローカルでLaravel11を起動する

      まずは、完成系のディレクトリ構成から記載します。

      ディレクトリ構成

      以下のような構成となります。

      
      ├── docker
      │   ├── nginx
      │   │   ├── Dockerfile
      │   │   └── default.conf
      │   └── php
      │       └── Dockerfile
      └── docker-compose.yml

      ディレクトリの作成

      上記ディレクトリ構成を作成するためのディレクトリを作成します。

      mkdir fargate_laravel
      cd fargate_laravel/

      準備はできましたので、ディレクトリ構成に記載のディレクトリとファイルを作成していきます。

      docker-compose.ymlの作成

      docker-compose.ymlを作成します。

      vi docker-compose.yml

      <ファイルの中身>

      
      version: '3'
      services:
        app:
          build:
            context: .
            dockerfile: ./docker/php/Dockerfile
          container_name: app_laravel
          volumes:
            - .:/var/www
        nginx:
          build:
            context: .
            dockerfile: ./docker/nginx/Dockerfile
          container_name: nginx_laravel
          ports:
            - 8000:80
          working_dir: /var/www
          depends_on:
            - app

      nginxのdefault.confを作成

      nginxのdefault.confを作成します。

      mkdir docker/nginx
      
      vi docker/nginx/default.conf

      <ファイルの中身>

      
      server {
        listen 80;
        root /var/www/laravel-project/public;
        index index.php;
        location / {
          root /var/www/laravel-project/public;
          index index.php;
          try_files $uri $uri/ /index.php$query_string;
        }
        location ~ \.php$ {
          fastcgi_pass 127.0.0.1:9000;   # 正常に動作しない場合は、app:9000に書き換える
          fastcgi_index index.php;
          include fastcgi_params;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
      }
      

      nginxのDockerfileの作成

      nginxのDockerfileを作成します。

      vi docker/php/Dockerfile

      <ファイルの中身>

      FROM nginx:1.25
      COPY  docker/nginx/default.conf /etc/nginx/conf.d/

      アプリコンテナのDockerfile作成

      アプリコンテナのDockerfile作成を作成します。

      mkdir docker/php
      
      vi docker/php/Dockerfile

      <ファイルの中身>

      
      FROM php:8.3-fpm
      
      RUN apt-get update \
        && apt-get install -y zlib1g-dev mariadb-client vim libzip-dev \
        && docker-php-ext-install zip pdo_mysql
      
      #Composer install
      RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
      RUN php composer-setup.php
      RUN php -r "unlink('composer-setup.php');"
      RUN mv composer.phar /usr/local/bin/composer
      
      ENV COMPOSER_ALLOW_SUPERUSER 1
      
      ENV COMPOSER_HOME /composer
      
      ENV PATH $PATH:/composer/vendor/bin
      
      COPY ./ /var/www/
      
      RUN chmod -R 777 /var/www/
      
      WORKDIR /var/www
      
      
      RUN composer global require "laravel/installer"
      

      必要なファイル作成が終わりましたので、コンテナ立ち上げてLaravel11をインストールしていきます。

      コンテナ立ち上げ

      以下のコマンドでコンテナを立ち上げます。

      docker compose up -d

      Laravel 11のインストール

      アプリコンテナの中に入りLaravel11をインストールします。

      # アプリコンテナに入るコマンド
      docker compose exec app bash
      # Laravel11インストールコマンド
      composer create-project --prefer-dist laravel/laravel laravel-project "11.*"

      ブラウザで「http://localhost:8000/」 へアクセスして以下の画面が表示されればOK!

       

       

      次は、ECRにイメージをpushして行きます。

      ECR(Amazon Elastic Container Registry)にLaravelイメージをpush

      以下のコマンドで、AWSの接続設定をしておきます。

      aws configure

      次にECRログインします。

      
      aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com

      以下のコマンドでリポジトリを作成します。

      
      aws ecr create-repository \
              --repository-name laravel.test \
              --image-scanning-configuration scanOnPush=true \
              --region ap-northeast-1 
      
      aws ecr create-repository \
              --repository-name nginx \
              --image-scanning-configuration scanOnPush=true \
              --region ap-northeast-1 

      以下のコマンドでビルドします。

      docker compose up --build 

      Laravelアプリのタグ作成します

      docker tag fargate_laravel-app:latest {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/laravel.test:latest

      Laravelアプリのpushです

      docker push {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/laravel.test:latest

      Nginxのタグ作成します

      docker tag nginx:latest {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/nginx:latest

      Nginxのpushです

      docker push {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/nginx:latest

      次に、Fagateにデプロイします!

      ECS(Amazon Elastic Container Service)-Fagateにデプロイ

      クラスターの作成

      以下の設定で作成します。指定箇所以外は任意の値で大丈夫です。

      • インフラストラクチャ:AWS Fargate (サーバーレス)

      タスク定義の作成

      以下の設定で作成します。指定箇所以外は任意の値で大丈夫です。

      • インフラストラクチャの要件
        • 起動タイプ:AWS Fargate
        • オペレーティングシステム/アーキテクチャ:自分のPCと一致するもの(基本はx86_64でOK、M1/M2 MacはARM64を選択)
          • この設定に誤りがあると「exec /usr/local/bin/start-container: exec format error」エラーになります。
        • タスクサイズ
          • CPU:.5 vCPU
          • メモリ:1GB
      • コンテナ – 1
        • 名前:app
        • イメージURI:{AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/laravel.test:latest
      • コンテナ – 2
        • 名前:nginx
        • イメージURI:{AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/nginx:latest
        • コンテナポート:80
        • アプリケーションプロトコル:HTTP

      タスク起動

      作成したクラスターのタスクタブにある「新しいタスクの実行」を押下

      • コンピューティング設定:起動タイプ
      • デプロイ設定
        • ファミリー:先ほど作成したタスクを設定
        • リビジョン:最新
      • ネットワーキング
        • セキュリティグループ:ポート80の許可を追加

      動作確認

      作成したクラスターのタスクタブの任意のタスクの詳細を開きます。

      パブリックIPが表示されるので、パブリックIPでブラウザからアクセスします。

      以下の画面が表示されればOKです。

      ]]>
      LocalStackを使ってローカル開発環境で AWS 環境をエミュレートする https://it.kensan.net/localstack-aws.html Sat, 11 May 2024 08:27:29 +0000 http://35.78.208.151/it/?p=1878 LocalStackを使ってローカル開発環境で AWS をエミュレートしてみます。

      LocalStackコンテナを自分のPCで立ち上げ、AWS CLIやプログラムの向き先をLocalStackコンテナにすることで、エミュレートされたAWS(実際のAWSではない、自分用のAWSエミュレート環境)を使った動作確認が可能です。

      LocalStackのインストール

      以下のコマンドで、GitHubからLocalStack環境一式をダウンロードします。

      git clone https://github.com/localstack/localstack.git
      cd localstack

      以下のコマンドで、LocalStackコンテナを立ち上げます。

      docker-compose up -d

      以下のコマンドで、使用できるAWSサービスの一覧取得してみます。

      curl -s "http://127.0.0.1:4566/_localstack/health" | jq .

      <取得した使用できるサービスの一覧>

      {
        "services": {
          "acm": "available",
          "apigateway": "available",
          "cloudformation": "available",
          "cloudwatch": "available",
          "config": "available",
          "dynamodb": "available",
          "dynamodbstreams": "available",
          "ec2": "available",
          "es": "available",
          "events": "available",
          "firehose": "available",
          "iam": "available",
          "kinesis": "available",
          "kms": "available",
          "lambda": "available",
          "logs": "available",
          "opensearch": "available",
          "redshift": "available",
          "resource-groups": "available",
          "resourcegroupstaggingapi": "available",
          "route53": "available",
          "route53resolver": "available",
          "s3": "running",
          "s3control": "available",
          "scheduler": "available",
          "secretsmanager": "available",
          "ses": "available",
          "sns": "available",
          "sqs": "available",
          "ssm": "available",
          "stepfunctions": "available",
          "sts": "available",
          "support": "available",
          "swf": "available",
          "transcribe": "available"
        },
        "edition": "community",
        "version": "3.4.1.dev"
      }

      いっぱいある….!素晴らしー

      AWS CLIでLocalStackを使ってみる

      AWS CLIのインストール

      PCがmacの場合

      以下のコマンドでAWS CLIをインストールします。

      brew  install awscli

      PCがWindowsの場合

      以下URLからMSI インストーラをダウンロードして、AWS CLIをインストールします。

      https://s3.amazonaws.com/aws-cli/AWSCLISetup.exe

      動作確認

      以下のコマンドでAWS CLIがインストールできているか確認します。

      aws --version

      以下のような出力がされればOKです。

      aws-cli/2.15.48 Python/3.11.9 Darwin/23.4.0 source/arm64 prompt/off

      AWS CLIの設定

      以下のように設定します。

      aws configure --profile localstack
      AWS Access Key ID [None]: aaa
      AWS Secret Access Key [None]: aaa
      Default region name [None]: ap-northeast-1
      Default output format [None]: 

      Access KeyとSecret Access keyは適当な値でOKです。

      regionは「ap-northeast-1」を指定、formatは指定なしでOK

      S3バケットを作ってみる

      以下のコマンドで「test-bucket」という名前のS3バケットを作成可能です。

      aws --endpoint-url=http://localhost:4566 --profile localstack s3 mb s3://test-bucket

      以下のような結果が出力され、バケットが作成されたことがわかります。

      make_bucket: test-bucket

      AWS CLIの使い方

      「aws –endpoint-url=http://localhost:4566 –profile localstack」の部分は固定で、その後ろに実行したいAWSコマンドを記載します。

      aws --endpoint-url=http://localhost:4566 --profile localstack {実行したいAWS CLIコマンド}

       

      プログラムからLocalStackを使ってみる

      プログラムからLocalStackを使ってみます。

      プログラム言語はPHPを使い、S3にファイルアップロードしてみます。

      PHPでLocalStackを使ってみる

      まず、aws-sdk-phpをインストールします。

      composer require aws/aws-sdk-php

      composer: command not found」と表示された場合、composerのインストールが必要なので、composerインストール後に、上記コマンドを実行します。

      macの場合、以下のコマンドでcomposerをインストールできます。

      brew install composer

      次にPHPファイルを作成します。S3にファイルをアップロードするプログラムです。

      vi test.php

      <ファイルの中身>

      
      <?php require_once 'vendor/autoload.php'; 
      use Aws\S3\S3Client; 
      $config = [ 'credentials' => [
              'key' => 'hoge',
              'secret' => 'fuga',
          ],
          'region' => 'ap-northeast-1',
          'endpoint' => 'http://localhost:4566',
          'use_path_style_endpoint' => true,
      ];
      
      $s3 = new S3Client($config);
      
      // アップロード
      $result = $s3->putObject([
          'Bucket' => 'test-bucket',  // バケット名
          'Key' => 'test.txt',      // s3のアップロード先
          'Body' => 'hello world!!', // ファイルの内容
      ]);
      

      作成したPHPを以下のコマンドで実行します。

      php test.php

      ファイルがアップロードされているか以下のAWS CLIで確認します。

      aws --endpoint-url=http://localhost:4566 --profile localstack s3 ls s3://test-bucket
      
      2024-05-11 17:13:48         13 test.txt

      想定通り「test.txt」がアップロードされていることが確認できます。

      まとめ

      LocalStackを使ってローカル開発環境で AWS 環境をエミュレートする方法を記載しました。

      結構簡単に、AWS CLIやプログラムからLocalStackを使用できることがわかりましたー

      ]]>
      EC2のAmazonLinux2023にMySQLサーバをインストールする https://it.kensan.net/amazonlinux2023-mysql-install.html Sat, 11 May 2024 04:27:25 +0000 http://18.182.2.245/it/?p=1875 AmazonLinux2023の内部にMySQLをインストールする方法についてです。
      EC2をOS:AmazonLinux2023で立ち上げ、そこにMySQLをインストールします。

      EC2立ち上げ

      EC2を立ち上げます。

      • インスタンスタイプは適切に選択
      • AMIでAmazonLinux2023を選択

      EC2に接続

      以下のいずれかの方法で接続します。

      • EC2 Instance Connect
      • セッションマネージャ
      • SSHクライアント

      接続方法が分からない場合は、以下の記事をご参照ください。

      EC2への4つの接続方法について(Instance Connect/セッションマネージャー/SSH/シリアルコンソール)
      「EC2に入りたいけど入れない」 「EC2に入る方法がいくつかあるけど、どれで入るのが良いの?どんな違いがあるの?」という方向けの記事です。 EC2の接続方法は「EC2 Instance Connect」「セッションマネージャー」「SSHクライアント」「EC2 シリアルコンソール」 の4つの接続方法があります。

      MySQLインストール

      以下のコマンドでインストールします。

      sudo dnf -y localinstall https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm
      
      sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
      
      →これを実行しないと「Error: GPG check FAILED」エラーになる
      
      sudo dnf install -y mysql-community-server mysql-community-client mysql-community-devel

      以下のコマンドでMySQLを起動します。

      sudo systemctl enable mysqld.service
      
      sudo systemctl start mysqld.service

      MySQLに接続するための初期パスワードを確認します

      sudo less /var/log/mysqld.log

      MySQLに接続して、パスワード更新します。

      mysql -uroot -p
      # パスワード更新
      ALTER USER 'root'@'localhost' IDENTIFIED BY '新しいパスワード';

      まとめ

      以上で完成です。MySQLサーバはRDSを使うケースが多いと思いますが、EC2上にMySQLサーバを立ち上げる場合は上記コマンドで簡単にできます!

      ]]>
      MySQLでユニークインデックスを貼る際のDuplicate entry fuga for key hoge エラー https://it.kensan.net/mysql-duplicate-error.html Sat, 11 May 2024 04:04:04 +0000 http://18.182.2.245/it/?p=1863 MySQLでユニークインデックスを貼る際のDuplicate entry fuga for key hoge エラーについてです。

      まず、ユニークインデックスを貼る際の構文については以下の通りです。

      alter table {テーブル名} add unique({インデックスを貼るカラム});

      インデックスを貼るカラムはカンマ「,」区切りで複数指定できます。

      ユニークインデックスを貼る際のDuplicateエラーがどんな場合に発生するか記載していきます。

      MySQL8系とMySQL5.7系で若干挙動が異なります。具体的には以下の挙動となります。

      Duplicateエラーの発生条件

      MySQL8系とMySQL5.7系ともに複数レコードに同じ値があるカラムにはユニークインデックスは貼れない(Duplicateエラーになる)
      MySQL8系とMySQL5.7系ともに複数レコードにNULLがあるカラムにはユニークインデックスは貼れる
      MySQL5.7系の場合、末尾の半角スペースのみの違いしかない値が複数レコードあるカラムにはユニークインデックスは貼れない(Duplicateエラーになる)(MySQL8系では貼れる)

      検証時のコマンドと結果を記載していきます。

      MySQL8系

      まずバージョン確認

      select version();
      
      +-----------+
      | version() |
      +-----------+
      | 8.0.37    |
      +-----------+
      

      複数レコードに同じ値があるカラム場合

      # テーブル作成
      create table user (id int, name varchar(10));
      
      # データ登録
      insert into user values (1, 'test_user'),(2, 'test_user');
      
      # ユニークインデックスを貼る
      alter table user add unique(name);
      
      # 結果:エラー
      ERROR 1062 (23000): Duplicate entry 'test_user' for key 'user.name'
      
      # テーブル削除
      drop table user;
      
      

      複数レコードにNULLがあるカラム場合

      # テーブル作成
      create table user (id int, name varchar(10));
      
      # データ登録
      insert into user values (1, null),(2, null);
      
      # ユニークインデックスを貼る
      alter table user add unique(name);
      
      # 結果:成功
      Query OK, 0 rows affected (0.02 sec)
      
      # テーブル削除
      drop table user;

      末尾にスペースがある場合

      # テーブル作成
      create table user (id int, name varchar(10));
      
      # データ登録
      insert into user values (1, 'test_user'),(2, 'test_user ');
      
      # ユニークインデックスを貼る
      alter table user add unique(name);
      
      # 結果:成功
      Query OK, 0 rows affected (0.02 sec)
      
      # テーブル削除
      drop table user;

      途中にスペースがある場合

      # テーブル作成
      create table user (id int, name varchar(10));
      
      # データ登録
      insert into user values (1, 'testuser'),(1, 'test user');
      
      # ユニークインデックスを貼る
      alter table user add unique(id,name);
      
      # 結果:成功
      Query OK, 0 rows affected (0.02 sec)
      
      # テーブル削除
      drop table user;

      先頭にスペースがある場合

      # テーブル作成
      create table user (id int, name varchar(10));
      
      # データ登録
      insert into user values (1, 'test_user'),(1, ' test_user');
      
      # ユニークインデックスを貼る
      alter table user add unique(id,name);
      
      # 結果:成功
      Query OK, 0 rows affected (0.01 sec)
      
      # テーブル削除
      drop table user;

      MySQL5.7系

      まずバージョン確認

      select version();
      
      +-----------+
      | version() |
      +-----------+
      | 5.7.44    |
      +-----------+
      

      複数レコードに同じ値があるカラム場合

      # テーブル作成
      create table user (id int, name varchar(10));
      
      # データ登録
      insert into user values (1, 'test_user'),(2, 'test_user');
      
      # ユニークインデックスを貼る
      alter table user add unique(name);
      
      # 結果:エラー
      ERROR 1062 (23000): Duplicate entry 'test_user' for key 'name'
      
      # テーブル削除
      drop table user;

      複数レコードにNULLがあるカラム場合

      # テーブル作成
      create table user (id int, name varchar(10));
      
      # データ登録
      insert into user values (1, null),(2, null);
      
      # ユニークインデックスを貼る
      alter table user add unique(name);
      
      # 結果:成功
      Query OK, 0 rows affected (0.02 sec)
      
      # テーブル削除
      drop table user;

      末尾にスペースがある場合

      # テーブル作成
      create table user (id int, name varchar(10));
      # データ登録
      insert into user values (1, 'test_user'),(2, 'test_user ');
      
      # ユニークインデックスを貼る
      alter table user add unique(name);
      
      # 結果:エラー
      ERROR 1062 (23000): Duplicate entry 'test_user' for key 'name'
      
      # テーブル削除
      drop table user;

      途中にスペースがある場合

      # テーブル作成
      create table user (id int, name varchar(10));
      
      # データ登録
      insert into user values (1, 'testuser'),(1, 'test user');
      
      # ユニークインデックスを貼る
      alter table user add unique(id,name);
      
      # 結果:成功
      Query OK, 0 rows affected (0.02 sec)
      
      # テーブル削除
      drop table user;

      先頭にスペースがある場合

      # テーブル作成
      create table user (id int, name varchar(10));
      
      # データ登録
      insert into user values (1, 'test_user'),(1, ' test_user');
      
      # ユニークインデックスを貼る
      alter table user add unique(id,name);
      
      # 結果:成功
      Query OK, 0 rows affected (0.01 sec)
      
      # テーブル削除
      drop table user;

      まとめ

      概ね想定通りでしたが、「MySQL5.7系の場合、末尾の半角スペースのみの違いしかない値が複数レコードあるカラムにはユニークインデックスは貼れない」のは意外でした!!

      Duplicateエラーの発生条件まとめ

      MySQL8系とMySQL5.7系ともに複数レコードに同じ値があるカラムにはユニークインデックスは貼れない
      MySQL8系とMySQL5.7系ともに複数レコードにNULLがあるカラムにはユニークインデックスは貼れる
      MySQL5.7系の場合、末尾の半角スペースのみの違いしかない値が複数レコードあるカラムにはユニークインデックスは貼れない(MySQL8系では貼れる)

      ]]>
      【初心者向け】サーバー監視で使える便利なLinuxコマンド https://it.kensan.net/linux-command.html Fri, 10 May 2024 00:01:13 +0000 http://54.168.194.194/it/?p=1858 サーバー監視で使える便利なLinuxコマンド集です。

      以下のコマンドを紹介します。

      • topコマンド
        • CPU・メモリ・プロセスが確認できる
      • dfコマンド
        • ディスク空き容量が確認できる
      • ログ確認コマンド
        • lessコマンド
          • 安全にファイルを開ける
        • tailコマンド
          • 最新のログを追っかけられる

      topコマンド/dfコマンドサーバー異常時にまずは実行してみると良いコマンドです。

      ログ確認コマンドアプリケーション異常時にアプリケーションログ確認時に実行してみると良いコマンドです。

      では、topコマンドから記載していきます。

      topコマンド(CPU・メモリ・実行中のプロセスが確認できる)

      topコマンドでは、以下の情報を取得できます。5秒ごとに最新情報を取得して表示してくれる便利なコマンドです。

      • CPU
      • メモリ
      • スワップ
      • 実行中のプロセス

      CPU・メモリの利用状況が確認できるため、問題発生時は、まずはtopコマンドで状況を確認するのが良いと思います。ただし、ディスク容量は確認できないので、ディスク容量については、この次に紹介するdfコマンドで確認しましょ

      以下のコマンドを打つことで実行できます。

      top

      以下のような結果が表示されます。

      
      Tasks: 144 total,   1 running, 143 sleeping,   0 stopped,   0 zombie
      %Cpu(s):  0.0 us,  0.7 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
      MiB Mem :   3836.2 total,   2636.6 free,    632.4 used,    567.3 buff/cache
      MiB Swap:      0.0 total,      0.0 free,      0.0 used.   3010.5 avail Mem 
      
          PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                               
         1746 mysql     20   0 1834740 456068  32980 S   0.3  11.6   0:06.04 mysqld                                                                                
            1 root      20   0  173636  15020   9508 S   0.0   0.4   0:00.80 system

      終了する際は「control+c」で終了できます。

      dfコマンド(ディスク空き容量を確認できる)

      dfコマンドでは、ディスク容量についての情報を取得できます。

      以下のコマンドを打つことで実行できます。

      df -f

      以下のような結果が表示されます。

      
      Filesystem        Size  Used Avail Use% Mounted on
      devtmpfs          4.0M     0  4.0M   0% /dev
      tmpfs             1.9G     0  1.9G   0% /dev/shm

      Availが空き容量なので、少なくなっている場合は注意が必要です。

      ログ確認

      lessコマンド(ログ全体を確認できる)

      lessコマンドではファイルを参照できます。誤っても更新できないので安心です。

      また、1画面の分のデータのみ取得して表示するため、大きいファイルを開いてもメモリ消費はほとんどないので、メモリ負荷面でも安心して使用できます。

      以下のコマンドを打つことで実行できます。

      less ファイル名

      tail コマンド(最新ログを追っかけられる)

      tailコマンドを実行すると、最新ログを追っかけられます。

      以下のコマンドを打つことで実行できます。

      tail -f

      上記コマンドを実行すると、実行後に追加されたログをリアルタイムで確認できます。

      終了する際は「control+c」で終了できます。

      ]]>
      WordPressで安くて高速なサイトを構築する簡単な方法 https://it.kensan.net/wordpress-speed-price.html Thu, 09 May 2024 00:33:53 +0000 http://18.183.49.69/it/?p=1852 WordPressで安くて高速なサイトを構築する簡単な方法を記載します。

      1. WordPressを自分のPCにインストール
      2. WordPressのstaticpress2019プラグインを設定
      3. staticpress2019でWordPressのコンテンツをHTMLファイルとして出力
      4. HTMLファイルを配信サーバーにアップロードする

      という具合に、WordPressのコンテンツをHTMLファイルとして出力して、HTMLファイルを配信することで、安くて高速なサイトを簡単に構築できます。

      WordPressを自分のPCにインストールする方法

      Local」を使用するとこで簡単に自分のPCにWordPressをインストールできます。

      WindowsでもmacOSでも使えます。

      以下のURLから「Local」をダウンロードしてインストールします。

      Local

      インストールが完了したら、Word Pressの管理画面からパーマリンク設定をします。

      Word Pressのパーマリンク設定の変更

      WordPress管理画面の設定->パーマリンク画面を開き、カスタム構造を選択し、「/%postname%.html」を入力します。

      次に、staticpress2019プラグインの設定に進みます。

      WordPressのstaticpress2019プラグインを設定

      WordPress の管理画面[プラグイン]-[新規追加]から「staticpress2019」をインストールして有効化します。これだけです。

      staticpress2019でWordPressのコンテンツをHTMLファイルとして出力

      インストールした「staticpress2019」の画面で「再構築」ボタンを押下します。これだけです。

      HTMLファイルを配信サーバーにアップロードする

      あとはHTMLファイルを配信サーバーにアップロードします。

      サーバーは別途契約する必要があります。

      おすすめのサーバなどなど以下に記載します。

        • AWSのS3を使う
          • 費用はS3料金のみとなります
        • スターサーバーを使う
            • 安価なプランがありおすすめです。


        • ロリポップサーバもおすすめです。
        • ドメインの取得をしていない方におすすめ


      ]]>
      DockerでLaravel 11のローカル開発環境を構築する。ついでにphpmyadminも入れてみる。 https://it.kensan.net/docker-laravel-11-phpmyadmin.html Mon, 06 May 2024 02:07:18 +0000 http://13.112.45.21/it/?p=1844 DockerでLaravel 11のローカル開発環境を構築していきます。

      DB確認用に、phpmyadminもインストールします。

      コンテナは以下のような構成です。本番環境に応用できるように、あえてSailは使いません。

      • アプリコンテナ
        • PHP:8.3をインストールして、Laravel 11をインストールする
      • Nginxコンテナ
        • 最新のNginxをインストール
      • DBコンテナ
        • MySQL:8.0.36をインストール
      • phpmyadminコンテナ
        • 最新のphpmyadminをインストール(現時点の最新バージョン5.2.1をインストール)

      では実際にローカル開発環境を構築していきます。

      各コマンドをコピペで環境構築できます!

      Laravelのローカル開発環境構築

      まずは、完成系のディレクトリ構成から記載します。

      ディレクトリ構成

      以下のような構成となります。

      
      ├── docker
      │   ├── db  # MySQL(DB)コンテナの設定ファイル等を入れるディレクトリ
      │   │   └── my.cnf
      │   ├── nginx  # nginxコンテナの設定ファイル等を入れるディレクトリ
      │   │   └── default.conf
      │   └── php  # アプリ(PHP)コンテナの設定ファイル等を入れるディレクトリ
      │       └── Dockerfile
      └── docker-compose.yml

      ディレクトリの作成

      上記ディレクトリ構成を作成するためのディレクトリを作成します。

      mkdir test_laravel
      cd test_laravel/

      準備はできましたので、ディレクトリ構成に記載のディレクトリとファイルを作成していきます。

      docker-compose.ymlの作成

      docker-compose.ymlを作成します。

      vi docker-compose.yml

      <ファイルの中身>

      
      version: '3'
      services:
        app:
          container_name: app_laravel  
          build: ./docker/php
          volumes:
            - .:/var/www
        nginx:
          image: nginx 
          container_name: nginx
          ports:
            - 8000:80 
          volumes:
            - .:/var/www
            - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
          working_dir: /var/www
          depends_on:
            - app
        db:
          image: mysql:8.0.36
          container_name: db
          environment: 
            MYSQL_ROOT_PASSWORD: password
            MYSQL_DATABASE: database 
          command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
          volumes:  
            - ./docker/db/data:/var/lib/mysql
            - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf 
            - ./docker/db/sql:/docker-entrypoint-initdb.d
          ports:
            - 3306:3306
        # phpMyAdmin
        phpmyadmin:
          container_name: test_phpmyadmin
          image: phpmyadmin
          environment:
          - PMA_USER=root
          - PMA_PASSWORD=password
          ports:
          - 8080:80

      MySQLのmy.confを作成

      MySQLのmy.confを作成します。

      mkdir docker
      
      mkdir docker/db
      
      vi docker/db/my.conf

      <ファイルの中身>

      
      [mysqld]
      character-set-server=utf8mb4
      collation-server=utf8mb4_unicode_ci
      default_authentication_plugin=mysql_native_password
      
      [client]
      default-character-set=utf8mb4

      nginxのdefault.confを作成

      nginxのdefault.confを作成します。

      mkdir docker/nginx
      
      vi docker/nginx/default.conf

      <ファイルの中身>

      
      server {
        listen 80;
        root /var/www/laravel-project/public;
        index index.php;
        location / {
          root /var/www/laravel-project/public;
          index index.php;
          try_files $uri $uri/ /index.php$query_string;
        }
        location ~ \.php$ {
          try_files $uri =404;
          fastcgi_split_path_info ^(.+\.php)(/.+)$;
          fastcgi_pass app:9000; 
          fastcgi_index index.php;
          include fastcgi_params;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          fastcgi_param PATH_INFO $fastcgi_path_info;
        }
      }
      

      アプリコンテナのDockerfile作成

      アプリコンテナのDockerfile作成を作成します。

      mkdir docker/php
      
      vi docker/php/Dockerfile

      <ファイルの中身>

      
      FROM php:8.3-fpm
      
      RUN apt-get update \
        && apt-get install -y zlib1g-dev mariadb-client vim libzip-dev \
        && docker-php-ext-install zip pdo_mysql
      
      #Composer install
      RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
      RUN php composer-setup.php
      RUN php -r "unlink('composer-setup.php');"
      RUN mv composer.phar /usr/local/bin/composer
      
      ENV COMPOSER_ALLOW_SUPERUSER 1
      
      ENV COMPOSER_HOME /composer
      
      ENV PATH $PATH:/composer/vendor/bin
      
      
      WORKDIR /var/www
      
      RUN composer global require "laravel/installer"
      

      必要なファイル作成が終わりましたので、コンテナ立ち上げてLaravel11をインストールしていきます。

      コンテナ立ち上げ

      以下のコマンドでコンテナを立ち上げます。

      docker compose up -d

      Laravel 11のインストール

      アプリコンテナの中に入りLaravel11をインストールします。

      # アプリコンテナに入るコマンド
      docker compose exec app bash
      # Laravel11インストールコマンド
      composer create-project --prefer-dist laravel/laravel laravel-project "11.*"

      以上で環境が出来上がりましたので、最後に動作確認します!

      動作確認

      • http://localhost:8000/にアクセスして
        • 以下のLaravelの画面が見れればOK
      • http://localhost:8080/にアクセスして
        • phpmyadminが見れればOK

      sailを使う場合

      以下のコマンドでプロジェクトインストールします。

      curl -s "https://laravel.build/example-app" | bash

      以下のコマンドでコンテナを立ち上げます。

      cd プロジェクト名 && ./vendor/bin/sail up

      ブラウザで「http://localhost/」 へアクセスすると以下のエラーが出ます。

      SQLSTATE[42S02]: Base table or view not found: 1146 Table 'laravel.sessions' doesn't exist

      「RUN MIGRATIONS」をクリックした後、「Refresh now」をクリックするとLaravelのスタート画面が表示されます。成功〜〜

      ]]>