20201121のAWSに関する記事は7件です。

Railsチュートリアルエラー :FormatError: fixture key is not a hash

エラーの発生!

Ruby on Rails チュートリアル 第6番
"リスト 8.24: 有効な情報を使ってユーザーログインをテストする"
を進めていると。。。。

今まで通っていたテストが全てエラーに!!

21 tests, 0 assertions, 0 failures, 21 errors, 0 skips

しかし、よくよくエラーを確認すると...

ActiveRecord::Fixture::FormatError: fixture key is not a hash: 
/home/ubuntu/environment/sample_app/test/fixtures/users.yml

fixturesフォルダの中のusers.ymlに原因があると判明。

調べてみると、ymlではインデントも意味をもつとのこと。

【参考】
https://teratail.com/questions/263996

/home/ubuntu/environment/sample_app/test/fixtures/users.ymlを
下記のように修正して、

michael:
  name: Michael Example
  email: michael@example.com
  password_digest: <%= User.digest('password') %>

再度テストを試すと。。。

21 tests, 54 assertions, 0 failures, 0 errors, 0 skips

無事解決!

まずは落ち着いてエラーメッセージを読んでいくことで、
比較的スムーズな解決につながりましたー!

エラーで困っている初学者の方にとって
少しでも助けになれば嬉しいです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Amazon S3を利用した画像投稿や保存をする(パケットへ画像を保存する)


初めて書きます!! Toshiと申します。始めたばかりで駆け出しのエンジニア志望生です。
某プログラミングスクールで3ヶ月ほどカリキュラム基礎を学んで残りの3ヶ月で個人アプリの制作をしています。

Qiitaは自分の学びのストックと、もし同じ悩みを持った方の参考に少しでもなればと思い、不定期ですが更新していきたいと思っています!!
よろしくお願いします:blush:


初投稿はタイトルの通りAmazon S3を利用しての画像保存について書いていきたいと思います。
(今回、学んだテキストからかなり引用気味です。。笑)

 この記事の対象の方

・AWSでIAMアカウントを登録している
・Ruby on railsを学んでいる方(他の言語でもS3は出てくるかとは思いますが、この後はRuby on railsが引き合いに出てくるため)
ActiveStorageを用いた画像保存などを知っている方
・Herokuをお使いの方

ただ、条件関係なくその他の方も全然Welcomeです:sunglasses:

 そもそも「Amazon S3」とは

「Amazon S3」はAWSの中のサービスの1つで、ネット上にデータを保存する箱を借りられるようなイメージです。
ここに画像などを保存したり、保存してある画像を取得したりすることができます。

「Amazon S3」を使うことで、データ容量を気にすることなく画像を保存することができます。S3に保存できるデータの量は膨大で、個人で作成するアプリで使われるレベルの量なら完全に無料で利用できます。


ちなみに

AWSへのアカウント登録で無料期間が12ヶ月であったり上限があったりで、従量課金制なので知らない間にお金がかかるかも知れませんので、ご注意を。。

 STEP1 「S3で保存先を用意する」

準備前に「バケット」と「リージョン」を知っておく必要あります。

バケット:データが格納される場所のこと
※英数字で誰もつけたことのない名前にする。

リージョン:バケットが実際に存在しているサーバーの在り処。IPアドレスなどに近いイメージ。

まず、バケットを作成していきます。自身のアカウントのメニューバーにある「サービス」をクリックし、「S3」をクリックします。
1.png

「バケットを作成」をクリックし、名前やリージョン「アジアパシフィック(東京)」を入力していきます。

スクリーンショット 2020-11-21 19.25.54.png
スクリーンショット 2020-11-21 19.27.32.png

次に、セキュリティの設定をしていきます。「パブリックアクセスをすべてブロック」のチェックを外し、画像のようにチェックを入れていきます。

スクリーンショット 2020-11-21 19.29.15.png
スクリーンショット 2020-11-21 19.32.30.png

その他は特にいじらずに、「バケットを作成」して作業は完了です。
スクリーンショット 2020-11-21 19.33.19.png

 STEP2 「バケットポリシーを設定する」

