- 投稿日:2021-06-20T23:02:46+09:00
[AWS Amplify DataStore] [iOS] "Cannot find 'AmplifyModels' in scope" の原因が Target Membership の設定だった
AWS Amplify DataStore の iOS アプリ向けチュートリアルをしていた際、 Initialize Amplify DataStore で次のコードを AppDelegates.swift に追加した時、 let dataStorePlugin = AWSDataStorePlugin(modelRegistration: AmplifyModels())の部分で Cannot find 'AmplifyModels' in scope というエラーが表示されました。 swift func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { do { // AmplifyModels is generated in the previous step let dataStorePlugin = AWSDataStorePlugin(modelRegistration: AmplifyModels()) // ← ここでエラー ( Cannot find 'AmplifyModels' in scope ) try Amplify.add(plugin: dataStorePlugin) try Amplify.configure() print("Amplify configured with DataStore plugin") } catch { print("Failed to initialize Amplify with \(error)") return false } return true } 原因は、 AmplifyModels クラスが定義されている AmplifyModels.swift の Target Membership が [アプリ名]UITest のみだったためでした。 amplify codegen models コマンドでこのファイルをプロジェクトに追加した際、 [アプリ名]UITest のみが Target Membership に設定されていたようです。 バージョン xcode: 12.5 amplify cli: 5.0.1
- 投稿日:2021-06-20T22:54:22+09:00
AWS PollyをLaravelで利用したよ
はじめに Amazon PollyはAWSが提供する深層学習を利用してリアルな音声に変換できるサービスです。 ブラウザの読み上げ機能よりクオリティの高い音声を実現したいなどテキストから音声ファイル(mp3)に変換したい時に活躍するのではないでしょうか。 そんな、AWS Pollyをハッカソンで利用したので備忘録的な感じで書いていきます。Pythonでの記事はたくさん見かけたのですがPHPはあまり見つからなかったので参考になればと思います。 AWSのサンプルコードがありますのでしておきます。PHP Code sample for Amazon Polly ※もし、利用方法などに間違いなどがあればコメントください。 実装 今回はAPIを利用し、下記の工程の流れとなります。 1.テキストをPollyに対してリクエストを送る 2.Pollyで作成したmp3ファイルをAWS S3に保存する。 3.S3に保存されたmp3ファイルのファイルパスをLaravelで取得する。 4.取得した、ファイルパスを保存する。 パッケージをインストールする 必要なパッケージをインストールする composer require aws/aws-sdk-php <?php use Aws\Exception\AwsException; use Aws\Sdk; use Aws\Polly\PollyClient; use App\Models\s3_file_path; public function index(){ $config = [ 'version' => 'latest', 'region' => 'ap-northeast-1', 'credentials' => [ 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY') ] ]; try { $client = new PollyClient($config); $result = $client->startSpeechSynthesisTask([ 'Text' => '再生するテキストです。', 'OutputFormat' => 'mp3', 'OutputS3BucketName' => 'bucket-name', 'VoiceId' => 'Mizuki', ]); $s3_file_path = $result['SynthesisTask']['TaskId']; s3_file_path::create([ 's3_file_path'=>$s3_file_path ]); }catch (AwsException $e) { echo $e->getMessage(); echo "\n"; } } 簡単なプログラムの解説 $client = new PollyClient($config); $result = $client->startSpeechSynthesisTask([ 'Text' => '再生するテキストです。', 'OutputFormat' => 'mp3', 'OutputS3BucketName' => 'bucket-name', 'VoiceId' => 'Mizuki', ]); $s3_file_path = $result['SynthesisTask']['TaskId']; s3_file_path::create([ 's3_file_path'=>$s3_file_path ]); 1.new PollyClientにてインスタンスを生成する。 2.テキストや、アウトプット形式、保存するバケット、読み上げる声優を指定する。 3.$result['SynthesisTask']['TaskId']にS3のファイルパスが保存されているので受け取る。 4.DBにファイルパスを保存する。 補足 パブリックにアクセスを受け付ける場合はS3の設定にてパブリックに公開の状態にすること。 現在の日本語の声優はMizukiさんとtakumiさんが存在するようです。
- 投稿日:2021-06-20T22:20:20+09:00
AWS Amplify - 最速でログイン機能を実装してみた ① AWS Amplifyとは?
今回は、巷で話題になっているAWS製mBaaSを使って最速でログイン機能を実装してみました。 便利な世の中になったなぁというのが一番の感想ですが、とにかくアプリを最速でリリースしたい方にすごくおすすめのサービスだなと思いました。 チュートリアル動画はこちら 元記事はこちら AWS Amplifyとは? AWSを使用したスケーラブルなWeb・モバイルアプリ開発のためのmBaaS(Mobile backend as a Service)なフレームワークです。 Amplifyを用いることで、複雑なバックエンドの構築、アプリケーションとの統合を簡略化し、 バックエンドとインフラをAWSにサーバーレスで任せることができます。また、CI/CD環境の構築も自動で構築してくれまので、 インフラ構築からデプロイまでシームレスに任せることができます。 特に、React, Vue, AngularなどでのSPAや、Gatsby, NextJS、 NuxtJSなどの静的サイトジェネレーターを用いたWebアプリケーション開発の事例がたくさんあります。 AWS Amplifyの3つの構成要素 Amplify CLI Amplify Framework Amplify Console Amplify CLI Amplify CLI は、AWS CloudFormationやInfrastructure as Code の仕組みを利用することなく、コマンドラインから対話的に質問に回答するだけで、バックエンドを構築することができるインターフェースです。 また、Amplify CLIは、バックエンドとの連携に必要な設定ファイルやソースコードを自動で 生成します。 Amplify CLIによって、下記機能を構築することができます。 - 認証機能 - バックエンドAPI - Websocketを使ったリアルタイム通信 - ホスティング Amplify Framework Amplify Framreworkは、クライアントがAWSのバックエンドと連携するための処理を数行で実装できるようにするフレームワークです。 - ライブラリ、UIコンポーネント、CLIを含むOSSのクライアントフレームワーク - 数行でバックエンドと連携するための処理を実装 - iOS、Android、Web(React/Vue/Angular)、React Native - それぞれに最適化されたライブラリ、UIコンポーネントを提供 Amplify Console サーバーレスウェブアプリケーションのデプロイ・ホスティングをするための サービス - SPA (シングルページアプリケーション)や静的サイトのホスティング - CI/CD の運用を自動化 - GithubやAWS CodeCommitなどのソースリポジトリと連携 - ブランチごとにテスト環境を自動で構築 - 特定の環境へのBasic認証の付与 AWS Amplifyのメリット バックエンドをすばやく構成 最速でサービスをリリースできる 柔軟性が高い フロントエンドとのシームレスな接続 数クリックでデプロイ バックエンドをすばやく構成 直観的なワークフローで、認証、ストレージ、データを含む、スケーラブルな バックエンドを素早くセットアップできます。 最速でサービスをリリースできる 本質的な開発に注力することが可能 柔軟性が高い Amplify consoleを使うと、テスト環境を自動で構築したり、認証を付与するといった、柔軟な開発フローの設計ができます フロントエンドとのシームレスな接続 数行のコードで、アプリケーションを、新規もしくは既存のAWS リソースと接続可能 数クリックでデプロイ Amplify コンソールを使用すると、数クリックでレポジトリと接続しアプリケーションをホスティングできます。
- 投稿日:2021-06-20T22:13:06+09:00
LinuxでMySQLをアップデートする方法
目次 1.MySQLのバージョン確認 2.MySQL停止 3.MySQLをアンインストールする 4.MySQLのインストール 5.終わりに 1. インストールされているMySQLのバージョン確認 cloud9は、デフォルトでMySQLがインストールされています。 バージョン確認をすると5.5系がインストールされています。 mysql --version こちらを5.7系にアップデートしていきます。 2. MySQL停止 まずはSQLを停止させます。 sudo service mysqld stop 3. MySQLをアンインストールする sudo yum -y remove mysql-config mysql55-server mysql55-libs mysql55 5.5系のSQLをアンインストールする為、上記の数値は55となっています。 4. MySQLのインストール sudo yum -y install mysql57-server mysql57 インストールしたいバージョンの数値を指定してください。 今回は5.7系をインストールする為57としています。 5. 終わりに こちらでLinuxでMysqlのアップデートが完了しましたが最後に確認をしましょう。 mysql --version 最後に 以上となります。不明点や間違っている点がありましたらコメントでお知らせください。 ありがとうございました。
- 投稿日:2021-06-20T21:37:02+09:00
AWS NetWork Firewall を使用した Web フィルタリングの実装 - ネットワーク構成 -
AWS Network Firewall が東京リージョンにて 2021年3月より利用可能 本記事では NAT Gateway を経由して、インターネットへ外部通信する際に AWS NetWork Firewall を使用して、Web フィルタリングとして機能させるためのネットワーク構成を記載する 構成 構成は以下のイメージ Network Firewall の作成 Firewall Endpoint とは、Network Firewall を作成する際に、対象の VPC 内の指定したサブネットに作成される検査用のエンドポイント。 この endpoint 上にルールグループを追加して、指定した通信を制御する仕組みとなる。ルールグループについては別記事にて記載。 サブネットに関する考慮事項 Firewall Endopoint は対象の VPC 内であれば 異なるアベラビリティゾーンへ複数配置する事も可能。 本構成では Firewall Endpoint は NATGateway が配置されたサブネットとは別のサブネットを指定する必要がある。 EC2 インスタンスからインターネット通信を行う際、Firewall Endpoint 上で検査を行う送信元IP は NAT Gateway の Private IP となる。 Firewall Endopoint を VPC 内に作成したとしても同一 VPC に PublicSubnet や、Firewall Endopoint の透過対象としない Natgatewawy の配置も可能。 ルートテーブルに関する考慮事項 本構成におけるルートテーブルは、以下のように基本的に4つ必要となる。 1つはゲートウェイルートテーブルとして、インターネットゲートウェイを Edge の関連付けを行う。 基本的には Private Subnet > NAT Gateway Subnet > Firewall Endpoint > Internet Gateway の順番でルートの関連付けする。 ネットワーク構成はこのようにして作成を行う。 以下の記事にて NetWork Firewall のルールグループに関する記事を記載する。
- 投稿日:2021-06-20T21:21:00+09:00
【AWS】VPC・EC2 作成 ハンズオン
はじめに 今回の記事ではAWS上での基本的なネットワーク環境の作成、EC2インスタンスの作成について記載します。 作成手順がベースとなりますが、随時補足しながら記載していきます。 作業環境 macOS Big Sur バージョン 11.4 構成図 以下の図のような環境の構築を目指します。 ※リソースはすべて東京リージョンに作成します。 VPC作成 VPC(Amazon Virtual Private Cloud)とは AWSにおけるネットワーク環境を定義する仮想ネットワークのサービス このネットワークにEC2などのAWSリソースを配置していく VPC自体の作成には料金は発生しない リージョンを選択 Management Consoleにログインし、まずはリージョンを選択します。 画面右上のプルダウンから使用したいリージョンを選択します。 ※ここでは「アジアパシフィック(東京)」リージョンを選択します。 VPCを作成 リージョンが選択できたら、VPCの作成に進みます。 画面上部の[サービス]を展開し、"ネットワーキングとコンテンツ配信"内の[VPC]をクリックします。 【別の方法】 検索バーを使用して、サービスを検索することも可能です。 VPC ダッシュボードが開きます。 画面左メニューで[VPC]をクリックします。 画面右ペインにVPCの一覧が表示されます。 ここで表示されるのは選択しているリージョンに作成されているVPCとなります。 [VPCを作成]をクリックします。 VPC作成ウィザードが開きます。 "名前タグ"にVPCの名前、"IPv4 CIDR ブロック"にVPCのIPv4アドレス範囲をCIDR形式で入力します。 "名前タグ"に入力したVPCの名前を値とした「Name」キーのタグが追加されています。 必要に応じてその他のタグを追加し、[VPCを作成]をクリックします。 VPCが作成されます。 先ほどのVPC一覧画面で作成したVPCが表示されることを確認します。 VPCの作成は完了です。 続いてサブネットを作成していきます。 パブリックサブネット作成 パブリックサブネットとは インターネットゲートウェイにルーティングされているサブネット VPCに紐づけて作成し、VPCのCIDR範囲内でサブネットのCIDRを指定 サブネットの作成には料金は発生しない インターネットゲートウェイとは VPCとインターネットとの通信を可能にするコンポーネント VPCに対して一つだけアタッチすることができる インターネットゲートウェイの作成には料金は発生しない サブネットを作成 まずはパブリックサブネットとして構成するサブネットを作成します。 VPC画面の左メニューで[サブネット]をクリックします。 画面右ペインにサブネットの一覧が表示されます。 [サブネットを作成]をクリックします。 サブネット作成ウィザードが開きます。 "VPC ID"でサブネットを作成するVPCをプルダウンから選択します。 "サブネット名"にサブネットの名前を入力します。 "アベイラビリティーゾーン"でサブネットを作成するアベイラビリティーゾーンをプルダウンから選択します。 【補足】 アベイラビリティーゾーン(AZ)とは複数のデータセンターから構成される単位となります。 各リージョンは複数のAZから構成されることで冗長性を確保しています。 東京リージョンは4つのAZで構成されていますが、通常使用できるのは以下の3つとなります。 ap-northeast-1a ap-northeast-1c ap-northeast-1d "IPv4 CIDR ブロック"にサブネットのIPv4アドレス範囲をCIDR形式で入力します。 IPv4アドレス範囲はVPCのアドレス範囲内となるように指定します。 また、"サブネット名"に入力したサブネットの名前を値とした「Name」キーのタグが追加されています。 必要に応じてその他のタグを追加し、[サブネットを作成]をクリックします。 サブネットが作成されます。 インターネットゲートウェイを作成・VPCへのアタッチ サブネットが作成できたら、次にインターネットゲートウェイを作成していきます。 画面左メニューで[インターネットゲートウェイ]をクリックします。 画面右ペインにインターネットゲートウェイの一覧が表示されます。 [インターネットゲートウェイを作成]をクリックします。 インターネットゲートウェイ作成ウィザードが開きます。 "名前タグ"にインターネットゲートウェイの名前を入力します。 "名前タグ"に入力したインターネットゲートウェイの名前を値とした「Name」キーのタグが追加されています。 必要に応じてその他のタグを追加し、[インターネットゲートウェイを作成]をクリックします。 インターネットゲートウェイが作成されます。 続けてVPCへのアタッチを実施するので、画面上部バーの[VPCへアタッチ]をクリックします。 "使用可能な VPC"で先ほど作成したサブネットを選択し、[インターネットゲートウェイのアタッチ]をクリックします。 インターネットゲートウェイのアタッチが完了しました。 これでVPCとインターネットゲートウェイの紐付けが完了した状態となりますが、インターネットに接続するためにはサブネットに関連付いたルートテーブルにインターネットゲートウェイへのルートを追加する必要があります。 インターネットゲートウェイへのルートを追加 サブネット一覧画面から作成したサブネットを選択し、画面下ペインの[ルートテーブル]タブをクリックします。 その後、表示されたルートテーブルのIDをクリックします。 クリックしたルートテーブルが選択されている状態のルートテーブル一覧画面が表示されます。 画面下ペインで[ルート]タブをクリック後、[ルートを編集]をクリックします。 ルート編集画面が開きます。 インターネットゲートウェイへのルートが追加されていない状態なので、追加していきます。 [Add route]をクリックします。 新規追加された枠で"Destination"に「0.0.0.0/0」と入力し、"Target"で「Internet Gateway」を選択します。 自動的に"Target"に「igw-」と入力されるので、選択肢の中から先ほど作成したインターネットゲートウェイを選択し、[変更を保存]をクリックします。 インターネットゲートウェイへのルートが追加されます。 これでパブリックサブネットとして構成され、インターネットへの接続ができる状態となりました。 現状の構成図 現状の構成図は以下の通りです。 続いてプライベートサブネットを作成していきます。 プライベートサブネット作成 プライベートサブネットとは インターネットゲートウェイにルーティングされていないサブネット インターネットからプライベートサブネットにアクセスすることはできない プライベートサブネットからインターネットにアクセスするにはNATゲートウェイを構成する必要がある(NATゲートウェイについては後述する) VPCに紐づけて作成し、VPCのCIDR範囲内でサブネットのCIDRを指定 サブネットの作成には料金は発生しない サブネットを作成 「パブリックサブネット作成」のサブネット作成手順を参照します。 今回はパブリックサブネットと同じアベイラビリティーゾーン(AZ)にプライベートサブネットを作成します。 現状の構成図 現状の構成図は以下の通りです。 EC2インスタンスを作成し、まずはパブリックサブネットに配置していきます。 EC2インスタンス 作成 EC2(Amazon Elastic Compute Cloud)とは AWSが提供するIaaSサービスで、数分で構築可能な仮想インスタンス 作成や削除、スペック変更などを時間をかけずに柔軟に対応することが可能 スペック(インスタンスタイプ)や購入オプションによって課金額が異なる EC2インスタンスを作成 画面上部の[サービス]を展開し、"コンピューティング"内の[EC2]をクリックします。 EC2 ダッシュボードが開きます。 画面左メニューで[インスタンス]をクリックします。 画面右ペインにEC2インスタンスの一覧が表示されます。 [インスタンスを起動]をクリックします。 EC2インスタンス作成ウィザードが開きます。 EC2を作成する際にはインストールするOSやアプリケーションが構成されたイメージ(AMI)を選択します。 使用したいAMIイメージの右側の[選択]をクリックします。 次にインスタンスタイプを選択します。 選択するインスタンスタイプによってEC2インスタンスのCPUやメモリなどのスペックが変わります。 使用したいインスタンスタイプを選択し、[次のステップ: インスタンスタイプの詳細の設定]をクリックします。 次にインスタンスの詳細設定を行います。 インスタンスについての細かい設定をすることが可能ですが、今回は最低限のネットワーク設定のみ変更していきます。 "ネットワーク"でインスタンスを配置するVPC、"サブネット"でインスタンスを配置するサブネットを選択します。 まずはパブリックサブネットに配置するインスタンスを作成するため、"自動割り当てパブリックIP"で[有効]を選択し、[次のステップ: ストレージの追加]をクリックします。 次にストレージの追加画面が表示されます。 今回は特にストレージ追加は実施しないので、[次のステップ: タグの追加]をクリックします。 次にタグの追加を行います。 必須ではありませんが、今回は管理しやすくするためにNameタグを付けます。 [タグの追加]をクリックします。 "キー"に「Name」、"値"にインスタンスの名前を入力し、[次のステップ: セキュリティグループの設定]をクリックします。 次にセキュリティグループの設定を行います。 セキュリティグループとはインスタンスへのトラフィックのアクセス可否を制御するファイアウォール機能を提供するもので、インスタンス単位で適用することが可能です。 今回はハンズオンのため、新しいセキュリティグループを作成し、インターネット経由でSSHで接続できるような設定とします。 [新しいセキュリティグループを作成する]を選択します。 必要に応じて"セキュリティグループ名"にセキュリティグループの名前を入力します。 今回は自動で設定された名前を使用します。 また、インターネット(0.0.0.0/0)からのSSHを許可するルールが自動的に追加されていますので、そのまま[確認と作成]をクリックします。 今まで設定した内容の確認画面となります。 設定内容を確認し問題なければ[起動]をクリックします。 インスタンスに接続するために必要となるキーペアの作成ウィンドウが表示されます。 キーペアはAWSが保存する「パブリックキー」とユーザーが保存する「プライベートキー」で構成されるものです。 後ほどSSHでインスタンスに接続する際に必要になりますので、新しく作成していきます。 [新しいキーペアの作成]を選択し、<キーペア名>にキーペアの名前を入力します。 [キーペアのダウンロード]をクリックし、プライベートキーファイルをダウンロードします。 ダウンロードが完了したら、[インスタンスの作成]をクリックします。 ※[インスタンスの作成]をクリックするとインスタンス作成が開始し、インスタンスが起動するため、課金が発生します。 作成ステータス画面となります。 [インスタンスの表示]をクリックします。 インスタンス一覧画面が表示されます。 インスタンスが作成されていることを確認します。 現状の構成図 現状の構成図は以下の通りです。 作成が確認できたら、作成したインスタンスにSSH接続してみます。 SSH接続 インスタンスにSSH接続をしていきますが、ここではターミナルを使用します。 ※SSH接続に使用するのはTera Term等のアプリケーションでも可能です。 まずはインスタンスに割り振られているパブリックIPアドレスをManagement Consoleから確認します。 インスタンス一覧画面でインスタンスを選択し、画面下部で[詳細]タブをクリックし、"パブリック IPv4 アドレス"の値を確認します。 IPアドレスの左のアイコンをクリックすることで、コピーすることも可能です。 ターミナルを開き、SSH接続をしていきます。 キーペア作成時にダウンロードしておいたプライベートキーファイルが必要になりますので、配置したパスを確認しておきます。 また、インスタンスにデフォルトで作成されるユーザーは「ec2-user」となりますので、SSH接続する際に使用するユーザーとして指定します。 terminal(PC) $ cd <プライベートキーファイルを配置したパス> $ ssh -i <プライベートキーファイル名> ec2-user@<インスタンスのパブリックIPアドレス> 実行すると以下のような接続確認をされるので、「yes」と入力し、Enterを入力します。 terminal(PC) The authenticity of host '52.195.6.222 (52.195.6.222)' can't be established. ECDSA key fingerprint is SHA256:4aV6w2T24e47JztHAm6VhAnwvoQzMXm1y+DjOvXDUnE. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes プライベートキーへのパーミッションが緩すぎると以下のような警告が表示され、インスタンスへのSSH接続に失敗します。 terminal(PC) Warning: Permanently added '52.195.6.222' (ECDSA) to the list of known hosts. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY FILE! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Permissions 0644 for 'ec2-test.pem' are too open. It is required that your private key files are NOT accessible by others. This private key will be ignored. Load key "ec2-test.pem": bad permissions ec2-user@52.195.6.222: Permission denied (publickey,gssapi-keyex,gssapi-with-mic). 今回の場合は「Permissions 0644 for 'ec2-test.pem' are too open.」とあるように、プライベートキーファイル[ec2-test.pem]に対して、パーミッションが「644」では緩すぎるということになります。 ここではパーミッションを「400」に変更し、再度SSH接続をしてみます。 terminal(PC) $ chmod 400 <プライベートキーファイル名> $ ssh -i <プライベートキーファイル名> ec2-user@<インスタンスのパブリックIPアドレス> __| __|_ ) _| ( / Amazon Linux 2 AMI ___|\___|___| https://aws.amazon.com/amazon-linux-2/ [ec2-user@ip-10-0-1-126 ~]$ インスタンスにSSH接続することができました。 次にインターネット接続ができることを確認していきます。 インターネット接続確認 www.google.co.jp に対して ping で疎通確認をし、インターネット接続を確認します。 インスタンス上で以下のコマンドを実行します。 terminal(PublicEC2) [ec2-user@ip-10-0-1-126 ~]$ ping www.google.co.jp -c 3 PING www.google.co.jp (172.217.175.227) 56(84) bytes of data. 64 bytes from nrt12s29-in-f3.1e100.net (172.217.175.227): icmp_seq=1 ttl=105 time=3.83 ms 64 bytes from nrt12s29-in-f3.1e100.net (172.217.175.227): icmp_seq=2 ttl=105 time=3.86 ms 64 bytes from nrt12s29-in-f3.1e100.net (172.217.175.227): icmp_seq=3 ttl=105 time=3.79 ms --- www.google.co.jp ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 3.795/3.830/3.860/0.026 ms 疎通が取れ、インターネットに接続できていることを確認できました。 NATゲートウェイ作成 NATゲートウェイとは プライベートサブネットからインターネットへのアクセスを可能にするコンポーネント NATゲートウェイ自体はパブリックサブネットに配置する NATゲートウェイは時間単位、処理データ1GB単位で料金が発生する 1時間あたりの料金:0.045USD (約4.95円) 処理データ1GBあたりの料金:0.045USD (約4.95円) ※1USD = 110円で計算 プライベートサブネットにEC2インスタンスを作成 「EC2インスタンス 作成」のインスタンス作成手順を参照します。 以下の設定を確認しながら、プライベートサブネットにインスタンスを作成します。 サブネット:プライベートサブネットに配置 自動割り当てパブリックIP:無効 セキュリティグループ:パブリックインスタンスと同じものを使用 キーペア:パブリックインスタンスを同じものを使用 プライベートインスタンスのIPアドレスを確認 プライベートインスタンスに割り振られているプライベートIPアドレスをManagement Consoleから確認します。 インスタンス一覧画面でプライベートインスタンスを選択し、画面下部で[詳細]タブをクリックし、"プライベート IPv4 アドレス"の値を確認します。 IPアドレスの左のアイコンをクリックすることで、コピーすることも可能です。 パブリックインスタンスにプライベートキーファイルを転送 プライベートインスタンスにSSH接続していきます。 パブリックIPアドレスを持っていないため、パブリックインスタンスを踏み台としてSSH接続をする必要があります。 SSH接続をするためにパブリックインスタンスにプライベートキーファイルを転送します。 ここでは「/tmp」にプライベートキーファイルを転送します。 terminal(PC) $ cd <プライベートキーファイルを配置したパス> $ scp -i <プライベートキーファイル名> <転送するファイル名> ec2-user@<パブリックインスタンスのパブリックIPアドレス>:/tmp/ パブリックインスタンスにSSH接続し、/tmp にプライベートアクセスキーが配置されていることを確認します。 terminal(PublicEC2) [ec2-user@ip-10-0-1-126 ~]$ ls /tmp ec2-test.pem systemd-private-4e90d1f46c0d400cbabd5392018c68f4-chronyd.service-w4Hijj プライベートインスタンスにSSH接続 パブリックインスタンスからプライベートインスタンスにSSH接続をします。 ※同じVPC内のサブネット間の通信はデフォルトのルート設定によって許可されています。 terminal(PublicEC2) [ec2-user@ip-10-0-1-126 ~]$ cd /tmp [ec2-user@ip-10-0-1-126 tmp]$ ssh -i <プライベートキーファイル名> ec2-user@10.0.2.42 The authenticity of host '10.0.2.42 (10.0.2.42)' can't be established. ECDSA key fingerprint is SHA256:jBtwGNVNXKDEfX/TqiyLUINu10Qq5gc8BLQR+ukt/Xk. ECDSA key fingerprint is MD5:c3:bf:85:9f:96:3f:c8:ca:5b:cd:84:0f:65:cd:70:1e. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '10.0.2.42' (ECDSA) to the list of known hosts. __| __|_ ) _| ( / Amazon Linux 2 AMI ___|\___|___| https://aws.amazon.com/amazon-linux-2/ [ec2-user@ip-10-0-2-42 ~]$ インターネット接続を確認 www.google.co.jp に対して ping で疎通確認をし、インターネット接続を確認します。 terminal(PrivateEC2) [ec2-user@ip-10-0-2-42 ~]$ ping www.google.co.jp -c 3 PING www.google.co.jp (172.217.25.99) 56(84) bytes of data. --- www.google.co.jp ping statistics --- 3 packets transmitted, 0 received, 100% packet loss, time 2040ms 現時点でプライベートインスタンスからインターネットにアクセスすることはできません。 NATゲートウェイを作成し、インターネットにアクセスできるようにしていきます。 NATゲートウェイを作成 NATゲートウェイを作成していきます。 VPC画面の左メニューで[NAT ゲートウェイ]をクリックします。 画面右ペインにNATゲートウェイの一覧が表示されます。 [NAT ゲートウェイを作成]をクリックします。 NATゲートウェイ作成ウィザードが開きます。 "名前"にNATゲートウェイの名前を入力します。 "サブネット"でNATゲートウェイを配置するパブリックサブネットを選択します。 "Connectivity type"はデフォルト値のまま「Public」とします。 "Elastic IP 割り当て ID"で使用するElastic IP アドレスを選択します。 Elastic IP アドレスとは固定で使用できるパブリックIPアドレスです。 事前に作成することも可能ですが、ここでは[Elastic IP の割り当て]をクリックし、自動で作成・割り当てをします。 ※Elastic IP アドレスを別途作成する場合はインスタンス等に割り当てしていない状態だと課金されます。 "名前"に入力したNATゲートウェイの名前を値とした「Name」キーのタグが追加されています。 必要に応じてその他のタグを追加し、[NAT ゲートウェイを作成]をクリックします。 NATゲートウェイが作成されます。 次にプライベートサブネットに関連付いたルートテーブルに対して、NATゲートウェイへのルートを設定します。 NATゲートウェイへのルート設定 サブネット一覧画面でプライベートサブネットを選択し、画面下部の[ルートテーブル]タブをクリックします。 パブリックサブネットと同じルートテーブルが関連付けられているため、インターネットゲートウェイへのルートが設定されています。 プライベートサブネット用にルートテーブルを別途作成し、関連付けます。 画面左メニューで[ルートテーブル]をクリックします。 画面右ペインでルートテーブル一覧画面が表示されます。 [ルートテーブルを作成]をクリックします。 "名前"にルートテーブルの名前を入力します。 "VPC"でルートテーブルを関連付けるプライベートサブネットが所属するVPCを選択します。 "名前"に入力したルートテーブルの名前を値とした「Name」キーのタグが追加されています。 必要に応じてその他のタグを追加し、[ルートテーブルを作成]をクリックします。 ルートテーブルが作成されます。 [ルートを編集]をクリックします。 デフォルトでVPC内通信のためのルートのみが設定されているので、NATゲートウェイへのルートを追加します。 [Add route]をクリックします。 新規追加された枠で"Destination"に「0.0.0.0/0」と入力し、"Target"で「NAT Gateway」を選択します。 自動的に"Target"に「nat-」と入力されるので、選択肢の中から先ほど作成したNATゲートウェイを選択し、[変更を保存]をクリックします。 NATゲートウェイへのルートが追加されます。 次にこのサブネットをプライベートサブネットに関連付けていきます。 サブネット一覧画面でプライベートサブネットを選択し、[アクション]-[ルートテーブルの関連付けを編集]をクリックします。 ルートテーブルの関連付け編集画面が表示されます。 "ルートテーブル ID"で先ほど作成したルートテーブルを選択し、[保存]をクリックします。 プライベートサブネットに関連付けられたルートテーブルが変更されます。 これでプライベートサブネットからNATゲートウェイへのルートが設定されている状態になります。 プライベートインスタンスからインターネットアクセスの確認を行います。 再度インターネット接続を確認 プライベートインスタンスにSSH接続し、www.google.co.jp に対して ping で疎通確認をしてみます。 terminal(PrivateEC2) [ec2-user@ip-10-0-2-42 ~]$ ping www.google.co.jp -c 3 PING www.google.co.jp (172.217.161.35) 56(84) bytes of data. 64 bytes from nrt12s23-in-f3.1e100.net (172.217.161.35): icmp_seq=1 ttl=103 time=3.06 ms 64 bytes from nrt12s23-in-f3.1e100.net (172.217.161.35): icmp_seq=2 ttl=103 time=2.86 ms 64 bytes from nrt12s23-in-f3.1e100.net (172.217.161.35): icmp_seq=3 ttl=103 time=2.83 ms --- www.google.co.jp ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 2.836/2.921/3.061/0.108 ms プライベートインスタンスがインターネットにアクセスできるようになりました。 構成図 最終的な構成図は以下の通りとなります。 あとがき この記事は AWS CloudTech の課題として作成しました。 動画やハンズオン等で学習を進めることができるので、AWS初学者にはおすすめです。
- 投稿日:2021-06-20T20:45:17+09:00
CloudWatch Logsで特定の文字列を検知したらLambdaでメール通知する
概要 CloudWatch Logsに出力しているサーバーとかアプリのログで、特定の文字列を見つけたらLambdaにそのログ行を渡してメール通知させる、というSyslogで例えればswatchみたいなことを実装してみた 方式・構成 CloudWatch Logsのサブスクリプションフィルター機能を利用して特定の文字列にマッチしたらそのログをLambdaに渡す Lambdaは渡されたログデータを加工してAmazon SNSに渡す Amazon SNSは指定されたトピックからメールで管理者に通知する 作業の大まかな手順 SNSトピックを設定する Lambda関数を作成する Lambda関数のロールにIAM権限を設定する Lambda関数のコードを作成・テストする CloudWatch Logsでサブスクリプションフィルターを設定する CloudWatch Logsにテスト用のログを流して動作を確認する 手順1: SNSトピックを設定する 既存のSNSトピックを使用するか、または新規作成する 新規作成の大まかな手順 1. トピックを作成する 1. トピックにEmailサブスクリプションを作成する 1. Emailサブスクリプションから届いた確認メールにConfirmする 1. 手動でトピックへのメッセージを発行してメールが届くことを確認する 手順2: Lambda関数を作成する Lambda関数を作成する。ランタイムは今回はNode.js 14.xを使用するが、自分の好みや要件などで自由に選んで良い 手順3: Lambda関数のロールにIAM権限を設定する SNSFullAccessを付与する 手順4: Lambda関数のコードを作成・テストする 環境変数SNS_TOPIC_ARNに手順1で作成したSNSトピックのARNを設定する 環境変数EMAIL_SUBJECTは送信する電子メールの件名を設定する テストデータはテンプレートの中からAmazon CloudWatch Logsを使用する テストしてみてメールが届けば良い index.js const aws = require('aws-sdk'); const zlib = require('zlib'); const sns = new aws.SNS(); const arn = process.env.SNS_TOPIC_ARN; const subject = process.env.EMAIL_SUBJECT; exports.handler = async (event, context, callback) => { // CloudWatchLogsデータをデコード const payload = Buffer.from(event.awslogs.data, 'base64'); const unzipeddata = zlib.unzipSync(payload); const logdata = JSON.parse(unzipeddata.toString('utf8')); const logs = JSON.stringify(logdata,null,2); // メッセージ設定 const params = { Message: logs, Subject: subject, TopicArn: arn }; // SNSに送信 // https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/sns-examples-publishing-messages.html var publishTextPromise = sns.publish(params).promise(); publishTextPromise.then( function(data) { console.log(`Message ${params.Message} sent to the topic ${params.TopicArn}`); console.log("MessageID is " + data.MessageId); }).catch( function(err) { console.error(err, err.stack); } ); callback(null,logs); }; 手順5: CloudWatch Logsでサブスクリプションフィルターを設定する CloudWatchで目的のロググループを選択する Lambdaサブスクリプションフィルターを作成する。その際に以下を設定する 前項で作成したLambda関数を指定する サブスクリプションフィルターのパターンに、検知する文字列を指定する 手順6: CloudWatch Logsにテスト用のログを流して動作を確認する ログストリームにテスト用のログイベントを作成してメールが届くことを確かめる 特定の文字列を含まないログイベントも作成してみて、メールが届かないことも確かめる
- 投稿日:2021-06-20T19:43:51+09:00
【AWS】EC2でのデプロイ(自動デプロイ)
目的 AWSのサーバーを利用し、Railsで作成したアプリを公開する。 開発環境 macOS: Big Sur Rubyバージョン: 2.6.5 Railsバージョン: 6.0.0 前提 Webサーバーの設定が完了している。【AWS】EC2でのデプロイ(Webサーバーの設定) 手順 はじめに Gemの導入 Capfileの編集 production.rbの編集 deploy.rbの編集 Unicorn設定ファイルの編集 Nginx設定ファイルの編集 自動デプロイの準備 自動デプロイの実行 アプリ修正から自動デプロイの流れ はじめに 今回は自動デプロイを実装していきます! これまで手動で行っていたデプロイ作業を、ローカルのターミナルからのコマンド1つで行えるようにします。 そのために、自動デプロイツールと呼ばれるものを利用しますが、今回はポピュラーなCapistranoを導入していきます。 Capistranoを利用すればEC2サーバーにログインする必要もなくコマンド1つでデプロイが完了します! Gemの導入 それでは早速始めていきます! まずは、Capistranoを利用するためのGemをインストールします。 Gemfile #省略 group :development, :test do gem 'capistrano' gem 'capistrano-rbenv' gem 'capistrano-bundler' gem 'capistrano-rails' gem 'capistrano3-unicorn' end #省略 ターミナル(ローカル) % bundle install ターミナル(ローカル) % bundle exec cap install これでインストールできました! Capfileの編集 続いて、Capistrano全体の設定をしているCapfileを編集します。 Capfileでは、Capistrano関連のライブラリのうちどれを読み込むかを指定できます。 Capistranoの機能を提供するコードはいくつかのライブラリに分かれています。そのため、Capistranoを動かすにはいくつかのライブラリを読み込む必要があります。 Capfile require "capistrano/setup" require "capistrano/deploy" require 'capistrano/rbenv' require 'capistrano/bundler' require 'capistrano/rails/assets' require 'capistrano/rails/migrations' require 'capistrano3/unicorn' Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r } 「require」によって引数としておかれた文字列が指すディレクトリが読み込まれ、その中にデプロイに際して必要な動作がひととおり記述されています。 production.rbの編集 続いて、デプロイについての設定を記載するファイルを編集します。 production.rbは、デプロイについての設定を書くファイルです。 GitHubへの接続に必要なsshキーの指定、デプロイ先のサーバのドメイン、AWSサーバへのログインユーザー名、サーバにログインしてからデプロイのために何をするか、といった設定を記載します。 また、deploy.rb、staging.rbも同様の役割をするファイルです。 config/deploy/production.rb server '用意したElastic IP', user: 'ec2-user', roles: %w{app db web} deploy.rbの編集 次は、deploy.rbの設定です。 このファイルには、production環境、staging環境どちらにも当てはまる設定を記述することとなります。 それでは、編集していきます! config/deploy.rb # capistranoのバージョンを記載。固定のバージョンを利用し続け、バージョン変更によるトラブルを防止する lock 'Capistranoのバージョン' # Capistranoのログの表示に利用する set :application, 'アプリ名' # どのリポジトリからアプリをpullするかを指定する set :repo_url, 'git@github.com:Githubのユーザー名/レポジトリ名.git' # バージョンが変わっても共通で参照するディレクトリを指定 set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system', 'public/uploads') set :rbenv_type, :user set :rbenv_ruby, 'このアプリで使用しているrubyのバージョン' # どの公開鍵を利用してデプロイするか set :ssh_options, auth_methods: ['publickey'], keys: ['~/.ssh/キーペア名.pem'] # プロセス番号を記載したファイルの場所 set :unicorn_pid, -> { "#{shared_path}/tmp/pids/unicorn.pid" } # Unicornの設定ファイルの場所 set :unicorn_config_path, -> { "#{current_path}/config/unicorn.rb" } set :keep_releases, 5 # デプロイ処理が終わった後、Unicornを再起動するための記述 after 'deploy:publishing', 'deploy:restart' namespace :deploy do task :restart do invoke 'unicorn:restart' end end 「Capistranoのバージョン」は、Gemfile.lockに記載されています。 Unicorn設定ファイルの編集 続いてUnicorn設定ファイルの編集です。 手動デプロイの時と比べ、自動デプロイ時にはRailsアプリのディレクトリが1段階深くなるため、数ヶ所変更を加える必要があります。 config/unicorn.rb #サーバ上でのアプリコードが設置されているディレクトリを変数に入れておく app_path = File.expand_path('../../../', __FILE__) #アプリサーバの性能を決定する worker_processes 1 #アプリの設置されているディレクトリを指定 working_directory "#{app_path}/current" # 「current」を指定 #Unicornの起動に必要なファイルの設置場所を指定 pid "#{app_path}/shared/tmp/pids/unicorn.pid" # 「shared」の中を参照するよう変更 #ポート番号を指定 listen "#{app_path}/shared/tmp/sockets/unicorn.sock" # 「shared」の中を参照するよう変更 #エラーのログを記録するファイルを指定 stderr_path "#{app_path}/shared/log/unicorn.stderr.log" # 「shared」の中を参照するよう変更 #通常のログを記録するファイルを指定 stdout_path "#{app_path}/shared/log/unicorn.stdout.log" # 「shared」の中を参照するよう変更 #省略 Nginx設定ファイルの編集 同じく、Nginxの設定ファイルも編集します。 ターミナル(EC2内で実行) $ sudo vim /etc/nginx/conf.d/rails.conf vimコマンドで編集するので、まずは「i」と打ち込んで入力モードに切り替えます。 /etc/nginx/conf.d/rails.conf upstream app_server { # Unicornと連携させるための設定 server unix:/var/www/リポジトリ名/shared/tmp/sockets/unicorn.sock; } # {}で囲った部分をブロックと呼ぶ。サーバの設定ができる server { # このプログラムが接続を受け付けるポート番号 listen 80; # 接続を受け付けるリクエストURL ここに書いていないURLではアクセスできない server_name Elastic IP; # クライアントからアップロードされてくるファイルの容量の上限を2ギガに設定。デフォルトは1メガなので大きめにしておく client_max_body_size 2g; # 接続が来た際のrootディレクトリ root /var/www/リポジトリ名/current/public; # assetsファイル(CSSやJavaScriptのファイルなど)にアクセスが来た際に適用される設定 location ^~ /assets/ { gzip_static on; expires max; add_header Cache-Control public; root /var/www/リポジトリ名/current/public; } try_files $uri/index.html $uri @unicorn; location @unicorn { 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; } error_page 500 502 503 504 /500.html; } 入力を終えたら「escキー」→「:wq」の順で実行し、保存します! Nginxの設定を変更したら、忘れずに再読込・再起動をしましょう。 ターミナル(EC2内で実行) [ec2-user@ip-172-31-25-189 ~]$ sudo systemctl reload nginx ターミナル(EC2内で実行) [ec2-user@ip-172-31-25-189 ~]$ sudo systemctl restart nginx 以上でNginx設定ファイルの編集は完了です! 自動デプロイの準備 ここからは自動デプロイの準備を行っていきます。 まずデータベースの状態を確認します。データベースが立ち上がっていないとデプロイが失敗するためです。 ターミナル(EC2内で実行) [ec2-user@ip-172-31-25-189 ~]$ sudo systemctl status mariadb ここでactiveになっていない場合はsudo systemctl start mariadbを実行します。 次に、unicornのプロセスをkillします。 すでにunicornのサーバーが立ち上がっている状態で自動デプロイをすると、二重でサーバーを立ち上げることになるためです。 まずは、プロセスを確認します。 ターミナル(EC2内で実行) [ec2-user@ip-172-31-23-189 <リポジトリ名>]$ ps aux | grep unicorn 続いて、プロセスをkillします。 ターミナル(EC2内で実行) [ec2-user@ip-172-31-23-189 <リポジトリ名>]$ kill プロセス番号 以上で自動デプロイの準備は完了です! 自動デプロイの実行 それでは実際に、自動デプロイを実行します! ターミナル(ローカル) % bundle exec cap production deploy 上記コマンドを実行しエラーが表示されずに完了したら自動デプロイは完了です。 アプリ修正から自動デプロイの流れ アプリの修正を行った際、自動デプロイをする前にやるべき事は下記の通りです。 状況 自動デプロイ前にやること VSCodeを修正した場合 変更点をリモートリポジトリにcommit→pushする データベース関連の内容を修正した場合 本番環境で「rails db:drop RAILS_ENV=production」「rails db:create RAILS_ENV=production」を実行 (※実行する際、「DISABLE_DATABASE_ENVIRONMENT_CHECK=1」というオプションが必要) Nginxを修正した場合 「sudo systemctl restart nginx」を実行 再度自動デプロイを実行する場合 プロセスをkillした上で「bundle exec cap production deploy」を実行 最後に 以上で、自動デプロイの実装は完了です。 では。
- 投稿日:2021-06-20T18:26:31+09:00
AWS Wavelength (KDDI / 5G MEC)を気軽に試せるAWS CDK環境を作った件
はじめに AWS Wavelength流行ってますよね!?(当社比) ただAWS Wavelengthは複雑なEC2やVPCの設定をしなければならず、ハードルが非常に高かったです。 そこでWavelengthの最小構成を自動で構築できるリポジトリを作成しました。 中身は、AWS CloudFormationとその構成をコードで構築できるAWS CDKでできています。 だいたい動かしっぱで月5000円くらいの構成ですが、不要になればコマンド一つですべて消すことができます。 使い方 次に今回準備したリポジトリをCloneします。 使い方はREADME.mdに記載してます。 まとめ 他にAWS CloudFormationでWavelength環境を構築した情報がほとんどなく苦労しましたが、これで試せるようになりました。 このAPIだけ改善されればCloudFormationですべて管理できるようになるのですが、、、 キャリアIPに対応したAPIが出るの待ってます。 以下にAWSのフォーラムを用意したので、回避方法を知っている方がいればぜひ情報ください。 次はUnreal Engine 5 Pixel StreamingをAWSに自動デプロイする記事が書きたいなと思ってます。 関連、参考記事 手動での設定、遅延、スループットの測定、既存のAWS EC2との性能比較をしている記事です。
- 投稿日:2021-06-20T17:55:37+09:00
Amazon Linux 2 に Amplify CLI を入れて Python Lambda を作ろうとしたら Python3.8以上が必要というエラーが出て困った話
タイトルのとおり困ったことが解消できたので手順のメモ。Pythonの環境構築について何もわかっていないので、解決はできたもののわかっていない。 エラーまでの手順 Amazon Linux 2 起動 && Amplify CLI インストール(4.52.0) amplify init amplify add function # Pythonを選択 amplify push 出たエラー python found but version is less than the minimum required version. You must have python >= 3.8 installed and available on your PATH as "python3" or "python". It can be installed from https://www.python.org/downloads Cloud9 でも確か同じエラーが出て、pythonもpython3も3.8未満だったため出ている。 試した方法 Python3.8のインストールコマンドとどのタイミングでやったかは忘れてしまった。。後述の[ユーザーのエイリアス設定]のsudo amazon-linux-extras install -y python3.8だった気もする。 ユーザーのエイリアス設定 まず試したのはこれ。 https://qiita.com/hiren/items/17984191da2ab8955174 sudo amazon-linux-extras install -y python3.8 echo 'alias python=python3.8' >> ~/.bashrc source ~/.bashrc ==>エラー解消せず(多分sudoユーザーのpython3が書き換えられていないせい? ルートユーザーにエイリアスを設定 sudoユーザーが3.8以上をpython3 or pythonコマンドで実行できないといけないのだと予想し、次試したのはこれ。 https://qiita.com/homines22/items/ba1a6d03df85e65fc85a ==>エイリアスではダメなようでエラー解消せず 最終的にいけた方法 多分エイリアスじゃなくてコマンドそのものの割り当てを変えてくれるんだと思う? https://qiita.com/syu-kwsk/items/5ba485edabd19fb99d4d sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1 sudo update-alternatives --config python3 まとめ これを知っておくとAmazon Linux 2 からシンプルにamplify add functionでPython Lambdaを作れる。 記憶を頼りにかいているのでコピペだと多少エラーが出るかもしれない。
- 投稿日:2021-06-20T17:43:57+09:00
【AWS】EC2でのデプロイ(Webサーバーの設定)
目的 AWSのサーバーを利用し、Railsで作成したアプリを公開する。 開発環境 macOS: Big Sur Rubyバージョン: 2.6.5 Railsバージョン: 6.0.0 前提 EC2のRailsが起動している。【AWS】EC2でのデプロイ(EC2のRailsを起動) 手順 はじめに Nginxの導入 Nginx設定ファイルの編集 Unicornの設定変更 「502 but gateway」の対処法 はじめに 今回はNginxの導入を行っていきます! Nginxとは、Webサーバーの一種で、ユーザーのリクエストに対して静的コンテンツのみ取り出し処理を行い、動的コンテンツの生成をアプリケーションサーバに依頼する役割があります。 Nginxの導入 今回は、NginxのNginx1というバージョンを導入します。 ターミナル(EC2内で実行) [ec2-user@ip-172-31-25-189 ~]$ sudo amazon-linux-extras install nginx1 Is this ok [y/d/N]:と出てきたら、yを選択して決定してください。 無事に完了すれば、Nginxがインストールできています。 Nginx設定ファイルの編集 次にNginxが正しく動くように設定します。 ターミナル(EC2内で実行) [ec2-user@ip-172-31-25-189 ~]$ sudo vim /etc/nginx/conf.d/rails.conf ターミナル上でファイルを開けたら次のように編集します。 /etc/nginx/conf.d/rails.conf upstream app_server { # Unicornと連携させるための設定 server unix:/var/www/リポジトリ名/tmp/sockets/unicorn.sock; } # {}で囲った部分をブロックと呼ぶ。サーバの設定ができる server { # このプログラムが接続を受け付けるポート番号 listen 80; # 接続を受け付けるリクエストURL ここに書いていないURLではアクセスできない server_name Elastic IP; # クライアントからアップロードされてくるファイルの容量の上限を2ギガに設定。デフォルトは1メガなので大きめにしておく client_max_body_size 2g; # 接続が来た際のrootディレクトリ root /var/www/リポジトリ名/public; # assetsファイル(CSSやJavaScriptのファイルなど)にアクセスが来た際に適用される設定 location ^~ /assets/ { gzip_static on; expires max; add_header Cache-Control public; } try_files $uri/index.html $uri @unicorn; location @unicorn { 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; } error_page 500 502 503 504 /500.html; } 入力を終えたら「escキー」→「:wq」の順で実行し、保存します! 続いてNginxの権限を変更します。 下記コマンドでPOSTメソッドでもエラーが出ないようにします。 ターミナル(EC2内で実行) [ec2-user@ip-172-31-25-189 ~]$ cd /var/lib ターミナル(EC2内で実行) [ec2-user@ip-172-31-25-189 lib]$ sudo chmod -R 775 nginx これで、Nginxの設定が完了しました! 以下のコマンドを実行してNginx設定ファイルを再読み込みして起動します。 ターミナル(EC2内で実行) [ec2-user@ip-172-31-25-189 lib]$ cd ~ ターミナル(EC2内で実行) [ec2-user@ip-172-31-25-189 ~]$ sudo systemctl reload nginx ターミナル(EC2内で実行) [ec2-user@ip-172-31-25-189 ~]$ sudo systemctl start nginx Unicornの設定変更 Nginxを介した処理に変更したため、Unicornの設定も修正します。 config/unicorn.rb #省略 #listen 3000 listen "#{app_path}/tmp/sockets/unicorn.sock" #省略 編集したら、リモートリポジトリへ「commit→push」します! 次は、GitHubの変更点を本番環境へ反映させましょう。 まずは開発中のアプリケーションに移動します。 ターミナル(EC2内で実行) [ec2-user@ip-172-31-25-189 ~]$ cd /var/www/開発中のアプリケーション そしてGitHubの内容をEC2に反映させます。 ターミナル(EC2内で実行) [ec2-user@ip-172-31-23-189 <レポジトリ名>]$ git pull origin master 次は、Unicornを再起動します。 ターミナル(EC2内で実行) [ec2-user@ip-172-31-23-189 <リポジトリ名>]$ ps aux | grep unicorn ターミナル(EC2内で実行) [ec2-user@ip-172-31-23-189 <リポジトリ名>]$ kill プロセス番号 ターミナル(EC2内で実行) [ec2-user@ip-172-31-23-189 <リポジトリ名>]$ RAILS_SERVE_STATIC_FILES=1 unicorn_rails -c config/unicorn.rb -E production -D ここまでできたら、ブラウザで確認してみます! 「502 but gateway」の対処法 このエラーが出た場合はnginxのlogの確認をし、エラーログを探します! ターミナル(EC2内で実行) [ec2-user@ip-172-31-23-189 <リポジトリ名>]$ sudo less /var/log/nginx/error.log 最後に 以上で、Webサーバーの設定は完了です。 次回は自動デプロイです。【AWS】EC2でのデプロイ(自動デプロイ では。
- 投稿日:2021-06-20T17:39:03+09:00
AWS Cloud9でlaravelの環境立てようとしたら面食らったので、Google先生に質問してみる
やりたいこと AWS cloud9 でとりあえずlaravelのprojectをgitcloneしたい。 免責事項 以下の手順は2021/6/20に実施しました。環境の更新によっては手順ができない可能性があります。 手順 PHPのバージョン確認をします OrganizationAccountAccessRole:~/environment $ php -v PHP 7.2.24 (cli) (built: Oct 31 2019 18:27:08) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies PHPのversionが7.2でした。このままgithubからcloneしたのちプロジェクトを動かそうとするとphpのバージョンの影響により動作しません。ご自身で使われているPHPのバージョを合わせる作業を実施します php7.3をインストールしようとします OrganizationAccountAccessRole:~/environment $ sudo amazon-linux-extras install php7.3 Refusing because php7.3 could cause an invalid combination. 拒否されたので確認します。 OrganizationAccountAccessRole:~/environment $ sudo amazon-linux-extras list | grep php 15 php7.2 available \ 17 lamp-mariadb10.2-php7.2=latest enabled \ _ php7.3 available \ _ php7.4 available [ =stable ] _ php8.0 available [ =stable ] lamp-mariadb10.2-php7.2=latest enabled が有効化しておりますので競合し拒絶されています。 競合となるものを無効化する OrganizationAccountAccessRole:~/environment $ sudo amazon-linux-extras disable lamp-mariadb10.2-php7.2 Beware that disabling topics is not supported after they are installed. 0 ansible2 available \ [ =2.4.2 =2.4.6 =2.8 =stable ] 2 httpd_modules available [ =1.0 =stable ] 3 memcached1.5 available \ [ =1.5.1 =1.5.16 =1.5.17 ] 5 postgresql9.6 available \ [ =9.6.6 =9.6.8 =stable ] 6 postgresql10 available [ =10 =stable ] 9 R3.4 available [ =3.4.3 =stable ] 10 rust1 available \ [ =1.22.1 =1.26.0 =1.26.1 =1.27.2 =1.31.0 =1.38.0 =stable ] 11 vim available [ =8.0 =stable ] 15 php7.2 available \ [ =7.2.0 =7.2.4 =7.2.5 =7.2.8 =7.2.11 =7.2.13 =7.2.14 =7.2.16 =7.2.17 =7.2.19 =7.2.21 =7.2.22 =7.2.23 =7.2.24 =7.2.26 =stable ] 17 lamp-mariadb10.2-php7.2 available \ [ =10.2.10_7.2.0 =10.2.10_7.2.4 =10.2.10_7.2.5 =10.2.10_7.2.8 =10.2.10_7.2.11 =10.2.10_7.2.13 =10.2.10_7.2.14 =10.2.10_7.2.16 =10.2.10_7.2.17 =10.2.10_7.2.19 =10.2.10_7.2.22 =10.2.10_7.2.23 =10.2.10_7.2.24 =stable ] 18 libreoffice available \ [ =5.0.6.2_15 =5.3.6.1 =stable ] 19 gimp available [ =2.8.22 ] 20 docker=latest enabled \ [ =17.12.1 =18.03.1 =18.06.1 =18.09.9 =stable ] 21 mate-desktop1.x available \ [ =1.19.0 =1.20.0 =stable ] 22 GraphicsMagick1.3 available \ [ =1.3.29 =1.3.32 =1.3.34 =stable ] 23 tomcat8.5 available \ [ =8.5.31 =8.5.32 =8.5.38 =8.5.40 =8.5.42 =8.5.50 =stable ] 24 epel=latest enabled [ =7.11 =stable ] 25 testing available [ =1.0 =stable ] 26 ecs available [ =stable ] 27 corretto8 available \ [ =1.8.0_192 =1.8.0_202 =1.8.0_212 =1.8.0_222 =1.8.0_232 =1.8.0_242 =stable ] 28 firecracker available [ =0.11 =stable ] 29 golang1.11 available \ [ =1.11.3 =1.11.11 =1.11.13 =stable ] 30 squid4 available [ =4 =stable ] 31 php7.3 available \ [ =7.3.2 =7.3.3 =7.3.4 =7.3.6 =7.3.8 =7.3.9 =7.3.10 =7.3.11 =7.3.13 =stable ] 32 lustre2.10 available \ [ =2.10.5 =2.10.8 =stable ] 33 java-openjdk11 available [ =11 =stable ] 34 lynis available [ =stable ] 35 kernel-ng available [ =stable ] 36 BCC available [ =0.x =stable ] 37 mono available [ =5.x =stable ] 38 nginx1 available [ =stable ] 39 ruby2.6 available [ =2.6 =stable ] 40 mock available [ =stable ] 41 postgresql11 available [ =11 =stable ] 42 php7.4 available [ =stable ] 43 livepatch available [ =stable ] 44 python3.8 available [ =stable ] 45 haproxy2 available [ =stable ] 46 collectd available [ =stable ] 47 aws-nitro-enclaves-cli available [ =stable ] 48 R4 available [ =stable ] 49 kernel-5.4 available [ =stable ] 50 selinux-ng available [ =stable ] 51 php8.0 available [ =stable ] 52 tomcat9 available [ =stable ] 53 unbound1.13 available [ =stable ] 54 mariadb10.5 available [ =stable ] 55 kernel-5.10 available [ =stable ] 56 redis6 available [ =stable ] これで無効化できました。この時点ではphpのバージョンは変わりません。 次に無効化できたかどうか確認します。 OrganizationAccountAccessRole:~/environment $ sudo amazon-linux-extras list | grep php 15 php7.2 available \ 17 lamp-mariadb10.2-php7.2 available \ 31 php7.3 available \ 42 php7.4 available [ =stable ] 51 php8.0 available [ =stable ] 7.3を有効化します OrganizationAccountAccessRole:~/environment $ sudo amazon-linux-extras enable php7.3 0 ansible2 available \ [ =2.4.2 =2.4.6 =2.8 =stable ] 2 httpd_modules available [ =1.0 =stable ] 3 memcached1.5 available \ [ =1.5.1 =1.5.16 =1.5.17 ] 5 postgresql9.6 available \ [ =9.6.6 =9.6.8 =stable ] 6 postgresql10 available [ =10 =stable ] 9 R3.4 available [ =3.4.3 =stable ] 10 rust1 available \ [ =1.22.1 =1.26.0 =1.26.1 =1.27.2 =1.31.0 =1.38.0 =stable ] 11 vim available [ =8.0 =stable ] _ php7.2 available \ [ =7.2.0 =7.2.4 =7.2.5 =7.2.8 =7.2.11 =7.2.13 =7.2.14 =7.2.16 =7.2.17 =7.2.19 =7.2.21 =7.2.22 =7.2.23 =7.2.24 =7.2.26 =stable ] _ lamp-mariadb10.2-php7.2 available \ [ =10.2.10_7.2.0 =10.2.10_7.2.4 =10.2.10_7.2.5 =10.2.10_7.2.8 =10.2.10_7.2.11 =10.2.10_7.2.13 =10.2.10_7.2.14 =10.2.10_7.2.16 =10.2.10_7.2.17 =10.2.10_7.2.19 =10.2.10_7.2.22 =10.2.10_7.2.23 =10.2.10_7.2.24 =stable ] 18 libreoffice available \ [ =5.0.6.2_15 =5.3.6.1 =stable ] 19 gimp available [ =2.8.22 ] 20 docker=latest enabled \ [ =17.12.1 =18.03.1 =18.06.1 =18.09.9 =stable ] 21 mate-desktop1.x available \ [ =1.19.0 =1.20.0 =stable ] 22 GraphicsMagick1.3 available \ [ =1.3.29 =1.3.32 =1.3.34 =stable ] 23 tomcat8.5 available \ [ =8.5.31 =8.5.32 =8.5.38 =8.5.40 =8.5.42 =8.5.50 =stable ] 24 epel=latest enabled [ =7.11 =stable ] 25 testing available [ =1.0 =stable ] 26 ecs available [ =stable ] 27 corretto8 available \ [ =1.8.0_192 =1.8.0_202 =1.8.0_212 =1.8.0_222 =1.8.0_232 =1.8.0_242 =stable ] 28 firecracker available [ =0.11 =stable ] 29 golang1.11 available \ [ =1.11.3 =1.11.11 =1.11.13 =stable ] 30 squid4 available [ =4 =stable ] 31 php7.3=latest enabled \ [ =7.3.2 =7.3.3 =7.3.4 =7.3.6 =7.3.8 =7.3.9 =7.3.10 =7.3.11 =7.3.13 =stable ] 32 lustre2.10 available \ [ =2.10.5 =2.10.8 =stable ] 33 java-openjdk11 available [ =11 =stable ] 34 lynis available [ =stable ] 35 kernel-ng available [ =stable ] 36 BCC available [ =0.x =stable ] 37 mono available [ =5.x =stable ] 38 nginx1 available [ =stable ] 39 ruby2.6 available [ =2.6 =stable ] 40 mock available [ =stable ] 41 postgresql11 available [ =11 =stable ] _ php7.4 available [ =stable ] 43 livepatch available [ =stable ] 44 python3.8 available [ =stable ] 45 haproxy2 available [ =stable ] 46 collectd available [ =stable ] 47 aws-nitro-enclaves-cli available [ =stable ] 48 R4 available [ =stable ] 49 kernel-5.4 available [ =stable ] 50 selinux-ng available [ =stable ] _ php8.0 available [ =stable ] 52 tomcat9 available [ =stable ] 53 unbound1.13 available [ =stable ] 54 mariadb10.5 available [ =stable ] 55 kernel-5.10 available [ =stable ] 56 redis6 available [ =stable ] Now you can install: # yum clean metadata # yum install php-cli php-pdo php-fpm php-json php-mysqlnd 無事有効化できました。念のため確認ののち、以下のコマンドを実行します。 確認 OrganizationAccountAccessRole:~/environment $ sudo amazon-linux-extras list | grep php _ php7.2 available \ _ lamp-mariadb10.2-php7.2 available \ 31 php7.3=latest enabled \ _ php7.4 available [ =stable ] _ php8.0 available [ =stable ] 実行コマンド Now you can install: # yum clean metadata # yum install php-cli php-pdo php-fpm php-json php-mysqlnd # yum clean metadata OrganizationAccountAccessRole:~/environment $ yum clean metadata Loaded plugins: extras_suggestions, langpacks, priorities, update-motd Cleaning repos: amzn2-core amzn2extra-docker amzn2extra-epel amzn2extra-php7.3 epel hashicorp 14 metadata files removed 0 sqlite files removed 0 metadata files removed # yum install php-cli php-pdo php-fpm php-json php-mysqlnd OrganizationAccountAccessRole:~/environment $ yum install php-cli php-pdo php-fpm php-json php-mysqlnd Loaded plugins: extras_suggestions, langpacks, priorities, update-motd You need to be root to perform this command. 準備完了しました。ちなみにまだversionが上がっているわけではありません OrganizationAccountAccessRole:~/environment $ php -v PHP 7.2.24 (cli) (built: Oct 31 2019 18:27:08) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies ここでupdateコマンドを打ちます OrganizationAccountAccessRole:~/environment $ sudo yum update -y Loaded plugins: extras_suggestions, langpacks, priorities, update-motd amzn2extra-docker | 3.0 kB 00:00:00 amzn2extra-epel | 3.0 kB 00:00:00 amzn2extra-php7.3 | 3.0 kB 00:00:00 (1/2): amzn2extra-php7.3/2/x86_64/updateinfo | 76 B 00:00:00 (2/2): amzn2extra-php7.3/2/x86_64/primary_db | 471 kB 00:00:00 235 packages excluded due to repository priority protections Resolving Dependencies --> Running transaction check ---> Package php-cli.x86_64 0:7.2.24-1.amzn2.0.1 will be updated ---> Package php-cli.x86_64 0:7.3.28-1.amzn2 will be an update ---> Package php-common.x86_64 0:7.2.24-1.amzn2.0.1 will be updated ---> Package php-common.x86_64 0:7.3.28-1.amzn2 will be an update --> Processing Dependency: libzip.so.5()(64bit) for package: php-common-7.3.28-1.amzn2.x86_64 ---> Package php-devel.x86_64 0:7.2.24-1.amzn2.0.1 will be updated ---> Package php-devel.x86_64 0:7.3.28-1.amzn2 will be an update ---> Package php-fpm.x86_64 0:7.2.24-1.amzn2.0.1 will be updated ---> Package php-fpm.x86_64 0:7.3.28-1.amzn2 will be an update ---> Package php-json.x86_64 0:7.2.24-1.amzn2.0.1 will be updated ---> Package php-json.x86_64 0:7.3.28-1.amzn2 will be an update ---> Package php-mysqlnd.x86_64 0:7.2.24-1.amzn2.0.1 will be updated ---> Package php-mysqlnd.x86_64 0:7.3.28-1.amzn2 will be an update ---> Package php-pdo.x86_64 0:7.2.24-1.amzn2.0.1 will be updated ---> Package php-pdo.x86_64 0:7.3.28-1.amzn2 will be an update ---> Package php-process.x86_64 0:7.2.24-1.amzn2.0.1 will be updated ---> Package php-process.x86_64 0:7.3.28-1.amzn2 will be an update ---> Package php-xml.x86_64 0:7.2.24-1.amzn2.0.1 will be updated ---> Package php-xml.x86_64 0:7.3.28-1.amzn2 will be an update --> Running transaction check ---> Package libzip.x86_64 0:1.3.2-1.amzn2.0.1 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================================================================================================================================================================= Package Arch Version Repository Size ================================================================================================================================================================================================================================= Updating: php-cli x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 4.8 M php-common x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 1.1 M php-devel x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 1.3 M php-fpm x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 1.7 M php-json x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 71 k php-mysqlnd x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 236 k php-pdo x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 132 k php-process x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 88 k php-xml x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 210 k Installing for dependencies: libzip x86_64 1.3.2-1.amzn2.0.1 amzn2-core 62 k Transaction Summary ================================================================================================================================================================================================================================= Install ( 1 Dependent package) Upgrade 9 Packages Total download size: 9.7 M Downloading packages: Delta RPMs disabled because /usr/bin/applydeltarpm not installed. (1/10): libzip-1.3.2-1.amzn2.0.1.x86_64.rpm | 62 kB 00:00:00 (2/10): php-common-7.3.28-1.amzn2.x86_64.rpm | 1.1 MB 00:00:00 (3/10): php-cli-7.3.28-1.amzn2.x86_64.rpm | 4.8 MB 00:00:00 (4/10): php-devel-7.3.28-1.amzn2.x86_64.rpm | 1.3 MB 00:00:00 (5/10): php-json-7.3.28-1.amzn2.x86_64.rpm | 71 kB 00:00:00 (6/10): php-fpm-7.3.28-1.amzn2.x86_64.rpm | 1.7 MB 00:00:00 (7/10): php-mysqlnd-7.3.28-1.amzn2.x86_64.rpm | 236 kB 00:00:00 (8/10): php-pdo-7.3.28-1.amzn2.x86_64.rpm | 132 kB 00:00:00 (9/10): php-process-7.3.28-1.amzn2.x86_64.rpm | 88 kB 00:00:00 (10/10): php-xml-7.3.28-1.amzn2.x86_64.rpm | 210 kB 00:00:00 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Total 20 MB/s | 9.7 MB 00:00:00 Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : libzip-1.3.2-1.amzn2.0.1.x86_64 1/19 Updating : php-common-7.3.28-1.amzn2.x86_64 2/19 Updating : php-json-7.3.28-1.amzn2.x86_64 3/19 Updating : php-cli-7.3.28-1.amzn2.x86_64 4/19 Updating : php-pdo-7.3.28-1.amzn2.x86_64 5/19 Updating : php-mysqlnd-7.3.28-1.amzn2.x86_64 6/19 Updating : php-devel-7.3.28-1.amzn2.x86_64 7/19 Updating : php-fpm-7.3.28-1.amzn2.x86_64 8/19 Updating : php-xml-7.3.28-1.amzn2.x86_64 9/19 Updating : php-process-7.3.28-1.amzn2.x86_64 10/19 Cleanup : php-devel-7.2.24-1.amzn2.0.1.x86_64 11/19 Cleanup : php-cli-7.2.24-1.amzn2.0.1.x86_64 12/19 Cleanup : php-mysqlnd-7.2.24-1.amzn2.0.1.x86_64 13/19 Cleanup : php-pdo-7.2.24-1.amzn2.0.1.x86_64 14/19 Cleanup : php-process-7.2.24-1.amzn2.0.1.x86_64 15/19 Cleanup : php-xml-7.2.24-1.amzn2.0.1.x86_64 16/19 Cleanup : php-fpm-7.2.24-1.amzn2.0.1.x86_64 17/19 Cleanup : php-json-7.2.24-1.amzn2.0.1.x86_64 18/19 Cleanup : php-common-7.2.24-1.amzn2.0.1.x86_64 19/19 Verifying : php-fpm-7.3.28-1.amzn2.x86_64 1/19 Verifying : php-cli-7.3.28-1.amzn2.x86_64 2/19 Verifying : php-xml-7.3.28-1.amzn2.x86_64 3/19 Verifying : php-json-7.3.28-1.amzn2.x86_64 4/19 Verifying : libzip-1.3.2-1.amzn2.0.1.x86_64 5/19 Verifying : php-process-7.3.28-1.amzn2.x86_64 6/19 Verifying : php-mysqlnd-7.3.28-1.amzn2.x86_64 7/19 Verifying : php-devel-7.3.28-1.amzn2.x86_64 8/19 Verifying : php-pdo-7.3.28-1.amzn2.x86_64 9/19 Verifying : php-common-7.3.28-1.amzn2.x86_64 10/19 Verifying : php-common-7.2.24-1.amzn2.0.1.x86_64 11/19 Verifying : php-fpm-7.2.24-1.amzn2.0.1.x86_64 12/19 Verifying : php-process-7.2.24-1.amzn2.0.1.x86_64 13/19 Verifying : php-cli-7.2.24-1.amzn2.0.1.x86_64 14/19 Verifying : php-pdo-7.2.24-1.amzn2.0.1.x86_64 15/19 Verifying : php-json-7.2.24-1.amzn2.0.1.x86_64 16/19 Verifying : php-mysqlnd-7.2.24-1.amzn2.0.1.x86_64 17/19 Verifying : php-xml-7.2.24-1.amzn2.0.1.x86_64 18/19 Verifying : php-devel-7.2.24-1.amzn2.0.1.x86_64 19/19 Dependency Installed: libzip.x86_64 0:1.3.2-1.amzn2.0.1 Updated: php-cli.x86_64 0:7.3.28-1.amzn2 php-common.x86_64 0:7.3.28-1.amzn2 php-devel.x86_64 0:7.3.28-1.amzn2 php-fpm.x86_64 0:7.3.28-1.amzn2 php-json.x86_64 0:7.3.28-1.amzn2 php-mysqlnd.x86_64 0:7.3.28-1.amzn2 php-pdo.x86_64 0:7.3.28-1.amzn2 php-process.x86_64 0:7.3.28-1.amzn2 php-xml.x86_64 0:7.3.28-1.amzn2 Complete! ここまでで完了です。確認するとバージョンが上がっています OrganizationAccountAccessRole:~/environment $ php -v PHP 7.3.28 (cli) (built: May 13 2021 22:37:44) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.3.28, Copyright (c) 1998-2018 Zend Technologies ここから対象のURLを元にgit cloneしていきます OrganizationAccountAccessRole:~/environment $ git clone yourURL Cloning into 'TOTONOI'... The authenticity of host 'github.com (52.69.186.44)' can't be established. RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8. RSA key fingerprint is MD5:16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'github.com,52.69.186.44' (RSA) to the list of known hosts. Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. 弾かれました。ここはsshの公開鍵をこの環境で作ってないので当然ですね。作っていきます。 ssh公開鍵登録作業 OrganizationAccountAccessRole:~/environment $ cd .. OrganizationAccountAccessRole:~ $ ls environment node_modules package-lock.json OrganizationAccountAccessRole:~ $ ls -a . .aws .bash_logout .bashrc .cache environment .gitconfig .mkshrc .npm .nvm .profile .ssh .zshrc .. .bash_history .bash_profile .c9 .config .gem .gnupg node_modules .npmrc package-lock.json .rvm .zlogin OrganizationAccountAccessRole:~ $ cd .ssh OrganizationAccountAccessRole:~/.ssh $ ls authorized_keys known_hosts OrganizationAccountAccessRole:~/.ssh $ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/ec2-user/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/ec2-user/.ssh/id_rsa. Your public key has been saved in /home/ec2-user/.ssh/id_rsa.pub. The key fingerprint is: SHA256:uqT24L1+8UDI0Ljs4XOco0CPz29sMw1iefTJumwYMOU ec2-user@ip-172-31-9-197.ap-northeast-1.compute.internal The key's randomart image is: your ssh OrganizationAccountAccessRole:~/.ssh $ OrganizationAccountAccessRole:~/.ssh $ ls authorized_keys id_rsa id_rsa.pub known_hosts OrganizationAccountAccessRole:~/.ssh $ cat id_rsa.pub ssh-rsa your ssh あとはsshをgithubに登録してください 再トライ OrganizationAccountAccessRole:~/environment $ git clone youtURL Cloning into 'hogehoge'... remote: Enumerating objects: 458, done. remote: Counting objects: 100% (458/458), done. remote: Compressing objects: 100% (258/258), done. remote: Total 458 (delta 214), reused 410 (delta 172), pack-reused 0 Receiving objects: 100% (458/458), 833.04 KiB | 1.28 MiB/s, done. Resolving deltas: 100% (214/214), done. できましたので、プロジェクトの設定をしていきます。 プロジェクトの設定をしていきます OrganizationAccountAccessRole:~/environment $ cd/ OrganizationAccountAccessRole:~/environment/hogehoge(main) $ ls app bootstrap composer.lock database package-lock.json public resources select storage tests artisan composer.json config package.json phpunit.xml README.md routes server.php tailwind.config.js webpack.mix.js OrganizationAccountAccessRole:~/environment/hoge(main) $ composer install bash: composer: command not found OrganizationAccountAccessRole:~/environment/hoge(main) $ curl -sS https://getcomposer.org/installer | php All settings correct for using Composer Downloading... Composer (version 2.1.3) successfully installed to: /home/ec2-user/environment/TOTONOI/composer.phar Use it: php composer.phar OrganizationAccountAccessRole:~/environment/hoge(main) $ sudo mv composer.phar /usr/local/bin/composer OrganizationAccountAccessRole:~/environment/hoge (main) $ composer ______ / ____/___ ____ ___ ____ ____ ________ _____ / / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/ / /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ / \____/\____/_/ /_/ /_/ .___/\____/____/\___/_/ /_/ Composer version 2.1.3 2021-06-09 16:31:20 Usage: command [options] [arguments] Options: -h, --help Display this help message -q, --quiet Do not output any message -V, --version Display this application version --ansi Force ANSI output --no-ansi Disable ANSI output -n, --no-interaction Do not ask any interactive question --profile Display timing and memory usage information --no-plugins Whether to disable plugins. -d, --working-dir=WORKING-DIR If specified, use the given directory as working directory. --no-cache Prevent use of the cache -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug Available commands: about Shows a short information about Composer. archive Creates an archive of this composer package. browse Opens the package's repository URL or homepage in your browser. cc Clears composer's internal package cache. check-platform-reqs Check that platform requirements are satisfied. clear-cache Clears composer's internal package cache. clearcache Clears composer's internal package cache. config Sets config options. create-project Creates new project from a package into given directory. depends Shows which packages cause the given package to be installed. diagnose Diagnoses the system to identify common errors. dump-autoload Dumps the autoloader. dumpautoload Dumps the autoloader. exec Executes a vendored binary/script. fund Discover how to help fund the maintenance of your dependencies. global Allows running commands in the global composer dir ($COMPOSER_HOME). help Displays help for a command home Opens the package's repository URL or homepage in your browser. i Installs the project dependencies from the composer.lock file if present, or falls back on the composer.json. info Shows information about packages. init Creates a basic composer.json file in current directory. install Installs the project dependencies from the composer.lock file if present, or falls back on the composer.json. licenses Shows information about licenses of dependencies. list Lists commands outdated Shows a list of installed packages that have updates available, including their latest version. prohibits Shows which packages prevent the given package from being installed. reinstall Uninstalls and reinstalls the given package names remove Removes a package from the require or require-dev. require Adds required packages to your composer.json and installs them. run Runs the scripts defined in composer.json. run-script Runs the scripts defined in composer.json. search Searches for packages. self-update Updates composer.phar to the latest version. selfupdate Updates composer.phar to the latest version. show Shows information about packages. status Shows a list of locally modified packages. suggests Shows package suggestions. u Upgrades your dependencies to the latest version according to composer.json, and updates the composer.lock file. update Upgrades your dependencies to the latest version according to composer.json, and updates the composer.lock file. upgrade Upgrades your dependencies to the latest version according to composer.json, and updates the composer.lock file. validate Validates a composer.json and composer.lock. why Shows which packages cause the given package to be installed. why-not Shows which packages prevent the given package from being installed. OrganizationAccountAccessRole:~/environment/TOTONOI (master) $ sudo yum install php php-mbstring php-pdo php-gd php-xml Loaded plugins: extras_suggestions, langpacks, priorities, update-motd amzn2-core | 3.7 kB 00:00:00 235 packages excluded due to repository priority protections Package php-pdo-7.3.28-1.amzn2.x86_64 already installed and latest version Package php-xml-7.3.28-1.amzn2.x86_64 already installed and latest version Resolving Dependencies --> Running transaction check ---> Package php.x86_64 0:7.3.28-1.amzn2 will be installed ---> Package php-gd.x86_64 0:7.3.28-1.amzn2 will be installed --> Processing Dependency: libXpm.so.4()(64bit) for package: php-gd-7.3.28-1.amzn2.x86_64 --> Processing Dependency: libX11.so.6()(64bit) for package: php-gd-7.3.28-1.amzn2.x86_64 ---> Package php-mbstring.x86_64 0:7.3.28-1.amzn2 will be installed --> Processing Dependency: libonig.so.2()(64bit) for package: php-mbstring-7.3.28-1.amzn2.x86_64 --> Running transaction check ---> Package libX11.x86_64 0:1.6.7-3.amzn2 will be installed --> Processing Dependency: libX11-common >= 1.6.7-3.amzn2 for package: libX11-1.6.7-3.amzn2.x86_64 --> Processing Dependency: libxcb.so.1()(64bit) for package: libX11-1.6.7-3.amzn2.x86_64 ---> Package libXpm.x86_64 0:3.5.12-1.amzn2.0.2 will be installed ---> Package oniguruma.x86_64 0:5.9.6-1.amzn2.0.4 will be installed --> Running transaction check ---> Package libX11-common.noarch 0:1.6.7-3.amzn2 will be installed ---> Package libxcb.x86_64 0:1.12-1.amzn2.0.2 will be installed --> Processing Dependency: libXau.so.6()(64bit) for package: libxcb-1.12-1.amzn2.0.2.x86_64 --> Running transaction check ---> Package libXau.x86_64 0:1.0.8-2.1.amzn2.0.2 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================================================================================================================================================================= Package Arch Version Repository Size ================================================================================================================================================================================================================================= Installing: php x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 3.2 M php-gd x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 190 k php-mbstring x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 511 k Installing for dependencies: libX11 x86_64 1.6.7-3.amzn2 amzn2-core 606 k libX11-common noarch 1.6.7-3.amzn2 amzn2-core 164 k libXau x86_64 1.0.8-2.1.amzn2.0.2 amzn2-core 29 k libXpm x86_64 3.5.12-1.amzn2.0.2 amzn2-core 57 k libxcb x86_64 1.12-1.amzn2.0.2 amzn2-core 216 k oniguruma x86_64 5.9.6-1.amzn2.0.4 amzn2-core 127 k Transaction Summary ================================================================================================================================================================================================================================= Install 3 Packages (+6 Dependent packages) Total download size: 5.0 M Installed size: 17 M Is this ok [y/d/N]: y Downloading packages: (1/9): libX11-common-1.6.7-3.amzn2.noarch.rpm | 164 kB 00:00:00 (2/9): libXau-1.0.8-2.1.amzn2.0.2.x86_64.rpm | 29 kB 00:00:00 (3/9): libX11-1.6.7-3.amzn2.x86_64.rpm | 606 kB 00:00:00 (4/9): libXpm-3.5.12-1.amzn2.0.2.x86_64.rpm | 57 kB 00:00:00 (5/9): libxcb-1.12-1.amzn2.0.2.x86_64.rpm | 216 kB 00:00:00 (6/9): oniguruma-5.9.6-1.amzn2.0.4.x86_64.rpm | 127 kB 00:00:00 (7/9): php-gd-7.3.28-1.amzn2.x86_64.rpm | 190 kB 00:00:00 (8/9): php-mbstring-7.3.28-1.amzn2.x86_64.rpm | 511 kB 00:00:00 (9/9): php-7.3.28-1.amzn2.x86_64.rpm | 3.2 MB 00:00:00 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Total 11 MB/s | 5.0 MB 00:00:00 Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : oniguruma-5.9.6-1.amzn2.0.4.x86_64 1/9 Installing : libXau-1.0.8-2.1.amzn2.0.2.x86_64 2/9 Installing : libxcb-1.12-1.amzn2.0.2.x86_64 3/9 Installing : libX11-common-1.6.7-3.amzn2.noarch 4/9 Installing : libX11-1.6.7-3.amzn2.x86_64 5/9 Installing : libXpm-3.5.12-1.amzn2.0.2.x86_64 6/9 Installing : php-gd-7.3.28-1.amzn2.x86_64 7/9 Installing : php-mbstring-7.3.28-1.amzn2.x86_64 8/9 Installing : php-7.3.28-1.amzn2.x86_64 9/9 Verifying : libX11-common-1.6.7-3.amzn2.noarch 1/9 Verifying : libX11-1.6.7-3.amzn2.x86_64 2/9 Verifying : php-gd-7.3.28-1.amzn2.x86_64 3/9 Verifying : libXau-1.0.8-2.1.amzn2.0.2.x86_64 4/9 Verifying : php-7.3.28-1.amzn2.x86_64 5/9 Verifying : libXpm-3.5.12-1.amzn2.0.2.x86_64 6/9 Verifying : php-mbstring-7.3.28-1.amzn2.x86_64 7/9 Verifying : libxcb-1.12-1.amzn2.0.2.x86_64 8/9 Verifying : oniguruma-5.9.6-1.amzn2.0.4.x86_64 9/9 Installed: php.x86_64 0:7.3.28-1.amzn2 php-gd.x86_64 0:7.3.28-1.amzn2 php-mbstring.x86_64 0:7.3.28-1.amzn2 Dependency Installed: libX11.x86_64 0:1.6.7-3.amzn2 libX11-common.noarch 0:1.6.7-3.amzn2 libXau.x86_64 0:1.0.8-2.1.amzn2.0.2 libXpm.x86_64 0:3.5.12-1.amzn2.0.2 libxcb.x86_64 0:1.12-1.amzn2.0.2 oniguruma.x86_64 0:5.9.6-1.amzn2.0.4 Complete! OrganizationAccountAccessRole:~/environment/TOTONOI (master) $ ls app bootstrap composer.lock database package-lock.json public resources select storage tests artisan composer.json config package.json phpunit.xml README.md routes server.php tailwind.config.js webpack.mix.js OrganizationAccountAccessRole:~/environment/TOTONOI (master) $ composer install Installing dependencies from lock file (including require-dev) Verifying lock file contents can be installed on current platform. Package operations: 116 installs, 0 updates, 0 removals - Downloading dasprid/enum (1.0.3) - Downloading bacon/bacon-qr-code (2.0.3) - Downloading doctrine/inflector (2.0.3) - Downloading doctrine/lexer (1.2.1) - Downloading symfony/polyfill-ctype (v1.22.1) - Downloading webmozart/assert (1.10.0) - Downloading dragonmantank/cron-expression (v3.1.0) - Downloading symfony/polyfill-php80 (v1.22.1) - Downloading symfony/polyfill-mbstring (v1.22.1) - Downloading symfony/var-dumper (v5.2.6) - Downloading symfony/polyfill-intl-normalizer (v1.22.1) - Downloading symfony/polyfill-intl-grapheme (v1.22.1) - Downloading symfony/string (v5.2.6) - Downloading psr/container (1.1.1) - Downloading symfony/service-contracts (v2.4.0) - Downloading symfony/polyfill-php73 (v1.22.1) - Downloading symfony/console (v5.2.6) - Downloading psr/log (1.1.3) - Downloading monolog/monolog (2.2.0) - Downloading voku/portable-ascii (1.5.6) - Downloading phpoption/phpoption (1.7.5) - Downloading graham-campbell/result-type (v1.0.1) - Downloading vlucas/phpdotenv (v5.3.0) - Downloading symfony/css-selector (v5.2.4) - Downloading tijsverkoyen/css-to-inline-styles (2.2.3) - Downloading symfony/deprecation-contracts (v2.4.0) - Downloading symfony/routing (v5.2.6) - Downloading symfony/process (v5.2.4) - Downloading symfony/polyfill-php72 (v1.22.1) - Downloading symfony/polyfill-intl-idn (v1.22.1) - Downloading symfony/mime (v5.2.6) - Downloading symfony/http-foundation (v5.2.4) - Downloading symfony/http-client-contracts (v2.4.0) - Downloading psr/event-dispatcher (1.0.0) - Downloading symfony/event-dispatcher-contracts (v2.4.0) - Downloading symfony/event-dispatcher (v5.2.4) - Downloading symfony/error-handler (v5.2.6) - Downloading symfony/http-kernel (v5.2.6) - Downloading symfony/finder (v5.2.4) - Downloading symfony/polyfill-iconv (v1.22.1) - Downloading egulias/email-validator (2.1.25) - Downloading swiftmailer/swiftmailer (v6.2.7) - Downloading ramsey/collection (1.1.3) - Downloading brick/math (0.9.2) - Downloading ramsey/uuid (4.1.1) - Downloading psr/simple-cache (1.0.1) - Downloading opis/closure (3.6.2) - Downloading symfony/translation-contracts (v2.4.0) - Downloading symfony/translation (v5.2.6) - Downloading nesbot/carbon (2.46.0) - Downloading league/mime-type-detection (1.7.0) - Downloading league/flysystem (1.1.3) - Downloading league/commonmark (1.5.8) - Downloading laravel/framework (v8.40.0) - Downloading filp/whoops (2.12.1) - Downloading facade/ignition-contracts (1.0.2) - Downloading facade/flare-client-php (1.7.0) - Downloading facade/ignition (2.8.3) - Downloading fakerphp/faker (v1.14.1) - Downloading fideloper/proxy (4.4.1) - Downloading asm89/stack-cors (v2.0.3) - Downloading fruitcake/laravel-cors (v2.0.4) - Downloading guzzlehttp/promises (1.4.1) - Downloading ralouphie/getallheaders (3.0.3) - Downloading psr/http-message (1.0.1) - Downloading guzzlehttp/psr7 (1.8.2) - Downloading jaybizzle/crawler-detect (v1.2.105) - Downloading paragonie/constant_time_encoding (v2.4.0) - Downloading pragmarx/google2fa (8.0.0) - Downloading laravel/fortify (v1.7.12) - Downloading mobiledetect/mobiledetectlib (2.8.37) - Downloading jenssegers/agent (v2.6.4) - Downloading laravel/jetstream (v2.3.4) - Downloading laravel/sail (v1.5.0) - Downloading laravel/sanctum (v2.10.0) - Downloading psr/http-client (1.0.1) - Downloading guzzlehttp/guzzle (7.3.0) - Downloading league/oauth1-client (v1.9.0) - Downloading laravel/socialite (v5.2.3) - Downloading nikic/php-parser (v4.10.4) - Downloading psy/psysh (v0.10.8) - Downloading laravel/tinker (v2.6.1) - Downloading hamcrest/hamcrest-php (v2.0.1) - Downloading mockery/mockery (1.4.3) - Downloading nunomaduro/collision (v5.4.0) - Downloading phpdocumentor/reflection-common (2.2.0) - Downloading phpdocumentor/type-resolver (1.4.0) - Downloading phpdocumentor/reflection-docblock (5.2.2) - Downloading sebastian/version (3.0.2) - Downloading sebastian/type (2.3.1) - Downloading sebastian/resource-operations (3.0.3) - Downloading sebastian/recursion-context (4.0.4) - Downloading sebastian/object-reflector (2.0.4) - Downloading sebastian/object-enumerator (4.0.4) - Downloading sebastian/global-state (5.0.2) - Downloading sebastian/exporter (4.0.3) - Downloading sebastian/environment (5.1.3) - Downloading sebastian/diff (4.0.4) - Downloading sebastian/comparator (4.0.6) - Downloading sebastian/code-unit (1.0.8) - Downloading sebastian/cli-parser (1.0.1) - Downloading phpunit/php-timer (5.0.3) - Downloading phpunit/php-text-template (2.0.4) - Downloading phpunit/php-invoker (3.1.1) - Downloading phpunit/php-file-iterator (3.0.5) - Downloading theseer/tokenizer (1.2.0) - Downloading sebastian/lines-of-code (1.0.3) - Downloading sebastian/complexity (2.0.2) - Downloading sebastian/code-unit-reverse-lookup (2.0.3) - Downloading phpunit/php-code-coverage (9.2.6) - Downloading doctrine/instantiator (1.4.0) - Downloading phpspec/prophecy (1.13.0) - Downloading phar-io/version (3.1.0) - Downloading phar-io/manifest (2.0.1) - Downloading myclabs/deep-copy (1.10.2) - Downloading phpunit/phpunit (9.5.4) - Installing dasprid/enum (1.0.3): Extracting archive - Installing bacon/bacon-qr-code (2.0.3): Extracting archive - Installing doctrine/inflector (2.0.3): Extracting archive - Installing doctrine/lexer (1.2.1): Extracting archive - Installing symfony/polyfill-ctype (v1.22.1): Extracting archive - Installing webmozart/assert (1.10.0): Extracting archive - Installing dragonmantank/cron-expression (v3.1.0): Extracting archive - Installing symfony/polyfill-php80 (v1.22.1): Extracting archive - Installing symfony/polyfill-mbstring (v1.22.1): Extracting archive - Installing symfony/var-dumper (v5.2.6): Extracting archive - Installing symfony/polyfill-intl-normalizer (v1.22.1): Extracting archive - Installing symfony/polyfill-intl-grapheme (v1.22.1): Extracting archive - Installing symfony/string (v5.2.6): Extracting archive - Installing psr/container (1.1.1): Extracting archive - Installing symfony/service-contracts (v2.4.0): Extracting archive - Installing symfony/polyfill-php73 (v1.22.1): Extracting archive - Installing symfony/console (v5.2.6): Extracting archive - Installing psr/log (1.1.3): Extracting archive - Installing monolog/monolog (2.2.0): Extracting archive - Installing voku/portable-ascii (1.5.6): Extracting archive - Installing phpoption/phpoption (1.7.5): Extracting archive - Installing graham-campbell/result-type (v1.0.1): Extracting archive - Installing vlucas/phpdotenv (v5.3.0): Extracting archive - Installing symfony/css-selector (v5.2.4): Extracting archive - Installing tijsverkoyen/css-to-inline-styles (2.2.3): Extracting archive - Installing symfony/deprecation-contracts (v2.4.0): Extracting archive - Installing symfony/routing (v5.2.6): Extracting archive - Installing symfony/process (v5.2.4): Extracting archive - Installing symfony/polyfill-php72 (v1.22.1): Extracting archive - Installing symfony/polyfill-intl-idn (v1.22.1): Extracting archive - Installing symfony/mime (v5.2.6): Extracting archive - Installing symfony/http-foundation (v5.2.4): Extracting archive - Installing symfony/http-client-contracts (v2.4.0): Extracting archive - Installing psr/event-dispatcher (1.0.0): Extracting archive - Installing symfony/event-dispatcher-contracts (v2.4.0): Extracting archive - Installing symfony/event-dispatcher (v5.2.4): Extracting archive - Installing symfony/error-handler (v5.2.6): Extracting archive - Installing symfony/http-kernel (v5.2.6): Extracting archive - Installing symfony/finder (v5.2.4): Extracting archive - Installing symfony/polyfill-iconv (v1.22.1): Extracting archive - Installing egulias/email-validator (2.1.25): Extracting archive - Installing swiftmailer/swiftmailer (v6.2.7): Extracting archive - Installing ramsey/collection (1.1.3): Extracting archive - Installing brick/math (0.9.2): Extracting archive - Installing ramsey/uuid (4.1.1): Extracting archive - Installing psr/simple-cache (1.0.1): Extracting archive - Installing opis/closure (3.6.2): Extracting archive - Installing symfony/translation-contracts (v2.4.0): Extracting archive - Installing symfony/translation (v5.2.6): Extracting archive - Installing nesbot/carbon (2.46.0): Extracting archive - Installing league/mime-type-detection (1.7.0): Extracting archive - Installing league/flysystem (1.1.3): Extracting archive - Installing league/commonmark (1.5.8): Extracting archive - Installing laravel/framework (v8.40.0): Extracting archive - Installing filp/whoops (2.12.1): Extracting archive - Installing facade/ignition-contracts (1.0.2): Extracting archive - Installing facade/flare-client-php (1.7.0): Extracting archive - Installing facade/ignition (2.8.3): Extracting archive - Installing fakerphp/faker (v1.14.1): Extracting archive - Installing fideloper/proxy (4.4.1): Extracting archive - Installing asm89/stack-cors (v2.0.3): Extracting archive - Installing fruitcake/laravel-cors (v2.0.4): Extracting archive - Installing guzzlehttp/promises (1.4.1): Extracting archive - Installing ralouphie/getallheaders (3.0.3): Extracting archive - Installing psr/http-message (1.0.1): Extracting archive - Installing guzzlehttp/psr7 (1.8.2): Extracting archive - Installing jaybizzle/crawler-detect (v1.2.105): Extracting archive - Installing paragonie/constant_time_encoding (v2.4.0): Extracting archive - Installing pragmarx/google2fa (8.0.0): Extracting archive - Installing laravel/fortify (v1.7.12): Extracting archive - Installing mobiledetect/mobiledetectlib (2.8.37): Extracting archive - Installing jenssegers/agent (v2.6.4): Extracting archive - Installing laravel/jetstream (v2.3.4): Extracting archive - Installing laravel/sail (v1.5.0): Extracting archive - Installing laravel/sanctum (v2.10.0): Extracting archive - Installing psr/http-client (1.0.1): Extracting archive - Installing guzzlehttp/guzzle (7.3.0): Extracting archive - Installing league/oauth1-client (v1.9.0): Extracting archive - Installing laravel/socialite (v5.2.3): Extracting archive - Installing nikic/php-parser (v4.10.4): Extracting archive - Installing psy/psysh (v0.10.8): Extracting archive - Installing laravel/tinker (v2.6.1): Extracting archive - Installing hamcrest/hamcrest-php (v2.0.1): Extracting archive - Installing mockery/mockery (1.4.3): Extracting archive - Installing nunomaduro/collision (v5.4.0): Extracting archive - Installing phpdocumentor/reflection-common (2.2.0): Extracting archive - Installing phpdocumentor/type-resolver (1.4.0): Extracting archive - Installing phpdocumentor/reflection-docblock (5.2.2): Extracting archive - Installing sebastian/version (3.0.2): Extracting archive - Installing sebastian/type (2.3.1): Extracting archive - Installing sebastian/resource-operations (3.0.3): Extracting archive - Installing sebastian/recursion-context (4.0.4): Extracting archive - Installing sebastian/object-reflector (2.0.4): Extracting archive - Installing sebastian/object-enumerator (4.0.4): Extracting archive - Installing sebastian/global-state (5.0.2): Extracting archive - Installing sebastian/exporter (4.0.3): Extracting archive - Installing sebastian/environment (5.1.3): Extracting archive - Installing sebastian/diff (4.0.4): Extracting archive - Installing sebastian/comparator (4.0.6): Extracting archive - Installing sebastian/code-unit (1.0.8): Extracting archive - Installing sebastian/cli-parser (1.0.1): Extracting archive - Installing phpunit/php-timer (5.0.3): Extracting archive - Installing phpunit/php-text-template (2.0.4): Extracting archive - Installing phpunit/php-invoker (3.1.1): Extracting archive - Installing phpunit/php-file-iterator (3.0.5): Extracting archive - Installing theseer/tokenizer (1.2.0): Extracting archive - Installing sebastian/lines-of-code (1.0.3): Extracting archive - Installing sebastian/complexity (2.0.2): Extracting archive - Installing sebastian/code-unit-reverse-lookup (2.0.3): Extracting archive - Installing phpunit/php-code-coverage (9.2.6): Extracting archive - Installing doctrine/instantiator (1.4.0): Extracting archive - Installing phpspec/prophecy (1.13.0): Extracting archive - Installing phar-io/version (3.1.0): Extracting archive - Installing phar-io/manifest (2.0.1): Extracting archive - Installing myclabs/deep-copy (1.10.2): Extracting archive - Installing phpunit/phpunit (9.5.4): Extracting archive Generating optimized autoload files > Illuminate\Foundation\ComposerScripts::postAutoloadDump > @php artisan package:discover --ansi Discovered Package: facade/ignition Discovered Package: fideloper/proxy Discovered Package: fruitcake/laravel-cors Discovered Package: jenssegers/agent Discovered Package: laravel/fortify Discovered Package: laravel/jetstream Discovered Package: laravel/sail Discovered Package: laravel/sanctum Discovered Package: laravel/socialite Discovered Package: laravel/tinker Discovered Package: nesbot/carbon Discovered Package: nunomaduro/collision Package manifest generated successfully. 76 packages you are using are looking for funding. Use the `composer fund` command to find out more! artisan serveもためしてみます OrganizationAccountAccessRole:~/environment/hoge(main) $ php artisan serve Starting Laravel development server: http://127.0.0.1:8000 いけてそうです! あとは .env作成コマンド php artisan key:generate php artisan migrate など必要に応じて打ってみてください
- 投稿日:2021-06-20T16:58:09+09:00
EC2へのsshコマンド、mysqlの接続コマンド
cloud9からEC2へSSH接続するコマンド ssh -i ~/.ssh/practice-aws.pem ec2-user@パブリックコメントIPまたはEIP mysqlへ接続するコマンド mysql -u root -p -h エンドポイント エンドポイントはRDSのメニューで確認する。 接続を解除するには、exitを入力するか、Ctrl+Dを押下する。
- 投稿日:2021-06-20T16:05:07+09:00
【EC2】WordPressを構築しよう sec7後半
TCP/IPの4階層モデル sec7後半:なぜWordPressが表示されるのか? 下の図の部分を学ぶ。 TCP/OPについて学ぶ 通信の中では実際に何が起きているのか? → TCP/IPプロトコルに基づいて行われている。 プロトコル とは コンピュータ同士の約束事。共通言語のような役割。 TCP/IP TCP/IPを中心として、インターネットを構築する上で必要なプロトコル群。 TCP/IPの4階層モデル 各階層の役割がわかりやすく、上下の階層を意識する事なく自身の役割を果たすことができる。 アプリケーション層 アプリケーション同士が会話する。(HTTP, DNS, SSH トランスポート層 データの転送を制御する。(TCP, UDP ネットワーク層 IPアドレスを管理し、経路選択する。(IP, ICMP, ARP ネットワークインタフェイス層 直接接続された機器同士で通信する。(Ethetnet, PPP AWSがよしなにやってくれる。 上位層から階層へは、自分のデータ処理に必要になる"ヘッダ"を付随させてやり取りを行う。 HTTP HyperText Transfer Protocol、HTMLなどのコンテンツの送受信に用いられる約束事。 クライアントがHTTPリクエストを送り、それに対してサーバーがHTTPレスポンスを返す。 HTTPリクエスト リクエストライン(GET / HTTP / 1.1 ヘッダー(その他の情報 ボディ(オプション HTTPレスポンス ステータスライン(HTTP / 1.1 200 OK ヘッダー(その他の情報 ボディ(HTMLのテクスト情報など TCP アプリ間のコネクションの確立・切断する。 どのアプリと通信するか決定する。(ポート番号を利用する。 TCP Transmission Control Protocol 通信を制御するプログラム、データの到達確認・コネクション管理を行う。信頼性の高い通信 UDP User Datagram Protocol コネクションレスな通信サービス、高速性やリアルタイム性が高い通信(電話など。 IP 最終的な宛先のコンピュータにパケットを届ける役割、重要。 役割は3つ。 IPアドレス 通信を行う相手先を識別するのに使われる ルーティング 宛先までパケットを届ける役割、ルートテーブルを活用 パケットの分割・再構築処理 ネットワークインターフェイス層により、最大転送範囲が異なる。最大転送範囲よりパケットを小さくし、宛先で再構築する。
- 投稿日:2021-06-20T15:17:19+09:00
AWS EC2にMySQL Serverをインストールする
はじめに 目次 MySQLをインストール MySQLへアクセスする EC2にMySQL Serverをインストール 【前提】 ・MySQL SevrerをインストールしたいEC2インスタンスにルート権限でログインしてください。 【手順】 1.MySQLリポジトリをインストールする。 yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm -y 2.MySQL Serverをインストール。 yum install mysql-community-server -y ※サーバのインストールのため時間がかかる場合があります。 3.MySQLを起動。 systemctl start mysqld 4.サービス自動起動に設定。 EC2インスタンスが停止するとサービスも停止されるため、「EC2起動してるのにMySQL使えない!なんで?」なんてことがないように自動起動を設定します。 systemctl enable mysqld MySQLへアクセスする 1.MySQLログから初期パスワードを確認する MySQLインストール時に発行される一時パスワードを確認します。 パスワードは/var/log/mysqld.logに出力されています。 cat /var/log/mysqld.log | grep localhost 次のように出力されているはずです。 2021-06-19T10:36:06.105340Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: [パスワード] 2.MySQLにログイン mysql -u root -p ※Enter password:とでたら1で確認したパスワードを入力します。 3.初期パスワード変更 一時パスワードのままだとMySQLの操作ができないため、パスワードを変更します。 ALTER USER root@localhost IDENTIFIED BY 'パスワード'; 以降、通常のSQL操作可能です。
- 投稿日:2021-06-20T14:54:49+09:00
【AWS】API Gatewayでカスタムなステータスコードを返す方法
ふと、API Gatewayで指定したステータスコード(404とか500とか)を返したいと思い、色々な記事を見ていたのですが、どうにも上手く行かない。 例えば、Lambdaで404のステータスコードを返す関数を作成し、API Gatewayでアタッチしたとします。 exports.handler = async (event, context, callback) => { const myErrorObj = { errorType : "Page not found", httpStatus : 404, } return callback(JSON.stringify(myErrorObj)); // リクエストをしても200が返ってくる }; これで404のステータスを渡せるんじゃないの?と思う方も多いと思います。 ただ、これを実際にリクエストすると、200のステータスコードが返ってきます。 なんとも不気味ですね。 しかも厄介。 恐らくこの辺の設定は全て自分で行わなければいけないらしいです。 なので、API Gatewayで設定を行って、カスタムなステータスコードを返せるようにしましょう! はじめに 先ほども書いたのですが、エラーのレスポンスは以下のようにして返します。 const myErrorObj = { errorType : "Page not found", httpStatus : 404, } return callback(JSON.stringify(myErrorObj)); ただ、今はどうやらこの形式は推奨されていないようです。 公式ドキュメントのリンクを載せますので、気になる方はこちらのドキュメントに従って作成して下さい。 ・API Gateway で Lambda エラーを処理する また、API GatewayとLambda関数の紐づけ方法は、下記の記事でご紹介しているので、Lambda関数へのアタッチ方法が分からない方はこちらをご覧ください。 【AWS初心者でも分かりやすい】Lambdaで作成した関数をAPI Gatewayでアタッチする方法 今回、こちらの説明は致しませんのでご了承ください。 API Gatewayの設定 そしたら、カスタムなステータスコードを受け取るために、API Gatewayで設定を行っていきます。 まず、API Gatewayのコンソール画面を開いてください。 メソッドレスポンス 次に使用するAPIの設定画面に行きます。 このようなパスが表示されていると思います。 そしたらカスタムなステータスコードを返したいパス、およびメソッドを選択。 メソッドレスポンスの設定画面へ行き、下の画像のようにステータスコードとヘッダーを追加してください。 ステータスはご自身の用途に合わせて変えて下さい。今回は404とします。 ヘッダーはAccess-Control-Allow-Originを入力。 これだけでは、カスタムなステータスコードは返せないのでご注意ください。 メソッドレスポンスの設定は以上になります。 総合レスポンス 次に、先ほど作成したメソッドレスポンスがしっかりと反応するように、総合レスポンスで設定を行っていきます。 総合レスポンスの設定画面へ。 そしたら、まずは下の画像のようにLambdaエラーの正規表現に、.*"httpStatus" *: *404.*を追加。ステータスコードの404は、ご自身の用途に合わせ適時変更してください。 これは、冒頭で説明したエラーオブジェクトのKey(httpStatus)を基準に判断を行っています。また、Valueが404のときにステータスコード404を返すようにしています。 次は、ヘッダーの設定。 特定のドメインとしか通信を行いたくない場合は、そのURLをご入力ください。 最後にマッピングテンプレートの設定を行います。 このようにContent-typeにapplication/jsonと設定。 テンプレートは以下をコピペ。 #set($errorObj = $util.parseJson($input.path('$.errorMessage'))) { "message" : "$errorObj.errorType", "statusCode": 404 } あとは保存を忘れずに。 テスト メソッドの設定画面から、画像の上の方にあるテストをししてみてください。 指定したステータスコードが返ってくればOKです! APIのデプロイも忘れずに!!! このようにしてカスタムなステータスコードを返すことができます! 意外と時間が掛かったので、次からは時間を掛けずにやります。。。 以上、「【AWS】API Gatewayでカスタムなステータスコードを返す方法」でした! Thank you for reading
- 投稿日:2021-06-20T14:37:36+09:00
無駄なコストを抑える!CloudWatch EventsでEC2を停止する方法
CloudWatch Eventsのルールで、時間になったらEC2を停止させる きっかけ 前回初学者だからこそ、とんでもない請求が来る前にAWSでやっておくべき転ばぬ先の請求アラートを書かせていただきましたが、そもそもEC2インスタンスを消し忘れないような仕組みを設定できれば、無駄なコストもかからないかと思いましたので記事にしていきます。 自動起動は別の記事で書いていきたいと思います。 1.CloudWatchのルールを選択する 1.AWSマネジメントコンソールから CloudWatchを検索 2.イベント>ルール の画面を開き「ルールの作成」を押下します 2.CloudWatch Eventsのルール作成 1.①側:Cron式を記載する 2.1.1 Cron式の構文の基本的な書き方 名称 値 Wildcards 分 0-59 , - * / 時 0-23 , - * / 日 1-31 , - * ? / L W 月 1-12 or JAN-DEC , - * / 曜日 1-12 or SUN-SAT , - * ? L #` 年 1970-2199 , - * / ※日 と 曜日 の両方に値 ( * 含む) を指定することはできない。どちらかに値を指定したら、もう片方には ? を記述する。 ※AWS Cron式のタイムゾーンはグリニッジ標準時(GMT)での設定になるため、作成したい時間から値を設定してください(日本(JST)であれば、-9時間すればOK) ※時差計算を確認したい人用のリンクです 例1)日本(JST)で毎年月曜から金曜の毎月毎日 18:00(18-9=9) に実行 →0 9 ? * MON-FRI * 例2)日本(JST)で毎年毎週毎月毎日 9:00(9-9=0) に実行 →0 0 * * ? * 例3)日本(JST)で今年土曜から日曜日の毎月毎日(?)22:00(22-9=13)に実行 →0 13 ? 6-12 1,7 2021 2.②側:ターゲット(今回の場合は、停止させたいEC2)のインスタンスIDを記述する EC2インスタンスに付与されているIDを入力します 3.②側:ロールの作成 CloudWatch Eventsから、EC2 インスタンスに対してアクションを実行するために権限(ロール)が必要になってくるため、作成していない場合はロールを作成して許可を付与していきます。 3.CloudWatch Eventsのルールの詳細を設定する 1.名前と説明、状態(有効化するか)を記述して、ルールの作成を押下 4.CloudWatch Eventsのルールの詳細を確認する 1.作成したルールが表示されていることを確認する 選択することでルールの詳細の確認もすることが出来ます おわりに 前回きっかけにも記載しましたが、今後もAWSを学習したい人は増えていくのかなと勝手に想像しています。 学ぶためにハンズオンは必要になってきますが、『見様見真似で作ったはいいけど放置してXXX万円』など笑い事ではいられない話が、あなたの挑戦する心をへし折るキッカケにならないようにと思って、無駄なコストを抑える!を記載させていただきました。 参考 ・Cronの詳しい説明について AWS公式HPリンク Schedule Expressions for Rules AWS公式HPリンク Rate または Cron を使用したスケジュール式 ・学習のきっかけとなったもの この記事はAWS初学者を導く体系的な動画学習サービス AWS Cloud Techでの学びをベースにして作成しております。
- 投稿日:2021-06-20T14:27:32+09:00
LaravelでAWS SDKのS3を扱う
LaravelでS3を使うには AWS SDKを使う Flysystemを使う のどちらかになると思います。 とりあえず今回はSDKを使います。 AWS SDK composerでの導入 composer require aws/aws-sdk-php でSDKを導入します。 .envファイルに環境変数の設定 コード上にわざわざ接続情報を書く必要はありません。 環境変数から自動的に持ってきてくれるので、指定された環境変数名に キー情報を記載しておきます。 AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY S3への処理を書く 後はS3Clientを使って好きに操作することが可能です。 use Aws\S3\S3Client; ... $s3 = new S3Client([ 'version' => 'latest', 'region' => 'us-east-2' ]); $result = $s3->listObjects();
- 投稿日:2021-06-20T13:42:28+09:00
一週間前に初めてAWSにアクセスした初学者がまとめるAWSでアプリをデプロイするときに使う用語備忘録
はじめに 物の本によると「備忘録」とは「忘れた時のために要点を書きしるしたもの」を指すそうです。 本記事は一週間前に初めてAWSにアクセスした初学者が、無数に飛び交う未知の横文字を書き留めた備忘録です。 各用語に関する説明は私でも理解できるように離乳食レベルまで噛み砕いていますが、不十分であったり誤っている可能性が往々にしてあります。そうした場合は、コメントにて訂正や補足をしていただけると幸いです。 用語一覧 VPC Virtual Private Cloudの略です。サーバーやネットワーク機器などを物理的な機器ではなく、仮想空間上でネットワークを構築するものです。 EC2 Elastic Computer Cloudの略です。CPUやメモリなどが備え付けてある仮想サーバーです。LinuxやWindowsなどのOSをインストールすることもできます。 サブネット VPC内におけるグループのことです。外部に公開するもの(public)としないもの(private)で分けるために使います。 Webサーバー ブラウザやアプリからのリクエストに対し、HTMLやRubyの実行結果を返すサーバーです。ちなみにサーバーはServer(提供者)という意味です。ラテン語で奴隷を意味するservusから来ているそうです。 踏み台サーバー インターネットからVCP内のリソースに接続するため経由するサーバーです。AWS公式ではbastion(要塞)と呼ばれていますが、いまいちピンときません。 インターネットゲートウェイ VPC内のネットワークとインターネットを繋ぐ門のようなものです。 NATゲートウェイ privateなサブネットから外部のインターネットに繋ぐ門です。NAT(ネットワークアドレス変換)を行うことで、外部からはアクセスさせないようになっています。 ルートテーブル サブネット間やゲートウェイ間の通信経路のことです。 セキュリティグループ 外部からのアクセスを制限するグループ分けのことです。ポート番号、IPアドレスで制限することができます。 ロードバランサー Webサーバーの負担を減らすために複数のWebサーバーにリクエストを分散するものです。他にもSSLで暗号化された処理を元に戻したり、不正リクエストに対応したりする機能を持ちます。 Amazon RDS Relational Database Serviceの略です。関連した複数のテーブルでデータを管理するRDB(MySQLやSQLiteなど)を複雑な手続きなしで利用できるサービスです。 Amazon EBS Elastic Block Storeの略です。Amazonが提供する、データを長期保存するためのストレージです。EBSなんて縁起の良さそうな名前ですね。 S3 Simple Storage Serviceの略です。EBSよりシンプルかつ低コストで利用できるストレージです。 ドメイン名 特定のサーバーを識別するためのIPアドレスを分かりやすくした住所のようなものです。URLにおけるhogehoge.comの部分です。ちなみにwwwの部分はホスト名です。 DNS Domain Name Systemの略です。ドメイン名からIPアドレスに変換し、サーバーを特定する仕組みのことです。 Route 53 AWSにおいてDNSの役割を果たすサービスです。ちなみにRoute 66はアメリカを横断する重要な旧国道ですが、本サービスとは無関係のようです。 Amazon SES Simple Email Serviceの略です。Amazonが提供する、メールの送受信を行う機能を持つサービスです。 キャッシュ アプリの性能を向上させるための仕組みです。時間のかかる処理によるデータ保存することで、同じ処理を行う際に素早く結果を返すことができます。 Amazon ElastiCache RedisやMemcachedといったキャッシュが導入された、Amazonが提供するサービスです。 終わりに 以上がAWSでポートフォリオをデプロイするときに使う用語一覧です。まだAWSに触れはじめて間もないので、新たな用語と出会ったり、付け足したくなれば追記していきます。
- 投稿日:2021-06-20T13:27:11+09:00
mysql2をbundle installできないし、brew info opensslでも解決できない
どうしたの? 状況: - Gemfileにmysql2をbundle installしようとしたところで、インストールエラーが発生。 やりたいこと: - デプロイ用のDBをPostgreSQLからMySQLに変更したく、まずはGemをインストールしたい。 環境: - Rails 6.0.2 - Ruby 2.6.5 - gem mysql2(バージョン指定なし) - AWSのEC2インスタンス内で操作(SSHを使用してインスタンスに接続) もう少し説明 mysql2 gemをGemfileに記述し、bundle installをすると以下が発生 ターミナル $ bundle Your Gemfile lists the gem devise (>= 0) more than once. You should probably keep only one of them. Remove any duplicate entries and specify the gem only once. While it's not a problem now, it could cause errors if you change the version of one of them later. Your Gemfile lists the gem omniauth-google-oauth2 (>= 0) more than once. You should probably keep only one of them. Remove any duplicate entries and specify the gem only once. While it's not a problem now, it could cause errors if you change the version of one of them later. Your Gemfile lists the gem dotenv-rails (>= 0) more than once. You should probably keep only one of them. Remove any duplicate entries and specify the gem only once. While it's not a problem now, it could cause errors if you change the version of one of them later. Fetching gem metadata from https://rubygems.org/............ Resolving dependencies... Using rake 13.0.1 Using concurrent-ruby 1.1.6 Using i18n 1.8.3 Using minitest 5.14.1 Using thread_safe 0.3.6 Using tzinfo 1.2.7 Using zeitwerk 2.3.0 Using activesupport 6.0.3.1 Using builder 3.2.4 Using erubi 1.9.0 Using mini_portile2 2.4.0 Using nokogiri 1.10.9 Using rails-dom-testing 2.0.3 Using crass 1.0.6 Using loofah 2.6.0 Using rails-html-sanitizer 1.3.0 Using actionview 6.0.3.1 Using rack 2.2.3 Using rack-test 1.1.0 Using actionpack 6.0.3.1 Using nio4r 2.5.2 Using websocket-extensions 0.1.5 Using websocket-driver 0.7.2 Using actioncable 6.0.3.1 Using globalid 0.4.2 Using activejob 6.0.3.1 Using activemodel 6.0.3.1 Using activerecord 6.0.3.1 Using mimemagic 0.3.10 Using marcel 0.3.3 Using activestorage 6.0.3.1 Using mini_mime 1.0.2 Using mail 2.7.1 Using actionmailbox 6.0.3.1 Using actionmailer 6.0.3.1 Using actiontext 6.0.3.1 Using arbre 1.2.1 Using formtastic 3.1.5 Using formtastic_i18n 0.6.0 Using has_scope 0.7.2 Using method_source 1.0.0 Using thor 1.0.1 Using railties 6.0.3.1 Using responders 3.0.1 Using inherited_resources 1.11.0 Using jquery-rails 4.4.0 Using kaminari-core 1.2.1 Using kaminari-actionview 1.2.1 Using kaminari-activerecord 1.2.1 Using kaminari 1.2.1 Using polyamorous 2.3.2 Using ransack 2.3.2 Using ffi 1.13.1 Using sassc 2.4.0 Using sprockets 4.0.2 Using sprockets-rails 3.2.1 Using tilt 2.0.10 Using sassc-rails 2.1.2 Using activeadmin 2.7.0 Using execjs 2.7.0 Using autoprefixer-rails 9.7.6 Using bcrypt 3.1.13 Using bindex 0.8.1 Using msgpack 1.3.3 Using bootsnap 1.4.6 Using popper_js 1.16.0 Using bootstrap 4.5.0 Using bundler 2.2.20 Using byebug 11.1.3 Using coderay 1.1.3 Using orm_adapter 0.5.0 Using warden 1.2.8 Using devise 4.7.2 Using dotenv 2.7.6 Using dotenv-rails 2.7.6 Using multipart-post 2.1.1 Using faraday 1.0.1 Using hashie 4.1.0 Using jbuilder 2.10.0 Using jwt 2.2.1 Using kgio 2.11.4 Using libv8 7.3.492.27.1 (x86_64-linux) Using rb-fsevent 0.10.4 Using rb-inotify 0.10.1 Using ruby_dep 1.5.0 Using listen 3.1.5 Using mini_racer 0.2.14 Using multi_json 1.14.1 Using multi_xml 0.6.0 Fetching mysql2 0.5.3 Installing mysql2 0.5.3 with native extensions Gem::Ext::BuildError: ERROR: Failed to build gem native extension. current directory: /home/tako_zhangyu/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3/ext/mysql2 /home/tako_zhangyu/.rbenv/versions/2.6.5/bin/ruby -I /home/tako_zhangyu/.rbenv/versions/2.6.5/lib/ruby/2.6.0 -r ./siteconf20210620-23114-pervwr.rb extconf.rb --with-ldflags\=-L/usr/local/opt/openssl@1.1/lib --with-cppflags\=-I/usr/local/opt/openssl@1.1/include checking for rb_absint_size()... yes checking for rb_absint_singlebit_p()... yes checking for rb_wait_for_single_fd()... yes checking for -lmysqlclient... no ----- mysql client is missing. You may need to 'sudo apt-get install libmariadb-dev', 'sudo apt-get install libmysqlclient-dev' or 'sudo yum install mysql-devel', and try again. ----- *** extconf.rb failed *** Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options. Provided configuration options: --with-opt-dir --without-opt-dir --with-opt-include --without-opt-include=${opt-dir}/include --with-opt-lib --without-opt-lib=${opt-dir}/lib --with-make-prog --without-make-prog --srcdir=. --curdir --ruby=/home/tako_zhangyu/.rbenv/versions/2.6.5/bin/$(RUBY_BASE_NAME) --with-mysql-dir --without-mysql-dir --with-mysql-include --without-mysql-include=${mysql-dir}/include --with-mysql-lib --without-mysql-lib=${mysql-dir}/lib --with-mysql-config --without-mysql-config --with-mysql-dir --without-mysql-dir --with-mysql-include --without-mysql-include=${mysql-dir}/include --with-mysql-lib --without-mysql-lib=${mysql-dir}/lib --with-mysqlclientlib --without-mysqlclientlib To see why this extension failed to compile, please check the mkmf.log which can be found here: /home/tako_zhangyu/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/extensions/x86_64-linux/2.6.0/mysql2-0.5.3/mkmf.log extconf failed, exit code 1 Gem files will remain installed in /home/tako_zhangyu/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3 for inspection. Results logged to /home/tako_zhangyu/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/extensions/x86_64-linux/2.6.0/mysql2-0.5.3/gem_make.out An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue. Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling. In Gemfile: mysql2 立ち向かう ひとまず以下のエラー文で検索をかけてみる Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling. 以下のコマンドで解決というような記事がたくさんあったが、まずssh内にbrewがなかったので実行できず ターミナル $ brew info openssl 以下コマンドでbrewをインストール ターミナル $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" PATHを2つ通す ターミナル $ echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> /home/tako_zhangyu/.bash_profile $ eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" Homebrewがインストールされているかを確認する意味を込めて以下を実行 ターミナル $ brew -v Homebrew 3.1.12 バージョンが表示されたのでOK 以下を実行 ターミナル $ brew info openssl openssl@1.1: stable 1.1.1k (bottled) 表示された。 別ルートの解決 ここからは多くの記事のように以下コマンドを打つなどの解決策があると思いますが ターミナル $ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl@1.1/lib --with-cppflags=-I/usr/local/opt/openssl@1.1/include" なんやかんやで違うルートで解決したので記録します。 最初のエラー文の中にある以下の記述を実行してみる ----- mysql client is missing. You may need to 'sudo apt-get install libmariadb-dev', 'sudo apt-get install libmysqlclient-dev' or 'sudo yum install mysql-devel', and try again. ----- 結果的に有効だったのは以下コマンドのみ ターミナル $ sudo yum install mysql-devel 読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd 依存性の解決をしています 〜〜〜〜省略〜〜〜〜 インストール: mariadb-devel.x86_64 1:5.5.68-1.amzn2 依存性関連をインストールしました: mariadb-libs.x86_64 1:5.5.68-1.amzn2 完了しました! bundle installを実行 ターミナル $ bundle ~~~~省略~~~~ Bundle complete! 26 Gemfile dependencies, 109 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed. できた
- 投稿日:2021-06-20T13:27:11+09:00
mysql2をbundle installできないし、brew info opensslも動かない
どうしたの? 状況: - Gemfileにmysql2をbundle installしようとしたところで、インストールエラーが発生。 - ググると$ brew info opensslを勧められるも動かない やりたいこと: - デプロイ用のDBをPostgreSQLからMySQLに変更したく、まずはGemをインストールしたい。 環境: - Rails 6.0.2 - Ruby 2.6.5 - gem mysql2(バージョン指定なし) - AWSのEC2インスタンス内で操作(SSHを使用してインスタンスに接続) もう少し説明 mysql2 gemをGemfileに記述し、bundle installをすると以下が発生 ターミナル $ bundle Your Gemfile lists the gem devise (>= 0) more than once. You should probably keep only one of them. Remove any duplicate entries and specify the gem only once. While it's not a problem now, it could cause errors if you change the version of one of them later. Your Gemfile lists the gem omniauth-google-oauth2 (>= 0) more than once. You should probably keep only one of them. Remove any duplicate entries and specify the gem only once. While it's not a problem now, it could cause errors if you change the version of one of them later. Your Gemfile lists the gem dotenv-rails (>= 0) more than once. You should probably keep only one of them. Remove any duplicate entries and specify the gem only once. While it's not a problem now, it could cause errors if you change the version of one of them later. Fetching gem metadata from https://rubygems.org/............ Resolving dependencies... Using rake 13.0.1 Using concurrent-ruby 1.1.6 Using i18n 1.8.3 Using minitest 5.14.1 Using thread_safe 0.3.6 Using tzinfo 1.2.7 Using zeitwerk 2.3.0 Using activesupport 6.0.3.1 Using builder 3.2.4 Using erubi 1.9.0 Using mini_portile2 2.4.0 Using nokogiri 1.10.9 Using rails-dom-testing 2.0.3 Using crass 1.0.6 Using loofah 2.6.0 Using rails-html-sanitizer 1.3.0 Using actionview 6.0.3.1 Using rack 2.2.3 Using rack-test 1.1.0 Using actionpack 6.0.3.1 Using nio4r 2.5.2 Using websocket-extensions 0.1.5 Using websocket-driver 0.7.2 Using actioncable 6.0.3.1 Using globalid 0.4.2 Using activejob 6.0.3.1 Using activemodel 6.0.3.1 Using activerecord 6.0.3.1 Using mimemagic 0.3.10 Using marcel 0.3.3 Using activestorage 6.0.3.1 Using mini_mime 1.0.2 Using mail 2.7.1 Using actionmailbox 6.0.3.1 Using actionmailer 6.0.3.1 Using actiontext 6.0.3.1 Using arbre 1.2.1 Using formtastic 3.1.5 Using formtastic_i18n 0.6.0 Using has_scope 0.7.2 Using method_source 1.0.0 Using thor 1.0.1 Using railties 6.0.3.1 Using responders 3.0.1 Using inherited_resources 1.11.0 Using jquery-rails 4.4.0 Using kaminari-core 1.2.1 Using kaminari-actionview 1.2.1 Using kaminari-activerecord 1.2.1 Using kaminari 1.2.1 Using polyamorous 2.3.2 Using ransack 2.3.2 Using ffi 1.13.1 Using sassc 2.4.0 Using sprockets 4.0.2 Using sprockets-rails 3.2.1 Using tilt 2.0.10 Using sassc-rails 2.1.2 Using activeadmin 2.7.0 Using execjs 2.7.0 Using autoprefixer-rails 9.7.6 Using bcrypt 3.1.13 Using bindex 0.8.1 Using msgpack 1.3.3 Using bootsnap 1.4.6 Using popper_js 1.16.0 Using bootstrap 4.5.0 Using bundler 2.2.20 Using byebug 11.1.3 Using coderay 1.1.3 Using orm_adapter 0.5.0 Using warden 1.2.8 Using devise 4.7.2 Using dotenv 2.7.6 Using dotenv-rails 2.7.6 Using multipart-post 2.1.1 Using faraday 1.0.1 Using hashie 4.1.0 Using jbuilder 2.10.0 Using jwt 2.2.1 Using kgio 2.11.4 Using libv8 7.3.492.27.1 (x86_64-linux) Using rb-fsevent 0.10.4 Using rb-inotify 0.10.1 Using ruby_dep 1.5.0 Using listen 3.1.5 Using mini_racer 0.2.14 Using multi_json 1.14.1 Using multi_xml 0.6.0 Fetching mysql2 0.5.3 Installing mysql2 0.5.3 with native extensions Gem::Ext::BuildError: ERROR: Failed to build gem native extension. current directory: /home/tako_zhangyu/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3/ext/mysql2 /home/tako_zhangyu/.rbenv/versions/2.6.5/bin/ruby -I /home/tako_zhangyu/.rbenv/versions/2.6.5/lib/ruby/2.6.0 -r ./siteconf20210620-23114-pervwr.rb extconf.rb --with-ldflags\=-L/usr/local/opt/openssl@1.1/lib --with-cppflags\=-I/usr/local/opt/openssl@1.1/include checking for rb_absint_size()... yes checking for rb_absint_singlebit_p()... yes checking for rb_wait_for_single_fd()... yes checking for -lmysqlclient... no ----- mysql client is missing. You may need to 'sudo apt-get install libmariadb-dev', 'sudo apt-get install libmysqlclient-dev' or 'sudo yum install mysql-devel', and try again. ----- *** extconf.rb failed *** Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options. Provided configuration options: --with-opt-dir --without-opt-dir --with-opt-include --without-opt-include=${opt-dir}/include --with-opt-lib --without-opt-lib=${opt-dir}/lib --with-make-prog --without-make-prog --srcdir=. --curdir --ruby=/home/tako_zhangyu/.rbenv/versions/2.6.5/bin/$(RUBY_BASE_NAME) --with-mysql-dir --without-mysql-dir --with-mysql-include --without-mysql-include=${mysql-dir}/include --with-mysql-lib --without-mysql-lib=${mysql-dir}/lib --with-mysql-config --without-mysql-config --with-mysql-dir --without-mysql-dir --with-mysql-include --without-mysql-include=${mysql-dir}/include --with-mysql-lib --without-mysql-lib=${mysql-dir}/lib --with-mysqlclientlib --without-mysqlclientlib To see why this extension failed to compile, please check the mkmf.log which can be found here: /home/tako_zhangyu/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/extensions/x86_64-linux/2.6.0/mysql2-0.5.3/mkmf.log extconf failed, exit code 1 Gem files will remain installed in /home/tako_zhangyu/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3 for inspection. Results logged to /home/tako_zhangyu/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/extensions/x86_64-linux/2.6.0/mysql2-0.5.3/gem_make.out An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue. Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling. In Gemfile: mysql2 立ち向かう ひとまず以下のエラー文で検索をかけてみる Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling. 以下のコマンドで解決というような記事がたくさんあったが、まずssh内にbrewがなかったので実行できず ターミナル $ brew info openssl 以下コマンドでbrewをインストール ターミナル $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" PATHを2つ通す ターミナル $ echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> /home/tako_zhangyu/.bash_profile $ eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" Homebrewがインストールされているかを確認する意味を込めて以下を実行 ターミナル $ brew -v Homebrew 3.1.12 バージョンが表示されたのでOK 以下を実行 ターミナル $ brew info openssl openssl@1.1: stable 1.1.1k (bottled) 表示された。 別ルートの解決 ここからは多くの記事のように以下コマンドを打つなどの解決策があると思いますが ターミナル $ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl@1.1/lib --with-cppflags=-I/usr/local/opt/openssl@1.1/include" なんやかんやで違うルートで解決したので記録します。 最初のエラー文の中にある以下の記述を実行してみる ----- mysql client is missing. You may need to 'sudo apt-get install libmariadb-dev', 'sudo apt-get install libmysqlclient-dev' or 'sudo yum install mysql-devel', and try again. ----- 結果的に有効だったのは以下コマンドのみ ターミナル $ sudo yum install mysql-devel 読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd 依存性の解決をしています 〜〜〜〜省略〜〜〜〜 インストール: mariadb-devel.x86_64 1:5.5.68-1.amzn2 依存性関連をインストールしました: mariadb-libs.x86_64 1:5.5.68-1.amzn2 完了しました! bundle installを実行 ターミナル $ bundle ~~~~省略~~~~ Bundle complete! 26 Gemfile dependencies, 109 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed. できた
- 投稿日:2021-06-20T10:25:08+09:00
AWS EC2のEBSボリューム拡張 (Amazon Linux 2)
はじめに AWSでEC2のインスタンスを作成する際、EBSのボリュームを使うことが多いかと思います。 インスタンスを運用しているうちに、EBSのボリュームを消費し、空き容量が不足することがあると思います。 そこで、EBSのボリュームを拡張し、空き容量を確保する方法をまとめます。 なお、ここでは、EC2作成時のイメージで、Amazon Linux 2を選択して作成したインスタンスでの方法をまとめています。 手順 空き容量の確認 dfコマンドで、パーティションの容量を調べます。 [user@host ~]$ df -h ファイルシス サイズ 使用 残り 使用% マウント位置 devtmpfs 960M 0 960M 0% /dev tmpfs 978M 0 978M 0% /dev/shm tmpfs 978M 18M 960M 2% /run tmpfs 978M 0 978M 0% /sys/fs/cgroup /dev/nvme0n1p1 20G 8.1G 12G 41% / tmpfs 196M 0 196M 0% /run/user/62100 tmpfs 196M 0 196M 0% /run/user/61000 /dev/nvme0n1p1 20G 8.1G 12G 41% / /dev/nvme0n1p1 が、EBSのボリュームです。 この例では、20GB中8GBを使っています。 ここでは、 AWSマネジメントコンソールでEBS拡張 マネジメントコンソールで、EC2を開き、左ペインのボリュームを選択、右側のリストから拡張したいボリュームを選択(チェック)します。 続いて、アクション→ボリュームの変更を選択します。 ボリュームのサイズを変更し、「変更」ボタンで保存します。 ※ここでは、もともと20GBだったものを、50GBに拡張します。 SSHでインスタンスにログインし、拡張 パーティションの確認 [user@host ~]$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT nvme0n1 259:0 0 50G 0 disk ├─nvme0n1p1 259:1 0 20G 0 part / └─nvme0n1p128 259:2 0 1M 0 part [user@host ~]$ df -h ファイルシス サイズ 使用 残り 使用% マウント位置 devtmpfs 960M 0 960M 0% /dev tmpfs 978M 0 978M 0% /dev/shm tmpfs 978M 18M 960M 2% /run tmpfs 978M 0 978M 0% /sys/fs/cgroup /dev/nvme0n1p1 20G 8.1G 12G 41% / tmpfs 196M 0 196M 0% /run/user/62100 tmpfs 196M 0 196M 0% /run/user/61000 まだ拡張されていない様子です。 growpartコマンド [user@host ~]$ sudo growpart /dev/nvme0n1 1 CHANGED: partition=1 start=4096 old: size=41938911 end=41943007 new: size=104853471 end=104857567 xfs_growfsコマンド [user@host ~]$ sudo xfs_growfs /dev/nvme0n1p1 meta-data=/dev/nvme0n1p1 isize=512 agcount=26, agsize=524159 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1 spinodes=0 data = bsize=4096 blocks=13106683, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 data blocks changed from 5242363 to 13106683 パーティション確認 [user@host ~]$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT nvme0n1 259:0 0 50G 0 disk ├─nvme0n1p1 259:1 0 50G 0 part / └─nvme0n1p128 259:2 0 1M 0 part [user@host ~]$ df -h ファイルシス サイズ 使用 残り 使用% マウント位置 devtmpfs 960M 0 960M 0% /dev tmpfs 978M 0 978M 0% /dev/shm tmpfs 978M 18M 960M 2% /run tmpfs 978M 0 978M 0% /sys/fs/cgroup /dev/nvme0n1p1 50G 8.1G 42G 17% / tmpfs 196M 0 196M 0% /run/user/62100 tmpfs 196M 0 196M 0% /run/user/61000 これで、/dev/nvme0n1p1が50GBに拡張されました。
- 投稿日:2021-06-20T09:56:04+09:00
AWSのアカウント作成
前提 無料枠を使い切ったので解約して新しくAWSアカウントを作成します 用意するもの メールアドレスとパスワード クレカかデビットカード スマホ(認証するので) パスワードにする文字列を考えておく メモちょう 手順 ①既存のAWSアカウントを解約する(必要なら残しておく) ②新しくAWSアカウントを作成する クレカ情報・住所氏名・パスワード ③作成できたらログインして請求アラートが届くようにする ④ルートアカウントにMFAを設定する スマホのアプリに現れた最初の文字列を入力 ↓ スマホの画面を凝視して30秒更新後の文字列を入力する ⑤IAMユーザを作成する。AdministratorAccessを割り当てる ⑥ルートのアカウント情報から、IAMユーザで請求情報が見られるようにする。 また、USDからJPYに請求の表示を変更する(見やすいので) 所感 はじめてAWSでMFA認証を設定した。
- 投稿日:2021-06-20T08:12:23+09:00
AWS EC2にDocker ComposeでJenkinsを導入
事前準備 AWS EC2にDocker ComposeでRedmineを導入 の続きとなります。 作業ディレクトリに移動 [ec2-user@ip-xxx-xx-xx-xxx container01]$ cd /home/docker/container01 今回は試すにあたり、AWS EC2にDockerでJenkinsを導入 を参照させて頂きました。 Jenkinsのベースイメージには「jenkins:jenkins:latest」を指定 portsには3001番ポートを指定 version: '3.9' services: #前回の続きのため、Redmine, MySQL部分のコンテナ設定は割愛 jenkins: image: jenkins:jenkins:latest container_name: jenkins restart: always ports: - 3001:8080 environment: JENKINS_OPTS: '--prefix=/jenkins' volumes: - /var/www/jenkins/home:/var/jenkins_home volumes: mysql-data: name: mysql-redmine Jenkinsディレクトリ権限を変更 su権限にて、mkdirコマンドで/var/www/jenkins/homeを作成しておきます。 [ec2-user@ip-xxx-xx-xx-xxx www]$ ll total 0 drwxr-xr-x 3 root root 18 Jun 18 21:33 jenkins drwxr-xr-x 6 root root 59 Jun 12 00:59 redmine [ec2-user@ip-xxx-xx-xx-xxx www]$ sudo chown -R 1000:1000 jenkins [ec2-user@ip-xxx-xx-xx-xxx www]$ ll total 0 drwxr-xr-x 3 ec2-user ec2-user 18 Jun 18 21:33 jenkins drwxr-xr-x 6 root root 59 Jun 12 00:59 redmine [ec2-user@ip-xxx-xx-xx-xxx www]$ cd jenkins/ [ec2-user@ip-xxx-xx-xx-xxx jenkins]$ ll total 0 drwxr-xr-x 2 ec2-user ec2-user 6 Jun 18 21:33 home docker-composeコマンドを実行し、Dockerコンテナ(複数)をバックグラウンド起動 [ec2-user@ip-xxx-xx-xx-xxx container01]$ docker-compose up -d Pulling jenkins (jenkins/jenkins:latest)... latest: Pulling from jenkins/jenkins d960726af2be: Pull complete 971efeb01290: Pull complete 63355dfa68bf: Pull complete 0338c2e2964b: Pull complete 4fd60233bacd: Pull complete 0607cfd712b0: Pull complete c344ff771a55: Pull complete 99ba4b8ae29b: Pull complete 44de4b7a26bd: Pull complete 67c453bade0a: Pull complete 34cb611cbe79: Pull complete f30d6e8e3564: Pull complete 64e03652f7ea: Pull complete 70430e736ff5: Pull complete f89c7041f1b4: Pull complete ed60ce178bf3: Pull complete Digest: sha256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Status: Downloaded newer image for jenkins/jenkins:latest Starting mysql ... done Creating jenkins ... done Starting redmine ... done [ec2-user@ip-xxx-xx-xx-xxx container01]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 16e8d79e89d1 jenkins/jenkins:latest "/sbin/tini -- /usr/…" About a minute ago Up About a minute 50000/tcp, 0.0.0.0:3001->8080/tcp jenkins 5d96ebfc23a2 redmine:passenger "/docker-entrypoint.…" 6 days ago Up About a minute 0.0.0.0:3000->3000/tcp redmine be9531f677b2 mysql:5.7 "docker-entrypoint.s…" 6 days ago Up About a minute 3306/tcp, 33060/tcp mysql コンテナの状態を確認 [ec2-user@ip-xxx-xx-xx-xxx container01]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 16e8d79e89d1 jenkins/jenkins:latest "/sbin/tini -- /usr/…" About a minute ago Up About a minute 50000/tcp, 0.0.0.0:3001->8080/tcp jenkins 5d96ebfc23a2 redmine:passenger "/docker-entrypoint.…" 6 days ago Up About a minute 0.0.0.0:3000->3000/tcp redmine be9531f677b2 mysql:5.7 "docker-entrypoint.s…" 6 days ago Up About a minute 3306/tcp, 33060/tcp mysql Jenkins向けにEC2のポートを開放 作成した「docker-compose.yml」ではポート3001番を指定したため、EC2の「セキュリティグループ」を表示してインバウンドルールに3001番ポートを追加する必要があります。 Jenkinsにアクセス ブラウザを起動し、 http://[Elastic IP アドレス]:3001/jenkins/ にアクセスする。 以降、その後の画面遷移を参考としてキャプションを残しておきます。 ① 初回アクセス時の画面 コピペ用コマンド:cat /var/www/jenkins/home/secrets/initialAdminPassword ② Customize Jenkins画面 「Select plugins to install」を選択し、任意のpluginsを選択する。 ③ Getting Started画面 ④ Create First Admine User画面 ⑤ Jenkinsへようこそ!画面が表示されれば完了 次回の予定 AWS EC2にDocker ComposeでGitlabを導入する記事を投稿予定。
- 投稿日:2021-06-20T07:11:49+09:00
AWS EC2にDocker ComposeでRedmineを導入
事前準備 AWS EC2にDockerでDocker Compose(1.29.2)を導入 を参照してDocker Composeを利用できる環境を準備しておきます。 作業ディレクトリに移動 [ec2-user@ip-xxx-xx-xx-xxx container01]$ cd /home/docker/container01 docker-compose.ymlを作成 作成したdocker-compose.ymlは以下に配置。 /home/docker/container01 ├ docker-compose.yml 今回も試すにあたり、AWS EC2にDockerでRedmineを導入 を参照させて頂きました。 コンテナはRedmine、MySQLを分けてymlファイルを作成 Redmineのベースイメージには「redmine:passenger」(※1)を指定 portsには3000番ポートを指定 volumesにはコンテナ破棄とともにデータが失われないように、外部マウント先(コンテナ外)のストレージに保存 MySQLのベースイメージには「mysql:5.7」を指定(執筆時点の最新) ※1 Phusion Passenger(非公式にはmod_railsとmod_rackともいう)は、Apache上でRedmaine等Ruby on Railsアプリケーションを実行するためのソフトウェア version: '3.9' services: redmine: image: redmine:passenger container_name: redmine ports: - 3000:3000 environment: TZ: Asia/Tokyo REDMINE_DB_MYSQL: mysql REDMINE_DB_DATABASE: redmine REDMINE_DB_USERNAME: redmine REDMINE_DB_PASSWORD: redmine REDMINE_DB_ENCODING: utf8 depends_on: - mysql restart: always volumes: - /var/www/redmine/files:/usr/src/redmine/files - /var/www/redmine/log:/usr/src/redmine/log - /var/www/redmine/plugins:/usr/src/redmine/plugins - /var/www/redmine/public/themes:/usr/src/redmine/public/themes mysql: image: mysql:5.7 container_name: mysql restart: always environment: TZ: Asia/Tokyo MYSQL_ROOT_PASSWORD: devops MYSQL_DATABASE: redmine MYSQL_USER: redmine MYSQL_PASSWORD: redmine volumes: - mysql-data:/var/lib/mysql command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci volumes: mysql-data: name: mysql-redmine docker-composeコマンドを実行し、Dockerコンテナ(複数)をバックグラウンド起動 [ec2-user@ip-xxx-xx-xx-xxx container01]$ docker-compose up -d Creating network "container01_default" with the default driver Creating volume "mysql-redmine" with default driver Pulling mysql (mysql:5.7)... 5.7: Pulling from library/mysql 69692152171a: Pull complete 1651b0be3df3: Pull complete 951da7386bc8: Pull complete 0f86c95aa242: Pull complete 37ba2d8bd4fe: Pull complete 6d278bb05e94: Pull complete 497efbd93a3e: Pull complete a023ae82eef5: Pull complete e76c35f20ee7: Pull complete e887524d2ef9: Pull complete ccb65627e1c3: Pull complete Digest: sha256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Status: Downloaded newer image for mysql:5.7 Pulling redmine (redmine:passenger)... passenger: Pulling from library/redmine 69692152171a: Already exists 0a1f774fea41: Pull complete 3b32b9ebaa42: Pull complete 8115e4beca50: Pull complete f6fc87221cc8: Pull complete fecc3ffdf342: Pull complete 2c0766a9fc7f: Pull complete ce9a5ea49a97: Pull complete 3e4aa5d089ef: Pull complete 76af3ce3b4e9: Pull complete 996a27fc010d: Pull complete 343439c2257c: Pull complete c3f9dc058e2a: Pull complete e46a18da2156: Pull complete Digest: sha256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Status: Downloaded newer image for redmine:passenger Creating mysql ... done Creating redmine ... done コンテナの状態を確認 [ec2-user@ip-xxx-xx-xx-xxx container01]$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5d96ebfc23a2 redmine:passenger "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 0.0.0.0:3000->3000/tcp redmine be9531f677b2 mysql:5.7 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 3306/tcp, 33060/tcp mysql MySQLのコンフィグを設定 [ec2-user@ip-xxx-xx-xx-xxx container01]$ sudo docker exec -it mysql mysql_config_editor set --host=localhost --user=redmine --password Enter password: ←★任意のパスワードを入力 Redmine向けにEC2のポートを開放 作成した「docker-compose.yml」ではポート3000番を指定したため、EC2の「セキュリティグループ」を表示してインバウンドルールに3000番ポートを追加する必要があります。 Redmineにアクセス ブラウザを起動し、 http://[Elastic IP アドレス]:3000 にアクセスする。 以下のようにRedmine画面が表示されれば完了。 次回の予定 AWS EC2にDocker ComposeでJenkinsを導入する記事を投稿予定。
- 投稿日:2021-06-20T05:02:49+09:00
【EC2】WordPressを構築しよう sec7前半
目的 前半:WordPressの設定。 後半:なぜ「Wordpressが表示されるのか」紐解く。ネットワークがなぜ繋がるのか。TCP/IPについての学習を進める。 前半パート WordPress用のDBの設定 WordPressのインストール WordPressの設定 1. WordPress用のDBの設定 RDSの中にDBを作成 WordPressのDB用にMysqlのユーザーを作成 ユーザーに権限を付与 EC2にssh接続 → RDSのMysqlログイン MySQL [(none)]> CREATE DATABASE aws_and_infla DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; # DB作成コマンド、デフォルトの文字コードの設定、デフォルトの照合順序を設定 Query OK, 1 row affected, 2 warnings (0.02 sec) MySQL [(none)]> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | aws_and_infla | | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec) MySQL [(none)]> CREATE USER 'aws_and_infla'@'%' IDENTIFIED BY 'password'; Query OK, 0 rows affected (0.02 sec) # ユーザーの作成、@以降が接続先のホストを示し、%はどこでもOKという意味、接続時のパスワードを指定 MySQL [(none)]> GRANT ALL ON aws_and_infla.* TO 'aws_and_infla'@'%'; # 権限を付与する、aws_and_inflaDBの全てを操作できる、全てのテーブルを操作できる。 MySQL [(none)]> FLUSH PRIVILEGES; # 設定を反映 MySQL [(none)]> SELECT user, host FROM mysql.user; # 確認 +------------------+-----------+ | user | host | +------------------+-----------+ | aws_and_infla | % | | root | % | | mysql.infoschema | localhost | | mysql.session | localhost | | mysql.sys | localhost | | rdsadmin | localhost | +------------------+-----------+ 6 rows in set (0.00 sec) 2. WordPressのインストール ライブラリのインストール WordPressのダウンロード WordPressの解凍 WordPressのプログラムがアパッチから見える場所に配置 WordPressファイルの保有者・グループの設定 アパッチを再起動 sudo amazon-linux-extras install -y php7.2 # php7.2を指定してインストール sudo yum install -y php php-mbstring # php関連のライブラリをインストール wget https://ja.wordpress.org/latest-ja.tar.gz # URLを指定してファイルをダウンロードするコマンド tar xzvf latest-ja.tar.gz # gzファイルを解凍する sudo cp -r * /var/www/html/ # 現在のディレクト以下の"/var/www/html/"にコピーする。/var/www/html/はアパッチが参照するファイル sudo chown apache:apache /var/www/html -R # ファイルの所有者を変更、変更者と変更グループを変更、全てを指定。 sudo systemctl restart httpd.service # アパッチを再起動 3. WordPressの設定 ドメイン名から、WordPressを設定した。
- 投稿日:2021-06-20T00:26:39+09:00
AWS 認定 データベース – 専門知識 (AWS Certified Database - Specialty) に合格した
1. 初めに AWSエンジニアとしての自己研鑽の一環として、資格取得にチャレンジしている。データベースまわりの知識レベルが微妙なので、「AWS Certified Database - Specialty」にチャレンジしつつ基本的な知識習得を行うことにした。 資格取得前知識レベル: ちょっとしたWordpressとかRedmine用に、時々RDSを立てているくらいのレベル。 2. 勉強法 2.1 先人の体験記 まずは合格体験記で勉強の仕方の流れを確認するとともに、「自分も取るぞ」、というモチベーションを高めた。 AWS Certified Database – Specialty 合格までのお話 AWS Certified Database - Specialty 合格しました RDS、Aurora、DynamoDB あたりのよく使われるサービスをメインに、その他ElastiCache、NeptuneなどDB系一式も勉強しないといけなさそう、ということが分かった。 2.2 Exam Readiness: AWS Certified Database - Specialty 「Exam Readiness: AWS Certified Database - Specialty」 は、AWS(公式)が提供する、この認定試験についての出題範囲の説明サイト。ログインすれば誰でも見ることができる。コースの所要時間3.5時間ということで、気軽に始めてみる。 2021/5時点では、コンテンツが日本語されていないこともあり真剣に読むのもしんどいので、内容を流し読みした後、サンプル問題を解いて雰囲気を確認した。RDS、Aurora、DynamoDBあたりを頑張らないといけないことを再確認した。 2.3 Udemy 正攻法として、Udemyの講義系コンテンツを視聴して概要を理解後、練習問題系コンテンツをやって知識の確認、定着を図った。 [NEW] Ultimate AWS Certified Database Specialty 2021 講義系コンテンツは2021/5時点ではUdemyにはこれしかなさそう。 RDS, Auroraはもちろん、DocumentDB、Neptuneなどの新しめのサービスや、SCT、DMSなどの移行ツールの説明もあり、試験範囲が一通り網羅されている。 各サービス毎に簡単な確認問題あり。(この確認問題だけだとちょっと試験は厳しい) Practice Exam | AWS Certified Database Specialty 上の講義コンテンツの練習問題編。練習問題が65問。 各問題の解説(選択肢が正しい理由・間違っている理由)、AWSのドキュメントのどこを参照すればよいかなどの説明あり。 ほぼ間違えなくなるまで数回繰り返し実施。 AWS Certified Database Specialty Practice Exams 念のため別の問題集も実施した。100問収録。こちらも問題ごとにきちんとした解説あり。 2.4 実機確認 試験に出るとされるAWSサービスについて、普段あまり触っていないものを中心に、改めてチュートリアルレベルの動作検証を行い、どんなことができるかを確認した。 実機確認の効果として、作業時にマネコンの画面などを一通り見るので、どんな設定項目があるのか、どういう構成が取れるのかなどの理解を自然に深めることができた。 一部の検証結果については忘れないように Qiita 記事化した。 【初心者】Amazon Aurora Serverless (v1) を使ってみる 【初心者】Amazon Neptune を使ってみる 【初心者】Amazon DynamoDB LSI/GSI を使ってみる 【初心者】Amazon ElastiCache for Redis を使ってみる 【初心者】AWS Database Migration Service (DMS) を使ってみる 3. 受験 結果: 合格(780点) ※750点以上合格 結構ギリギリになってしまった(後数問間違えていたらダメだった)。「これ何言ってるか全然分からない」というのはあまりなく、割と自信を持って回答したつもりだったが、知識の精度不足があった。 4. 所感 目標準備期間2か月としていたが、結局2.5か月くらいかかってしまった。学習方法の効率化など引き続き模索したい。 この試験はあくまでデータベースのインフラ的な内容(バックアップ・リストア、障害対応、冗長化、暗号化など)を中心に問われるものであり、中身のデータの操作(SQL文など)はあまり問われず、その辺がそんなにできなくても資格は取れてしまうため、今一つ「データベースが使えます」と言える気にはなれていないが、基礎ができたと思って引き続き深堀できるようにしていきたい。
- 投稿日:2021-06-20T00:14:07+09:00
Xamarin.Forms+AppSync+Lambdaでデータを取得してみる
背景 昨年、Xamarin.FormsでKudanARアプリをリリースしました。 Xamarin.FormsでKudan ARを試してみる それから約1年が経過し、そろそろKudanARライブラリのAPIキーの使用期限が近づいています。 APIキーを切り替えるためだけに、都度アプリのリリースが必要になるのは面倒… そこで、KudanARライブラリのAPIキーのデータだけLambdaで管理するよう切り離し、AppSyncを経由して取得することにしました。 環境 主に使用したライブラリ バージョン Xamarin.Forms v5.0.0.2012 GraphQL.Client v3.2.4 GraphQL.Client.Serializer.Newtonsoft v3.2.4 主に使用したAWS機能 AppSync Lambda 作成したもの Lambdaからデータを返却し、AppSyncを経由してレスポンスを取得する点に焦点を当てたサンプルリポジトリを作成しました。 AWS側(AppSync、Lambda)に関してはREADME.mdに記載しています。 当記事では省略している箇所が多々あるので、詳細はこちらをご覧ください。 AppSyncDemo ソースコード このサンプルでは、AppSyncに定義されている変数のデータをすべて取得するGraphQLにて実行すると、以下のようなレスポンスが返却されます。 Lambda自体は、以下のGetSampleキーの値にあたる箇所を返却しています。 name="Xamarin"で実行した場合のAppSyncレスポンス { "data": { "GetSample": { "result": { "status_code": 200 }, "data": { "message": "Hello Xamarin!!!", "hoge": "abc", "fuga": "あいう", "piyo": "xyz", "foo": 123, "bar": 456 } } } } Lambdaの返却値の中で、必要なデータがmessageのみだった場合、以下のようにGraphQLを定義します。 GraphQLでは、行の先頭に#をつけると以降がコメント行になるので、コメント行を使用して不要な変数を除いても構いません。 フロントエンドで必要なデータを定義 query MyQuery($name: String) { GetSample(name: $name) { data { message } } } Modelクラスは、GraphQLに合わせて実装します。 今回はGraphQLのdataの内側部分のみを対象としたいと思います。 SampleModel.cs using System; using System.Collections.Generic; using System.Runtime.Serialization; using System.Text; namespace AppSyncDemo.Models { [DataContract] public class SampleModel { [DataMember(Name = "message")] public string Message { get; set; } } } 以下のソースは、GraphQLを読み込んで、Queryとして実行する処理を行います。 GraphQLは、AppSyncDemoプロジェクトのGraphQLsフォルダに、埋め込みリソースとして格納しています。 AppSyncService.cs using AppSyncDemo.Models; using GraphQL; using GraphQL.Client.Http; using GraphQL.Client.Serializer.Newtonsoft; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace AppSyncDemo.Services { public class AppSyncService { public static AppSyncService Instance { get; private set; } = new AppSyncService(); private GraphQLHttpClient GraphQLHttpClient { get; set; } public AppSyncService() { var options = new GraphQLHttpClientOptions { EndPoint = new Uri(ApiKey.AppSyncApiUrl), }; this.GraphQLHttpClient = new GraphQLHttpClient(options, new NewtonsoftJsonSerializer()); this.GraphQLHttpClient.HttpClient.DefaultRequestHeaders.Add("x-api-key", ApiKey.AppSyncApiKey); } public async Task<SampleModel> GetSampleAsync(string name) { var apiName = "GetSample"; var variables = new { name = name, }; var response = await ExecQueryAsync<SampleModel>(apiName, variables); return response; } /// <summary> /// Queryを実行する /// </summary> /// <typeparam name="T"></typeparam> /// <param name="apiName"></param> /// <param name="variables"></param> /// <returns></returns> public async Task<T> ExecQueryAsync<T>(string apiName, object variables) { try { // GraphQL取得 var resourceId = $"AppSyncDemo.GraphQLs.{apiName}.gql"; var query = await GetQueryAsync(resourceId); // リクエスト作成 var request = new GraphQLRequest { Query = query, OperationName = "MyQuery", Variables = variables, }; // Query実行 // Mutation実行の場合はSendMutationAsync()を使用 var response = await this.GraphQLHttpClient.SendQueryAsync<JObject>(request); // [apiName]から先が必要かどうかはレスポンスの構造に応じて変更する必要あり var json = response.Data[apiName]["data"].ToString(); var ret = JsonConvert.DeserializeObject<T>(json); return ret; } catch (Exception) { return default(T); } } /// <summary> /// GraphQLを取得 /// </summary> /// <param name="resourceId"></param> /// <returns></returns> private async Task<string> GetQueryAsync(string resourceId) { var assembly = Assembly.GetExecutingAssembly(); using (var stream = assembly.GetManifestResourceStream(resourceId)) using (var reader = new StreamReader(stream)) { return await reader.ReadToEndAsync(); } } } } 一通りの流れは以上です。 元々の目的は、APIキーのデータのみ取得だったので、AppSync経由ではなくAPI Gateway経由でもよかったのですが、あまり記事を見かけなかったので、AppSyncの記事を作成しました。 AppSyncの記事をあまり見かけなかった、というよりも、C#とAppSyncを使用した記事をあまり見かけなかった、と言った方が正確かもしれません。 そもそも、「APIキーを取得するAPI」というのがあまりよろしくなさそうな気はしていますが、その点についてはあまり考えないことにしました。 参考リンク sagulati/dotnet-lambda-refarch-imagerecognition C#で不定形JSONを自在に扱いたい
- 投稿日:2021-06-20T00:03:40+09:00
LINEで肌状態管理できるチャットボットを作る
スキンケアにハマって肌の水分量と油分量を計測するようになったので LINEのチャットボットで気軽に計測結果を記録できるチャットボットを作りました。 使い方 チャットボットに向かってユーザーが「登録」とメッセージを送ります。 「登録」という言葉に反応して、チャットボットが水分量と油分量を聞いてくれるので それに沿って回答していくと登録が完了します。 システム構成 Line Messaging APIからAPI GatewayへPOSTリクエストを送信 API Gatewayをトリガにして、Lambda関数が実行 Lambda関数からDynamoDBへの書き込みがされる 作成手順 1. DynamoDBでデータベースとテーブルを作成する 2. Lambda関数の設定 3. API Gatewayの設定 4. Line MessagingAPIの設定 1. DynamoDBでデータベースとテーブルを作成する 今までRDBしか使ったことがなかったのでテーブルとカラムの概念に苦戦しました。 (今でもあんまり理解していない) 以下で解説しますが、テーブルは2つ作成していて、 ①skinCheckテーブル…水分量と油分量を保持するテーブル ②userStateテーブル…ユーザーごとの登録ステータスを保持しているテーブル という使い分けをしています。 テーブル①skinCheckテーブル このテーブルでは日付>ユーザーごとに水分量と油分量を保持させています。 dateの中にskinInfoをMapで、その中にuseIdをMapで持っているので、 skinInfoの中に複数ユーザーが水分量と油分量を持つことができます。 テーブル②userStateテーブル このテーブルではユーザーごとの登録ステータスを保持しています。 登録ステータスとは何かというと、現在の登録状態をここでステータスとして管理しておくことで ユーザーがPOSTした値が水分量なのか、油分量なのかを判断して登録できるようにしています。 このチャットボットの中では、以下のようにステータス更新をしています。 ・水分量を質問する際にステータスをMに更新 ・油分量を質問する際にステータスをOに更新 ・油分量を回答した際にステータスをIに更新 2. Lambda関数の設定 LambdaからFunctionを立ち上げ関数を設定してあげます。 (Lambdaの作成方法、DynamoDBとの繋げ方は初心者の私でもよくわからないながらにググったらできたので、省略します。私はこちらの記事を参考にしました。) lambda_functuin.pyを編集します。 テーブル名とLINEMessagingAPIのトークンだけ書き換える必要があります。 import json from decimal import Decimal import boto3 import urllib.request from datetime import datetime,timezone,timedelta from boto3.dynamodb.conditions import Attr from boto3.dynamodb.conditions import Key #変数定義 dynamodb = boto3.resource('dynamodb') table = dynamodb.Table("①テーブル名") stateTable = dynamodb.Table("②テーブル名") JST = timezone(timedelta(hours=+9), 'JST') sysdate = datetime.now(JST) strSysdate = sysdate.strftime('%Y/%m/%d') def decimal_default_proc(obj): if isinstance(obj, Decimal): return float(obj) raise TypeError # テーブルスキャン def operation_scan(): scanData = table.scan() items=scanData['Items'] print(items) return scanData def lambda_handler(event, context): print("Received event: " + json.dumps(event)) scan_data = operation_scan() print(event) req_events = json.loads(event['body'])['events'] print(req_events) for message_event in req_events : url = 'https://api.line.me/v2/bot/message/reply' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + 'LINEMessagingAPIのチャンネルアクセストークン' } #textパスを定義 text = message_event['message']['text'] res_text = "test" #メッセージからユーザーIDを取得して変数に代入 userID userId = message_event['source']['userId'] #同一日付のレコードがない場合には作成する checkDate = table.get_item( Key={ 'date':strSysdate } ) print(checkDate) #メッセージに「登録」が含まれる場合 if "登録" in text: if sysdate not in checkDate: print("レコード作るよ") table.put_item( Item = { 'date': strSysdate, 'skinInfo':{} } ) else: print("もうレコードあったにゃん") #水分量を質問する res_text = "水分量を入力してください。" #ステータスをMに更新する stateTable.put_item( Item = { 'userId': message_event['source']['userId'], 'state' : 'M' } ) #テーブルにレコードを追加(dateとuserIdのみ) put_table = table.update_item( Key = {'date':strSysdate}, UpdateExpression = 'set skinInfo.'+userId+' = :userSkinInfo', ExpressionAttributeValues = {':userSkinInfo': {'moistureLevel':0,'oilLevel':0}}, ReturnValues = 'NONE' ) body = { 'replyToken': json.loads(event['body'])['events'][0]['replyToken'], 'messages': [ { "type": "text", "text": res_text } ] } req = urllib.request.Request(url, data=json.dumps(body).encode('utf-8'), method='POST', headers=headers) urllib.request.urlopen(req) #メッセージに「登録」がなかった場合 else : state = stateTable.get_item( Key={ 'userId':message_event['source']['userId'] } ) #ステータスがMの場合 if state['Item']['state']=="M": # print("Mだわね。") body = { 'replyToken': json.loads(event['body'])['events'][0]['replyToken'], 'messages': [ { "type": "text", "text": "油分量を入力してください。" } ] } #ステータスをOに更新する stateTable.put_item( Item = { 'userId': message_event['source']['userId'], 'state' : 'O' } ) #水分量を更新 moistureLevel = message_event['message']['text'] put_table = table.update_item( Key = {'date':strSysdate}, UpdateExpression = 'set skinInfo.'+userId+'.moistureLevel = :moistureLevel', ExpressionAttributeValues = {':moistureLevel': moistureLevel}, ReturnValues = 'NONE' ) #ステータスがMでなかった場合 else : state = stateTable.get_item( Key={ 'userId':message_event['source']['userId'] } ) #ステータスがOの場合 if state['Item']['state']=="O": print("Oだわね。") body = { 'replyToken': json.loads(event['body'])['events'][0]['replyToken'], 'messages': [ { "type": "text", "text": "登録が完了しました。" } ] } #ステータスをIに更新する stateTable.put_item( Item = { 'userId': message_event['source']['userId'], 'state' : 'I' } ) #油分量を更新 oilLevel = message_event['message']['text'] put_table = table.update_item( Key = {'date':strSysdate}, UpdateExpression = 'set skinInfo.'+userId+'.oilLevel = :oilLevel', ExpressionAttributeValues = {':oilLevel': oilLevel}, ReturnValues = 'NONE' ) req = urllib.request.Request(url, data=json.dumps(body).encode('utf-8'), method='POST', headers=headers) urllib.request.urlopen(req) return { 'statusCode': 200, 'body': json.dumps(scan_data,default=decimal_default_proc) } 3. API Gatewayの設定 ここもこちらを参考にしています。 4. Line MessagingAPIの設定 LINE developersにログインし、新規プロバイダーを作成する。 アカウントがない場合、新規でアカウント作成する。アカウント作成する際は個人で普段使っているアカウントから作成しても問題ないです。 ・新規チャネルの作成 新規でプロバイダを作成します。チャネル設定ではMessagingAPIを選択してあげましょう。 その後チャネル基本設定を入力しますが、基本的にはテキトーで問題ないです。 特段気にしてあげるところはないですが、今回はアプリタイプはボットにしています。 また、チャネル名=チャットボットの名前になりますので愛着の湧く名前をつけてあげましょう。 ・Webhookの登録 APIをデプロイした際の呼び出しURLをWebhookに登録します。 Webhookの利用ラジオボタンもOKとしてあげてください。 Webhookを追加したら「検証」ボタンを押して、うまくいってるか確認しましょう。 チャンネル基本設定→応答設定で友達追加時の応答方法や、自動応答の文章の設定、 Webhookを有効にするか等の設定ができるので、ここも確認しておくと良いです。 ・動作テスト 作成したチャットボットをLINEのお友達に追加して、検証してあげましょう。 今回の場合は、 1.【以下のように会話が止まらずに成立すること】 「登録」→「水分量を入力してください。」 →「(ユーザーが入力)」→「油分量を入力してください。」 →「(ユーザーが入力)」→「登録が完了しました。」 2.【DynamoDBの①skinCheck②userStateそれぞれのテーブルが想定通り更新されていること】 ①skinCheckerテーブルに当日日付でユーザーID、水分量、油分量が登録されていて、 ②userStateテーブルがM→O→Iと変化している を確認できたら十分ではないかと思います。 終わりに こんな感じでLINEのチャットボットで肌状態を管理できるようになりました。 肌状態に限らず、何かを管理したいけどいちいち入力めんどくさいな みたいなものがあればチャットボット化できたら楽かもと思いました。 あと、後から調べましたが今回のシステム構成で個人利用チャットボットであればAWS費用もかなりお安いようです。 このチャットボットもこれから値の取得等できるよう追加開発したいです。