準備前に「バケットポリシー」を知っておく必要あります。

バケットポリシー:どのようなアクセスに対してS3への保存やデータの読み取りを許可するか決められる仕組みです。

今回は、「IAMユーザー」からのアクセスだけが保存やデータの読み取りを許可するという設定にします。
※AWSで使えるサービスを制限しておくユーザー。アカウント乗っ取りや情報漏洩に対しセキュリティのため、通常はこちらのユーザーで作業します。
メニューバーのサービスをクリックし、検索画面で「IAM」と検索します。
2.png
3.png


「ユーザー」を選択します。
※画像引用上「先ほど」とありますが、すでに作成したものという認識でお願いいたします
4.png


IAMユーザーの情報が表示されますので、必要な情報を取得します。 後ほど「ユーザーのARN」が必要になりますので、一度メモアプリなどに保存しておきましょう。
6.png


バケットポリシーの設定を行っていきます。サービス一覧から「S3」を選びます。先ほど作成したバケットをクリックします。
7.png


アクセス権限(もしくはアクセス許可)をクリックすると、「パケットポリシー」を設定する箇所が出てきます。
(画像のように「パケットポリシー」をクリックかスクロール)
下の入力内容を参考に、パケットポリシーを入力します。
8.png

{
   "Version": "2012-10-17",
   "Id": "Policy1544152951996",
   "Statement": [
       {
           "Sid": "Stmt1544152948221",
           "Effect": "Allow",
           "Principal": {
               "AWS": "①"
           },
           "Action": "s3:*",
           "Resource": "arn:aws:s3:::②"
       }
   ]
}

上記の①にはコピーしておいた「ユーザーのARN」を記載、②には作成したバケット名を入れましょう!
ここまでが、バケットポリシーを設定するになります。

 STEP3 「ローカル環境から、画像をS3のバケットに保存できるように設定する」


※ここからはRuby on railsの話になります。

Gemfileの一番下に下記を追記をします。「bundle install」も忘れずに。

gem "aws-sdk-s3", require: false

保存先を指定していきます。今回はローカル環境、すなわち開発環境であるため、「config/environments/development.rb」を編集していきます。

config/environments/development.rb
(省略)

config.active_storage.service = :local

(省略)

↓以下のように編集

config/environments/development.rb
(省略)

config.active_storage.service = :amazon

(省略)



次に、config/storage.ymlを編集をします。

config/environments/development.rb
(省略)

test:
 service: Disk
 root: <%= Rails.root.join("tmp/storage") %>

local:
 service: Disk
 root: <%= Rails.root.join("storage") %>

amazon:
 service: S3
 access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
 secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
 region: ap-northeast-1
 bucket: ご自身のバケット名をセット

(省略)
(省略)



環境変数を設定していきます。MacOSが「Catalina」以降を想定しています。

ターミナル
% vim ~/.zshrc



「i」を押してインサートモードにしましょう。※既存のコードを消さないように注意!!

ターミナル
export AWS_ACCESS_KEY_ID="ここにCSVファイルのAccess key IDの値をコピー"
export AWS_SECRET_ACCESS_KEY="ここにCSVファイルのSecret access keyの値をコピー"

※CSVファイルの「Access key ID」や「Secret access key」はIAMアカウントを作成時にダウンロードできます。IAMアカウントも別の記事で紹介できればと思います。。


編集が完了したら「esc」キー→「:wq」の順で実行し保存します。
編集した「.bash」を読み込み直し、追加した環境変数を使えるように以下のコマンドを実行します。

ターミナル
% source ~/.bash_profile

ただし、これだけではうまくいかない場合があるので、ターミナル再起動や「rails s」でサーバー再起動もお願いします。

これで完了です。既存のアプリで保存し、バケットで保存ファイルの有無を確認しましょう!!!
9.gif

 STEP4 「本番環境から、画像をS3のバケットに保存できるように設定する」


※ここからはHerokuを前提とした話になります。

保存先を指定していきます。今回は本番環境であるため、「config/environments/production.rb」を編集していきます。

config/environments/production.rb
(省略)

config.active_storage.service = :local

(省略)

↓以下のように編集

config/environments/production.rb
(省略)

config.active_storage.service = :amazon

(省略)



次に、Heroku上で環境変数を設定します。ターミナルで下記のコマンドを実行します

ターミナル(開発中のアプリのパスで実行)
% heroku config:set AWS_ACCESS_KEY_ID="ここにCSVファイルの「Access key ID」の値をコピー"

% heroku config:set AWS_SECRET_ACCESS_KEY="ここにCSVファイルの「Secret access key」の値をコピー"



Heroku上で環境変数が正しく設定できているかを確認するために、下記のコマンドを入力します。

ターミナル(開発中のアプリのパスで実行)
% heroku config


以下のように出てくれば問題ありません。
10.png

herokuへコミットするため、GitHubのmasterブランチへマージして、下記のコマンドをターミナルで実行します。

ターミナル(開発中のアプリのパスで実行)
% git push heroku master


本番環境も正しく保存でき、S3で保存が確認できれば完了です!!

最後に

Ruby on rails、herokuと縛りがあるため、お役に立たなかったかも知れませんが、少しでも参考になれば幸いです。 今後も発信していければと思います!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Scala で AWS の SECRET_KEY とかじゃない Credential を使う方法

com.amazonaws.auth.DefaultAWSCredentialsProviderChain を使うと良いかなと。

import com.amazonaws.auth.{AWSCredentialsProvider, DefaultAWSCredentialsProviderChain}
import com.amazonaws.services.kinesis.clientlibrary.lib.worker.{InitialPositionInStream, KinesisClientLibConfiguration, Worker}

val awsCredentialsProvider: AWSCredentialsProvider = new DefaultAWSCredentialsProviderChain()
val kclConf = new KinesisClientLibConfiguration(appName, streamName, credentialsProvider, workerId)
scalaVersion := "2.11.12"

libraryDependencies ++= Seq(
  "com.amazonaws" % "amazon-kinesis-client" % "1.6.5"
)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SonarQubeをインストールしたEC2をTerraformで一発で構築する

はじめに

SonarQubeの動作検証をたまにやることがあるが、その都度過去にインストールした方法を掘り返すのが面倒になったので、一発で構築できるようにした。
ここまでやるならAMI作れよ……と思わなくもない。

全体構成

今回は、AL2 な EC2 上に Docker をインストールして、その上で SonarQube on Postgres のような構成で動かす。docker-compose.yml は、SonarQube と Postgres をまとめて起動するためのファイルだ。

terraform/
├── 01_main.tf
├── 02_datasource.tf
├── 03_ec2instance.tf
└── 04_docker-compose.yml

01_main.tf はプロバイダ設定、02_datasource.tf は、VPC やセキュリティグループの設定をしている程度なので割愛する。

EC2インスタンスの作成

03_ec2instance.tf
################################################################################
# EC2 Instance                                                                 #
################################################################################
resource "tls_private_key" "sonarqube_instance" {
  algorithm = "RSA"
  rsa_bits  = 2048
}

resource "aws_key_pair" "sonarqube_instance" {
  key_name   = "sonarqube_instance"
  public_key = tls_private_key.sonarqube_instance.public_key_openssh
}

resource "aws_instance" "sonarqube" {
  ami                         = "ami-034968955444c1fd9"
  instance_type               = "t2.small"
  associate_public_ip_address = true

  subnet_id = data.aws_subnet.my_subnet.id
  vpc_security_group_ids = [
    data.aws_security_group.ssh.id,
    data.aws_security_group.http.id,
  ]

  key_name = aws_key_pair.sonarqube_instance.id

  tags = {
    Name = "[インスタンス名]"
  }

  provisioner "file" {
    connection {
      type        = "ssh"
      host        = self.public_ip
      user        = "ec2-user"
      private_key = tls_private_key.sonarqube_instance.private_key_pem
    }

    source      = "./04_docker-compose.yml"
    destination = "/home/ec2-user/docker-compose.yml"
  }

  provisioner "remote-exec" {
    connection {
      type        = "ssh"
      host        = self.public_ip
      user        = "ec2-user"
      private_key = tls_private_key.sonarqube_instance.private_key_pem
    }

    inline = [
      "sudo yum update -y",
      "sudo yum install -y docker",
      "sudo service docker start",
      "sudo usermod -a -G docker ec2-user",
      "sudo curl -L \"https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s)-$(uname -m)\" -o /usr/local/bin/docker-compose",
      "sudo chmod +x /usr/local/bin/docker-compose",
    ]
  }
}

resource "null_resource" "run_sonarqube" {
  depends_on = [
    aws_instance.sonarqube
  ]

  provisioner "remote-exec" {
    connection {
      type        = "ssh"
      host        = aws_instance.sonarqube.public_ip
      user        = "ec2-user"
      private_key = tls_private_key.sonarqube_instance.private_key_pem
    }

    inline = [
      "sudo /usr/sbin/sysctl -w vm.max_map_count=262144",
      "sudo service docker start",
      "docker-compose up -d",
    ]
  }
}

provisioner を使いまくっているが、aws_instance.sonarqube の remote-exec の provisioner では、Docker と docker-compose のインストールをしている。usermod をした後に再接続をしなければならないので、EC2インスタンスの作成後に null_resource.run_sonarqube で再接続をして、SonarQube のコンテナを起動している。

以前の記事で書いた通り、vm.max_map_count のパラメータ変更をしなければいけないので、これも Docker 起動前に実施している。他のカーネルパラメータは、docker-compose.yml 内で設定をしている。

docker-compose.yml
version: "2"

services:
  sonarqube:
    image: sonarqube:8.2-community
    depends_on:
      - db
    ports:
      - "80:9000"
    networks:
      - sonarnet
    environment:
      SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
      SONAR_JDBC_USERNAME: sonar
      SONAR_JDBC_PASSWORD: sonar
    volumes:
      - sonarqube_data:/opt/sonarqube/data
      - sonarqube_extensions:/opt/sonarqube/extensions
      - sonarqube_logs:/opt/sonarqube/logs
      - sonarqube_temp:/opt/sonarqube/temp
    ulimits:
      nofile: 65536
      nproc: 4096
  db:
    image: postgres
    networks:
      - sonarnet
    environment:
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: sonar
    volumes:
      - postgresql:/var/lib/postgresql
      - postgresql_data:/var/lib/postgresql/data

networks:
  sonarnet:
    driver: bridge

volumes:
  sonarqube_data:
  sonarqube_extensions:
  sonarqube_logs:
  sonarqube_temp:
  postgresql:
  postgresql_data:

これを terraform apply すれば、2~3分でサクッとSonarQubeが起動する。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【AWS】【初心者】wordpressのブログシステムを構築する(パラシつき) ⑤

この記事は、【AWS】【初心者】wordpressのブログシステムを構築する(パラシつき) ④
https://qiita.com/gbf_abe/items/5613471be83f8343464f 」の続きです。

前回まででやったこと

順番 内容
VPC構築
サブネット分割
EC2(パブリック)構築
WebサーバにApacheをインストール
EC2(プライベート)構築
NATゲートウェイ構築
DBサーバにMariaDBをインストール
Webサーバにwordpressをインストール
完成(するはず)!

前回は、プライベートサブネットを構築し、プライベートサブネット内にEC2を構築しました。
今回は、構築したES2インスタンスにSSH接続し、⑥ NATゲートウェイの構築からスタートしていきます。

scpコマンドによるwebサーバへのファイル転送

MACのターミナルからscpコマンドを使用してファイルを転送します。
カレントディレクトリあるpemファイルをホームディレクトリにコピーします。

scp -i practice_key.pem ec2-user@(webサーバのIPアドレス):~/

上記のコマンドを実行することで、webサーバへのファイル転送が行われました。

DBサーバへのSSH接続

(webサーバ上で)下記コマンドを実行します。

chmod 400 practice_key.pem
ssh -i practice_key.pem ec2-user@10.0.2.10

なんかメッセージが出るはずなので、「yes」と入力します。

https://aws.amazon.com/amazon-linux-2
[ec2-user@ip-10-0-2-10 ~]$

上記のような画面が出ていれば成功です。

NATゲートウェイとは

端的に言うと、インターネット側からの送受信は不可、プライベートサブネットからの送受信は許可
と言う動作をするAWSのサービスです。

NATゲートウェイの構築

①「VPC」>「NATゲートウェイ」>「NATゲートウェイを作成」をクリックします。
image.png

②「Name」に任意の名前を指定します。
 「サブネット」はパブリックサブネットを指定します。
 「Erastic IP 割り当て ID」は「Elastic IPの割り当て」を選択すると自動でIPアドレスが割り当てられます。
 「NATゲートウェイの作成」をクリックします。
image.png

設定内容 既定値 設定値
Name - WP-DB用ゲートウェイ
サブネット - WP用パブリックサブネット
Elastic IP 割り当て ID - (新規割り当て)

ルートテーブルの更新

NATゲートウェイが構築できたので、プラーベートサブネットのルートテーブルを更新します。

※事前準備:構築したNATゲートウェイの「NATゲートウェイID」を確認しておきます。
image.png

①「ルートテーブル」をクリックします。
②メインが「はい」になっているものを選択します。
image.png
③「ルートの追加」をクリックし、「送信先」に「0.0.0.0/0」と入力します。
④「ターゲット」には事前準備で確認したNATゲートウェイIDを選択します。
スクリーンショット 2020-11-02 17.09.42.png
⑤「ルートの保存」をクリックして構築完了です。

まとめ

今回は少し短いですが、DBサーバにSSH接続してNATゲートウェイを構築しました。
次回はいよいよDBサーバにMariaDBをインストールし、Webサーバにwordpressをインストールしてブログシステムとして動作していくようにします。
お疲れ様でした。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【未経験・独学】Laravelでアプリケーションの開発からAWSを用いたデプロイまで

はじめに

今回は、社内向けの質問アプリケーションの開発・デプロイをした際の話についてまとめます。
なにかアプリケーションを開発中もしくはこれから開発する方の参考になれば幸いです。

開発スタート時

  • 23歳
  • 実務未経験
  • 大学は非情報系
  • PHPの基礎とLaravelの基礎を3ヶ月ほど学んだ状態
  • 資格:基本情報技術者

アプリ紹介

今回開発したものは、「社内向けの質問アプリケーション」です。

デモ

デモ1(ゲストログイン・質問記事ページ・コメントプレビュー・タグ検索)
質問アプリ2.gif

デモ2(投稿プレビュー・テンプレート機能・ヘルプモーダル)
質問アプリ1.gif

デモ3(マイページ・下書き・ブックマーク)
質問アプリ3.gif

見ていただくと分かるとおり、大部分はQiita風です。開発を進めていく上で頭の中でイメージしていたものがかなりQiitaに近かったからです(日常でQiitaを使っていたためかなり影響を受けました笑)

ただ、同じモノを作るのではなくその上で、自分なりの工夫を追加していきました。
例えば、質問の重要度(急ぎ・お手すきに・その他)の指定・解決済みの質問には解決済みと表示される・質問や回答をした際に以下のようにSlackのチャンネルにて通知がいくようにするなど・・・。

通知画像.PNG

開発背景

実際に社会人として働いてみて以下のことを感じました。
1.この質問、複数人(複数回)聞かれていそうor今後ありそう
→同じ質問に、何度も回答するのは回答者に負担がかかってしまう。

2.チャット上での質問や回答に限界がある
コロナウイルスの影響も有り、在宅ワークが増えています。そのため質問をする際はチャット上で行う機会が今まで以上に増えています。しかし、どうしてもチャット上での質問では自分の考えや思いを伝えることに限界があると感じました。

どうやって解決するか?

1の問題に対しては、頻繁に聞かれることは社内にドキュメントとして残しておけばいいと思います。しかし、何度か聞かれたことに答えた後、「これ頻繁に聞かれるからまとめておこう」と思っても手間がかかるため、ついつい後回しになりがちかと思います。
それなら、質問に対しての回答がそのまま社内にドキュメントとして蓄積していけば、手間がかからなくていいのでは?
社内向けの質問・回答アプリケーションがあれば、そのまま質問とその回答がデータとして蓄積していくのでよさそう!

2の問題を解決するために、マークダウン記法が使えるようにしようと思いました。マークダウンを使えば、視覚的にもわかりやすくなりますし、質問・回答の幅も広がると考えたからです。

こういった背景より製作物のベースとなる機能を考え、開発を行いました。

実装機能

実装機能自体に難しい技術は特に使っていなく、あったらいいなと思うものを随時追加しています。

◯ログイン系
・ゲストログイン→フィードバックを周りの人にもらうためにもログインを簡単に!
・Twitterログイン(TwitterAPI)
→初めての外部API学習で実装。会社で使うことを想定したらいらないとのちのち気づく。一応残している。
・Googleログイン(GoogleAPI)→会社で使うならGoogleログイン必須!

◯基本的な機能
・質問のCRUD機能
・回答(コメント)のCRUD機能
・検索機能(ワード検索・タグ検索)
・質問下書き保存機能(下書き保存中はトップに表示されない)

◯その他
・質問作成、編集時のリアルタイムプレビュー機能(jQuery,marked.js,highlight.js)
・回答作成、編集時のプレビュー機能(jQuery,marked.js,highlight.js)
・マークダウン記法確認用のヘルプモーダル(Bootstrap)
・質問作成時の簡易テンプレート文作成機能(jQuery)
・質問のブックマーク機能(Vue.js)
・プロフィール編集時の画像プレビュー表示機能(AWS S3,Vue.js)
・質問・回答投稿時Slackの指定チャンネルへの通知機能(SlackAPI)
・機能テスト(PHPUnit)

上記機能を実装するにあたっていくつかまとめましたので、是非参考にしていただけると幸いです。

◯まとめた記事
TwitterAPI+LaravelでTwitterログイン機能を実装する
Laravel(7.20.0)でゲストログイン機能を実装
composer require時に起きたメモリー制限エラーとその解決策
Laravel + AWS S3で画像アップロードを行う
Vue.jsで画像プレビュー機能を実装
【失敗】Laravelでのテスト時にデータが消えてしまった件について

開発期間

基本的な機能とAWSのデプロイ(あと実はDockerでの開発環境の構築とそれにともなう学習も行ったりしていました。)等の最低限必要なことを1.5ヶ月(7~8月)ほどで行いました。

9月以降は、自分のペースでちょこちょこ機能の追加実装を行いました。
また、開発中学んだことはQiitaでまとめたりしていました。
GitHubの活動量はこんな感じです。(今回の開発以外の技術学習での活動も含んでいます。)

GitHub.PNG

8月末から9月にかけては、色々立て込んでいたこともありGitHub上での活動が少ないですが書籍やUdemy等でのインプットは行っていたかと思います。

開発を続けていくちょっとしたコツとして最近取り入れたことは、iPhoneのウィジェットにGitHubのContributionsを表示させることです。iPhone上で常に表示されているため、モチベーション維持として効果的でした笑。

やり方についてはこちらにまとめました。
iPhoneのウィジェットでGitHubの草を確認する

使用技術

  • 言語:PHP7,JavaScript
  • フレームワーク・ライブラリ:Laravel(7.20),Vue.js(2.5.17),Bootstrap4,jQuery(3.5.1),marked.js,highlight.js
  • DB:MySQL
  • インフラ:AWS(VPC,EC2,RDS,Route53,S3)
  • OS:Amazon Linux2
  • Webサーバー:Nginx

技術選定理由

◯PHP/Laravel
元々学習中だったこともあり選定。また、公式ドキュメントはわかりやすく、情報も沢山あるため。

◯jQuery,Vue.js
最初は、jQueryで実装していたが製作過程でVue.jsの学習を始めたことも有り途中から導入しました。(あまり良くはないかと思いますが)
非同期処理の実装にあたり使用しました。どちらも初学者でも比較的取り組みやすく、情報も豊富なため選択。

◯marked.js,highlight.js
マークダウン記法を使用したかったためmarked.jsを使用。マークダウン中のコード部分にハイライトしたかったため、highlight.jsを使用。

◯MySQL
今までの学習でMySQLを使用していたため選択。また、多くの企業のDB部分で採用されているため。

◯AWS
多くの企業のインフラ部分で採用されているため選択。選考中の課題で指定されることもあった。

AWSの学習は、主にUdemyの講座と書籍で大枠を学びました。
AWS:ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得
ゼロからわかるAmazon Web Services超入門 はじめてのクラウド (かんたんIT基礎講座)

◯Nginx
Q-SuccessのWebサーバーシェアの調査より、Nginxの増加傾向があるという記事を見て選定。

参考:Nginx系が増加し、Apache減少 - 8月Webサーバシェア

Nginxを使用するにあたり、学んだことはこちらにまとめました。
【学習記録】PHP-FPMとは?

インフラ構成

使用したAWSのサービスは、VPC・EC2・Route53・RDS・S3です。
よく見かけるインフラ構成図を書いたことがなく、てっきり他の人はPowerPointで作っているのかな~とか思っていましたが、そんなことはなさそうでした。
調べてみてでてきた、Lucidchartというものを使用して構成図を作りました。

sasaQ インフラ構築図 (1).png

本来は、DBなど複数用意して冗長化するべきなのですが・・・。
インフラ部分はまだまだ改善の余地はあるので、改善をしていきたいと思います。

意識したこと

開発していく上で下記のことを意識しました。

・ユーザー目線で開発する
開発しても必要の無い機能を実装したところで意味がないので、ユーザー目線で考えてどういった機能があったらいいか想像しながら開発を行いました。

・意見をもらう
さきほど、ユーザー目線で開発するとはいったもののやはりどうしても自分だけで考えて開発すると考えが偏ってしまいますし気づけないことがあります。そのため、実際に誰かに触ってもらいどういった改善が必要か意見をもらうことが非常に大事だと思います。

せっかくの機会なので、もしこんな機能あったらいいんじゃない?というアイデアやアドバイスがありましたら是非コメントを頂けるとうれしいです

・Qiita上でのアウトプット
書籍やUdemyの講座で学習したはいいものの、それだけだと正直すぐに忘れてしまいます。

開発によるアウトプットでも身につきますが、Qiitaのようなサービスで学習したことをまとめてみると結構知識として残るのでおすすめです。忘れたとしても、自分の記事を読み返して思い出せます。

また、外部に発信するので適当なことは書けない→ある程度しっかり調べるような習慣がつきます。
つまりいいことだらけ!!!

今回のモノ以外では過去にこんなものを作ってアウトプットしたりしています。
見ていただけると分かるかと思いますが製作物自体はちょっとしたものですが、色々学ぶことが出来ました。まずはちょっとしたものから作ってみることをおすすめします!よかったら是非見てください。
ラズパイを使って、【ある作業】を自動化してみた
小学生時代の僕へ、「OCRで【いつもの作業】やっておいたよ!」

今後の課題

アプリに関する課題

  • UI/UXの改善
  • テストコードを増やす
  • CI/CDを導入する
  • 細かな修正
  • 質問記事部分に画像を投稿できるようにする

個人的な課題とその対策としては

  • インフラ部分の学習 → 実際に色々使う・Udemy等
  • git周りの学習 → 実際に色々使う・Git使い方入門
  • 可読性の高いコードを意識すること → リーダブルコード
  • Linuxの基礎の学習 → Linux標準教科書(pdf版無料だったはず!)

などなど・・・。もちろんまだ色々課題点はありますが、少しずつ出来ることを増やしていきたいと思います。

まとめ

今回は、未経験・独学の自分がLaravelで社内向け質問アプリケーションの開発からデプロイまで行った話についてまとめさせていただきました。

今までデプロイもherokuで1度やったことがあるくらいでしたので、特にAWSでのデプロイ部分には苦戦しました。

今回は一人で全て行ってきましたが、コードの質はどうしても低くなってしまうのでメンターを付けてコードレビューしてもらいながらやったら良さそうだと感じました。

引き続き学習を続け、Qiitaで発信していきたいと思います。

よろしければLGTMよろしくお願いいたします!!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CloudFormationをゼロから勉強する。(番外編:Former2)

はじめに

仕事でAWSにWordPressのサイトを立ち上げる作業を行ったのですが、手作業で作ったということもあり、コード化されていなかったので、せっかくなので「AWS Black Belt Online Seminar AWS CloudFormation deep dive」でも紹介されていたFormer2を使ってコード化してみました。

-【前】CloudFormationをゼロから勉強する。(その8:スタックのネスト)

Former2とは

AWSの自アカウントにあるリソースを検索し、選択したリソースをCloudFormationTerraformなどの形式でコード化してくれるブラウザベースのサービスです。

Former2サードパーティー製のツールとなり、AWS公式としてはCloudFormerが同様のコンセプトのツールですが、ここの記事を見ると「CloudFormerは今後アップデートされないので、出来がいいFormer2を使ってね」だそうです。

中の人がそんなこと言っちゃうんですね(笑)

前準備

Former2を使うだけなら自分のアカウントでもできますが、使用するためにはFormer2のサイトにアクセスキーシークレットアクセスキーを渡す必要があります。

権限ある鍵情報を渡すのはさすがに気が引けるので、Former2用のアカウントを作成する方法で進めていきます。

Former2用アカウント作成

IAMから新規でIAMユーザを作成します。

リソース取得用に使うだけなのでマネジメントコンソールアクセスにチェックは不要です。

former2_01.jpg

既存のポリシーを直接アタッチ」を選択し、ReadOnlyAccessのみチェックを行います。

タグなどは任意で設定してcredentialsのCSVをダウンロードしたら完了です。

former2_02.jpg

プラグインのインストール

Former2のWebページにアクセスし、SetupIntroductionを選択すると使用ブラウザ用のプラグインをインストールする旨の内容が表示されるため、プラグインをインストールします。

former2_03.jpg

Credentials情報の入力

SetupCredentialsを選択して、先ほど作成したFormer2ユーザのCredentials情報を入力します。

Session TokenAssumed Role ARNは空欄のままでOKです。

former2_04.jpg

スキャンの実行

Parametersは今回は何も入力せずに次へ進むとSettings画面が表示されるため、画面右上のリージョンをスキャンしたいリージョンに合わせてScan Accountをクリックします。

former2_05.jpg

コード化したいリソースの選択

Scan Accountを行うことで、指定のIAMアカウントでリソース情報の取得が始まります。

左ペインのCATEGORIESからリソースを選ぶとAWS上に構築されているリソースが表示されるため、コード化したいリソースを選択し、Add Selectedを選択→リソースを選択→Add Selectedを選択を繰り返します。

former2_06.jpg

リソースのコード化

リソースを選択し終わったら、画面上のGenerateボタンをクリックすることで、以下の画面のようにコード化されます。

今回はOutput設定をCloudFormationとして生成したため、CloudFormationの形式で出力されましたが、Terraformなど他の出力方式にすれば、指定の出力方式で出力されます。

former2_07.jpg

終わりに

実際に触ってみましたが、これは確かにAWSの中の人が勧めてしまうのもわかります。

良いと感じたところを羅列。

  • 事前に準備することが少ない(取得用アカウントを作る程度)
  • ログイン等必要なく、ブラウザで直感的に操作できる
  • 対応リソース数が多いため、一般的な運用で困ることはなさそう
  • 一度Former2用IAMアカウントを作っておけば、すぐにスキャンできるので、手動作成したリソースを後からコード化するのも簡単
  • リソース等も!Ref!GetAtt等の組み込み関数で指定されるので、使いまわししやすい

AWS Black Belt Online Seminar AWS CloudFormation deep dive」でも紹介されていた通り、既存リソースとの紐付けなどは手動で行う必要がありますが、使ったことが無いサービスで、先にGUIで作ったけどコードとして残したい場合に便利です!

AWSを使って運用している方は、ぜひ利用してみてください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む