- 投稿日:2021-03-21T23:59:49+09:00
t4g.nanoのスポットインスタンスは$0.0016 /1 時間(月$1.152!!)※2021/03/21現在
タイトルのとおりです。
月1ドル強って安すぎません?
タイトルは東京リージョン価格です。バージニア北部だと$0.0013 /1 時間(月$0.936)と、1ドルを切ります。。ちなみにスペックは、、、
vCPU ECU メモリ(GiB) インスタンスストレージ (GB) オンデマンド料金(東京リージョン) 2 該当なし 0.5GiB EBS のみ 0.0054USD/時間 オンデマンドだとしても月$3.888です。
- 投稿日:2021-03-21T23:46:28+09:00
AWSアカウントの解約方法
基本はAWSのドキュメントに従って解約すればよい。
AWS アカウントを解約するにはどうすればよいですか? | AWS ナレッジセンター
アカウントの解約 | AWS Billing and Cost Management ユーザーガイドルートユーザーのメールアドレスを使ったログインは、メンバーのログインとはページが別なので注意。
注意事項があるのでよく確認すること。以下抜粋。
- ルートユーザーでしか解約できない
- ルートユーザーのメールアドレスは、別アカウントの新規作成に利用できなくなる(事前に変更可能)
- 解約後の90日間を解約後期間という
- 解約後期間はサインインでき、サポート機能を使える
- 解約後期間内ならアカウントを再開できる
- 再開すると解約後期間内の利用料が課金される
- 解約後期間が過ぎると全リソースは削除される
- サブスクリプションは解約後も課金される
リソースの削除
バックアップを取った上で、リソースを削除する。
解約時にアクティブなリソースが全て削除されるとは限らないので、解約前に自分で削除しておくことがベストプラクティスになっている。未払いの請求書を支払う
決済アカウント経由で支払っているなら何もすることはないはず。
そうでなければ、マネジメントコンソールから未払いの支払いを行う。解約
マネジメントコンソールのマイアカウントから解約する。
解約ボタンはページ最下部にある。リソース終了の確認
必要なら解約から3日後以降にリソースが終了されていることを確認できる。
マネジメントコンソールで引き続き請求がされていないことを確認する。AWSアカウントの再開
AWSアカウントの再開は、マネジメントコンソールのサポート機能から行う。
前述の解約後期間を過ぎると再開できないので注意。
- 投稿日:2021-03-21T22:45:20+09:00
EC2にJavaWebアプリ環境を構築 #3
EC2にJavaWebアプリ環境を構築 #1
EC2にJavaWebアプリ環境を構築 #2
EC2にJavaWebアプリ環境を構築 #3
EC2にJavaWebアプリ環境を構築 #4目次
1.はじめに
2.続きはじめに
- 前回
- JDK、nginx、Tomcatのインストールをした
続き
nginx、Tomcat連携
nginxのページにアクセスしたときTomcatのページにリダイレクトする設定を行う
前回参考にした記事1にもやり方が書いてあるが、
私がやった限りうまくいかなかったため、別の方法でやっていく下記コマンド入力
sudo vi /etc/nginx/conf.d/tomcat.conf
下記コマンド貼り付け
server { listen 80; server_name xxx.yyy.com; root /var/local/webData; access_log /var/log/nginx/tomcat_access.log; error_log /var/log/nginx/tomcat_error.log; location / { proxy_pass http://localhost:8080/; } }記述したらnginxを再起動
sudo systemctl restart nginx
パブリックIPv4 DNSにアクセスしてみる
末尾に:8080がなくてもtomcatのページが表示されていることが確認できればOK
MariaDB
データベースを導入していく
#MariaDB10.2を有効化 sudo amazon-linux-extras enable lamp-mariadb10.2-php7.2 #インストール sudo yum install mariadb-server -y #起動 sudo systemctl start mariadb #自動起動 sudo systemctl enable mariadbこれでデータベースのインストールと設定が完了
ステータス、バージョン確認は下記コマンド
#ステータス確認 systemctl status mariadb #バージョン確認 mysql --version
これで環境構築は完了
データベース移行のためにphpMyAdminを導入してもよいが、
筆者が作成したアプリくらいなら手作業で十分なので割愛する次回記事で簡単なプログラムを作成し、動かして終了しようと思う
参考サイト
- 投稿日:2021-03-21T22:31:33+09:00
弱小インフラエンジニアでもAWS CLIを使えるようになりたい
ご挨拶
今年に入り部署移動やら一人暮らしやらでばたばたしていてQiitaへの投稿がなかなかできない状況でしたが、知識がだいぶ溜まってきたのでアウトプットのために簡単な記事を書きます。
AWS CLIを使ってみよう
環境
Ubuntu 20.04
Python 3.8.5
※AWS CLIを使用するにはPython 2 バージョン 2.7以降のバージョンが入っている必要があります。AWS CLIバージョン2をインストールします。
公式ドキュメントどうりに進めていきます。
以下のコマンドを実行することで最新のバージョンをインストールできます。Ubuntu20.04curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" unzip awscliv2.zip sudo ./aws/install上記コマンドが正常に終了したらバージョンを確認しましょう
Ubuntu20.04aws --version私の場合はaws-cli/2.1.30が入っていました。
次にAWSをコマンド操作できるようにIAMユーザを作成します。IAMユーザの作成 (AWSマネジメントコンソールでの操作)
※すでにIAMユーザが作成されている方はアクセスキーとシークレットアクセスキーを準備してください
AWSマネジメントコンソールで検索バーから「IAM」と検索しIAMダッシュボードへ移動
移動後、画面左にある「ユーザ」をクリック
クリックすると以下の画面が出てくる
出てきたら「ユーザを追加」をクリック
※初めて作成する場合は画面が少し違う場合があります。
クリックしたらユーザ名を入力する画面が出てくるので入力する
ユーザ名を入力したらプログラムによるアクセスにチェックを入れて「次のステップ:アクセス権限」をクリック
「既存のポリシーを直接アタッチ」を選択して「AdministratorAccess」にチェックを入れます。
※本来は必要最低限のポリシーをアタッチするのが良いのですが今回はAWS CLIをとりあえず使ってみるためにAdministratorAccessをアタッチしています。
チェックを入れたら「次のステップ:タグ」をクリック
タグの入力画面が出てきますがここでは特に入力せずに「次のステップ:確認」をクリック
クリック後確認画面が出てくるので問題がなければ「ユーザの作成」をクリック
クリック後IAMユーザのアクセスキーとシークレットアクセスキーが出てくるのでメモしておきます。
※アクセスキーとシークレットアクセスキーは流出すると大変なので自分以外には教えないでください。AWS CLIの設定
ターミナルに戻ってAWS CLIの設定をしていきます。
まずは先ほどメモしたアクセスキーとシークレットアクセスキーを設定していきます。Ubuntu20.04aws configure上記のコマンドを実行するとアクセスキー、シークレットアクセスキー、デフォルトでリクエストを送るリージョン、出力形式が設定できます。
Ubuntu20.04AWS Access Key ID [None]: メモしたアクセスキーを入力 AWS Secret Access Key [None]: メモしたシークレットアクセスキーを入力 Default region name [None]: 使用したいリージョンを入力 東京リージョンならap-northeast-1 Default output format [None]: コマンドの結果の出力形式 (json、yaml、yaml-stream、text、table)から選べます上記で設定した内容は~/.aws/配下にあるファイルで確認することができます。
次はデフォルトでは設定されていないTab補完の設定を行います。
下記のコマンドを実行してAWSコンプリータを探します。Ubuntu20.04which aws_completer正常に終了したら下記のコマンドでTab補完を有効化します。
※/usr/local/bin/のところは上記のコマンドの結果を入力してくださいUbuntu20.04complete -C '/usr/local/bin/aws_completer' awsこれだけでもTab補完を使用できるようになっていますが、このままだとシェルログイン時に毎回実行する必要があるので.bashrcに上記コマンドを記載しておきましょう。
これでAWS CLIを使用する準備は完了しました。次は実際に使用してみます。AWS CLIで作成済みのリソースを見てみる
とりあえずAWS CLIを使用する準備が完了したのでCLIで作成済みのEC2インスタンスを見てみましょう。
AWS CLIのコマンドの使用方法としては「aws サービス アクション オプション」といった形になっています。
以下のコマンドを実行してみてください。Ubuntu20.04aws ec2 describe-instancesこちらのコマンドを実行すると作成されているEC2インスタンスの情報がずらっと出力されてきます。
すべてのインスタンスではなくフィルターに引っかかったインスタンスを出力するには以下のようになります。Ubutnu20.04aws ec2 describe-instance --filters フィルターしたいもの例えばイメージIDでフィルターをしたければ以下のようになります。
Ubuntu20.04aws ec2 describe-instance --filters Name=image-id,Values=ami-0bc8ae3ec8e338cbcこのように「--filters」の後にフィルターしたいものの名前と中身でフィルターが可能になっています。
他にもインスタンスタイプやキーペアなどでフィルターできるようです。
詳しくはコマンドリファレンスを参照してみてください。締めのご挨拶
AWS CLI自体まだまだ勉強中で今回の記事のレベルのようなことでしか使用したことが無いですが、業務で使用できるレベルになるように頑張りたいと思います。
- 投稿日:2021-03-21T22:28:42+09:00
AWS for JavaScript で S3 の getObject で NoSuchKey を期待してたのに AccessDenied が返ってくる
問題
以下のようなコードコードを実行し
let prev = null; try { prev = await S3.getObject({ Bucket: 'my-bucket-hogehoge', Key: 'path/to/object', }).promise(); } catch(e) { // オブジェクトが存在しない場合(NoSuchKey)は無視,それ以外は throw し直す if (e.code !== 'NoSuchKey') { throw e; } }存在しないオブジェクトへのアクセスは
NoSuchKey
が返ってくるものと期待していて、s3rver を利用したローカル環境での動作確認はそれで問題なかった。しかし、デプロイして実際にどうさせると AccessDenied が返ってくる。
原因
なんで?
と1時間くらい悩んだが SDK のドキュメントに書いてあったhttps://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property
Permissions
You need the s3:GetObject permission for this operation. For more information, see Specifying Permissions in a Policy. If the object you request does not exist, the error Amazon S3 returns depends on whether you also have the s3:ListBucket permission.
- If you have the s3:ListBucket permission on the bucket, Amazon S3 will return an HTTP status code 404 ("no such key") error.
- If you don’t have the s3:ListBucket permission, Amazon S3 will return an HTTP status code 403 ("access denied") error.
s3:ListBucket
Action が許可されていないとaccess denied
を返すと対応
以下のようにポリシードキュメントで権限を付与したら解決。
Resource の指定方法がs3:getObject
と異なるので注意。(一部抜粋) { "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": "arn:aws:s3:::my-bucket-hogehoge/*", "Effect": "Allow" }, { "Action": [ "s3:ListBucket" ], "Resource": "arn:aws:s3:::my-bucket-hogehoge", "Effect": "Allow" }
- 投稿日:2021-03-21T21:49:18+09:00
AWS認定クラウドプラクティショナーを受けてきた
概要
「AWS認定クラウドプラクティショナー」の試験を受けてきました。
その合格体験記という形で、記事にしました。これから受講する方は参考にしてください。
※私自身は、クラウドを触った事のない初心者です。ただ、一応アプリケーションエンジニアをやっているので、
それなりにインフラ&サーバー周りは、普通の人よりかは知見があると思います。書籍購入
以下の書籍を購入しました。
クラウドプラクティショナーの書籍の中で一番読みやすく、
ボリュームがあまりなかったからです。(※やはり勉強時間は短く取得したいもの…)
ただ、今思ってみると、本書籍を購入してよかったなと思います。クラウドプラクティショナーの試験は、勉強する書籍の内容も大事ですが、
どれだけ多くの問題を解いて、どんな内容が来ても対応できるようになるか?
が一番大事だとおもっており、この書籍の最後にある練習問題も質は非常に良いものです。また、この後記載するUdemyの問題集とも差別化も図れる練習問題だと思っています。
自分は本書籍を一通り目を通したあと、練習問題のみ、ひたすら解いていました。問題集
Udemyの以下問題集を購入しました。
本問題集はクラウドプラクティショナーを受けるなら、やるのが安定かと思います。【この問題だけで合格可能!AWS 認定クラウドプラクティショナー 模擬試験問題集(7回分455問)】
https://www.udemy.com/course/aws-4260/ただ、本問題集の"応用レベル"は非常にレベルが高いものなので、
得点自体は悪くてもあまり気にしない方がいいかと思います。
(※自分は初めて受けた時は、30%しか正解しなかったとかザラでした。)問題を解いて、解説で知識を付ける事が一番大事な事だと思います。
あと「オプショナル問題(難易度高:アソシエイト試験レベル)模擬試験2回分130問」は、明らかに難しそうな気がしたので、
こちらは、私はやりませんでした。試験日の変更
受験申し込み後、受験日を変更しようと思った事があり、ピアソンVUEで申込みを行ったのですが、
以下手順で変更する事が出来ました。①「AWS Training & Certification」にログインして、試験の申込をクリックする。
②「スケジュール済みのAWS認定試験」の、右下の「スケジュール変更」から変更出来ました(※もちろん無料で)
結果不合格…
試験を受けてきましたが、結果「不合格」でした。(残念!)
スコアは、667点でした。(※700点以上で合格)65問ある中で、あと3・4問あっていれば、合格できたと思うのでそんなに悲観しておりませんでした。
※勉強時間としては、2週間程度業務をこなしながら勉強をしてきた感じで、もう少しやりこめば合格出来ると思ったので。その時ディスプレイに表示された内容だと、15日期間があけば、再受験できる という事だったので、
2週間後の土曜日(19日後)にまたチャレンジしようと思いました。再度、試験勉強
基本的には、今までやってきた練習問題の問題&解答の見直しを行い、
解答の精度を高める事に費やしました。それに加えて、以下の問題集を新しく購入して解きました。
【AWS認定 クラウドプラクティショナー 模擬問題集 Kindle版】
https://www.amazon.co.jp/exec/obidos/ASIN/B081D4ZJ5G/hatena-blog-22/模擬問題集として、65問の問題集が2回分収納しております。
本番前の模擬試験として活用してみるととても良いものでした。
(Udemyの問題集より難易度は低いと思いますし)試験前に上記問題集を解いてみて、2回とも合格点はクリアしていたと思うので、
万全の態勢で試験を迎える事が出来ました。無事合格
試験前上記問題集を、無事に合格できました。
得点は、830点だったので、余裕をもって合格が出来たかと思います。
半月前から153点もスコアがあがったので、短期間でも集中して勉強すれば十分効果は出る事を実感しました。終わりに
試験を受けてみて、試験勉強が嫌だからという理由で、
あやふやな知識のまま試験を受けに行くのは危険だと思いました(当然ですが。笑)1回目の知識の状態でも、数打てば合格出来たかと思いますが、
今回みたいに落ちた後、半月きっちり勉強する事によって、スコアも安定するようになったので、
もし同じようにギリギリに落ちたてしまった方がいても、めげずに半月勉強して、試験に臨んでみて下さい。またアソシエイトを受けたら、Qiitaに記事載せようかと思っておりますので、
またその時見て頂けると嬉しいです。以上、ここまで読んでくださりありがとうございました。
- 投稿日:2021-03-21T21:01:41+09:00
【AWS】用語を整理しながら学ぶAWS - part5 Cloud Formation - 2
はじめに
この記事では AWS Cloud Tech を通して Cloud Formation を学習して実践していく記事です。
主な内容としては実践したときのメモを中心に書きます。(忘れやすいことなど)
誤りなどがあれば書き直していく予定です。
前回までのおさらい
Cloud Formation とは
IaC を利用して AWS のインフラ構築をコードで管理できるサービス形式は YML(YAML Ain't a Markup Language)と呼ばれる形式であり
YAML の特徴としてはパレンティスといったカッコ書きで
ブロックを表すのではなくタブでブロックを表す。単一のリソースは
論理 ID、Type、プロパティの 3 つで成立しており
Resources にまとめられることでスタックとして定義できる。
また、プロパティ内でリソースの細かい設定を行うことで
リソースを変更することができる。【AWS】用語を整理しながら学ぶ AWS - part5 Cloud Formation-1
Resources 以外のオプション
前回のコード
前回のコードをもう一度見てみよう。
network.ymlAWSTemplateFormatVersion: 2010-09-09 Resources: MyVPC2: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.8.0/21 EnableDnsSupport: true Tags: - Key: Name Value: MYVPC2fromCF subnetName: Type: AWS::EC2::Subnet Properties: AvailabilityZone: "ap-northeast-1a" VpcId: !Ref MyVPC2 CidrBlock: 10.0.8.0/24 Tags: - Key: Name Value: subnet1formCF secGroupName: Type: AWS::EC2::SecurityGroup Properties: GroupName: GroupName-SG GroupDescription: GroupDescription-SG VpcId: !Ref MyVPC2 SecurityGroupIngress: - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: 0.0.0.0/0 Tags: - Key: Name Value: SGfromCF Outputs: Subnet1: Value: !Ref subnetName Export: Name: Subnet1Name SG1: Value: !GetAtt secGroupName.GroupId Export: Name: SG1NameOutputs
AWS 公式ガイドにはこうある。
オプションの Outputs セクションは、他のスタックにインポートする (クロススタック参照を作成)、
応答として返す (スタック呼び出しについて記述)
または、AWS CloudFormation コンソールで表示する出力値を宣言します。Outoputs はそのテンプレートから出力できるメタデータを出力(Export)することができる。
Export した値はクロススタック参照をするときに利用できる。ここでいうスタックとは
単一の AWS リソースのこと
すなわち、クロススタック参照とは AWS リソースが AWS リソースを参照することを指す。スタックのエクスポート名
今回のコードの場合
サブネットのキーは Subnet1 でエクスポート名は Subnet1Name
セキュリティグループのキーは SG1 でエクスポート名は SG1Nameクロススタック参照をする際に利用する名前はエクスポート名
エクスポート名とは
他のスタックから Outputs を参照する際に利用する名前のこと
組み込み関数
AWS Cloud Formation にはいくつかの組み込み関数が存在する。
Ref
AWS 公式ガイドにはこうある。
指定したパラメータまたはリソースの値を返します。
テンプレート内のリソース情報を参照する。
引数に論理 ID を取る。GetAtt
AWS 公式ガイドにはこうある。
テンプレートのリソースから属性の値を返します。
secGroupName の属性「GroupId」を渡すと GroupId を返す。
今回はコンソール画面でいうところの「セキュリティグループ」の ID を
Outputs の SG1 に値として出力する。引数に属性名を取る。
クロススタック参照
前述の network.yml に対して
実際にクロススタック参照をやってみる。前述の network.yml で構築したネットワークに EC2 を建てる。
ec2.ymlAWSTemplateFormatVersion: 2010-09-09 Resources: myEC2Instance: Type: AWS::EC2::Instance Properties: KeyName: Mykeypair ImageId: ami-0992fc94ca0f1415a InstanceType: t2.micro Monitoring: false SecurityGroupIds: - !ImportValue SG1Name SubnetId: !ImportValue Subnet1Name Tags: - Key: Name Value: CFec2このとき組み込み関数「ImportValue」 を利用して
セキュリティグループとサブネットの ID をインポートする。
セキュリティグループとサブネットの ID は network.yml で出力したモノを使う。クロススタック参照の良いところ
コードを分割できる為、ネットワーク構築用やコンピューティングリソース用など
用途によってリソースを使い分けることができる。今回の場合はネットワークとセキュリティグループを分けても良かったような気がする。
クロススタック参照の悪いところ
その反面、分割ルールを決めておかないと管理が煩雑になりわかりにくくなる。
プログラマー的な観点
しっかり用途ごとに分割できていれば
インフラの構成を変更した後に差分を取れるので
GitHub 連携したときにその効果をいかんなく発揮できる。Outputs のキー名を設計の段階で明確にしておけば
スタック同士の結びつきがわかりやすくなり
構成変更時の影響範囲がわかる。※できれば一度構築したら弄りたくはないんですけどね。
これはと思うこと
任意の箇所だけ
スタックテンプレートを変更したいということができない。
例えば、ec2.yml にプライベート用の ec2 とパブリック用の ec2 を書いたときは
スタックを更新したときに変更のない箇所も更新対象になる。
※厳密にはテンプレートファイルを置き換える動作だから更新ではない?疎結合に考えようとすると管理するファイルとクロススタック参照が多くなるのでは?
まとめ
今回は network.yml と ec2.yml を使って簡単な環境構築をやりました。
Terrraform と比較するとチョット柔軟とは思えないところがありますが書きやすさとわかりやすさはピカイチですし
日本語ドキュメントがしっかりしているので、かなり好きなサービスになりそうです。
今後のアップデートに期待ですね。次回はもっとハッテンしていくぞ♂
おわり
- 投稿日:2021-03-21T20:33:24+09:00
サービスコントロールポリシー (SCP)の継承を試してみた!
サービスコントロールポリシー (SCP)の継承を試してみた!
以前、
サービスコントロールポリシー (SCP)について調べてみた - Qiita
という記事を書いたときに、SCPには継承の仕組みがあることを初めて知りました。
SCP自体設定したことがなかったので、まずは前回
サービスコントロールポリシー (SCP)を試してみた! - Qiita
という記事で、実際にSCPを設定してみました。
初歩的なSCPの設定ができたところで、今回は継承についても試してみたいと思います!参考手順
調べてみたの記事でも参考にさせて頂いた、クラスメソッドさんの以下のブログを参考にやっていきたいと思います!
[Organizations] SCP(サービスコントロールポリシー)の継承の仕組みを学ぼう | DevelopersIOSCP継承を考える際のポイント
設定前にブログからポイントを抜粋しておこうと思います。
「暗黙のDeny」を把握する
暗黙のDeny < 明示的なAllow < 明示的なDeny
何かのサービスに関する許可または拒否を設定したポリシーのみをアタッチした場合、指定したサービス以外は暗黙的にアクセスが拒否されるという内容ですね。
SCP継承は「フィルター」である
SCPの継承は 許可を通すフィルター です。 「フィルター」がポイントです。 フィルター は 許可を通しますが、許可は与えません 。
前提
前提として、AWS Organizationsでマスターアカウントの設定と別アカウントの追加は済んでいるものとします。
以下のような組織構造をあらかじめ作成しておきました。
Root
直下にTestOU
、その下にTestOUChild
、その中にアカウントがあるという状態です。やってみる① 拒否リスト形式のアクセス権限
まずはブログにある以下のような拒否リスト形式のアクセス権限を試してみたいと思いますが、今回はIAMとEC2へのアクセスを拒否するよう設定したいと思います。
今回の場合、
TestOU
にIAMへのDeny、TestOUChild
にEC2へのDenyを設定することになります。ポリシーの作成
とりあえずIAMとEC2の拒否用ポリシーを作成していきます。
AWS Organizationsコンソールの左側から「ポリシー」をクリックします。
All actions
を選択し、IAMのすべてのアクションを拒否するようにします。
AWSサービスはIAM、Resource typeは
All Resources
を選択し、「リソースの追加」をクリックします。
続けてEC2の拒否用ポリシーも作成しますが、ポリシー名、説明、サービスの選択部分以外は同じ手順なのでできあがったポリシーだけご覧ください。
ポリシーのアタッチ
作成したポリシーを各OUにアタッチしていきます。
まずはIAM拒否用のポリシーを親OUにアタッチするため、「アクション」から「ポリシーのアタッチ」をクリックします。
親OUである
TestOU
を選択し、「ポリシーのアタッチ」をクリックします。
同様の手順でVPC拒否用のポリシーを子OUにアタッチします。
これで各OUにポリシーがアタッチされました。
各OUのポリシー状況は以下の通りです。動作確認
では実際に動作を確認していきます。今回は
TestOUChild
に存在するアカウントのIAMユーザーで試してみます。
まずはIAMコンソールから見てみましょう!
はい、バッチリ拒否されました!続いてEC2コンソールです。
こちらもバッチリです。
ロードバランサーのみエラーが出ないのは、ロードバランサー関連のアクセス権限がEC2のサービス単位ではなく、Auto Scalingのサービス単位だからです。ここからわかる通り、親OUと子OUにアタッチしたポリシーによりIAMとEC2は明示的な拒否となり、ロードバランサーなどのその他のサービスについてはフィルターで除外されていないのでフルアクセスが可能となっています。
許可フィルターによってIAMとVPCだけ弾かれたというかんじですね!やってみる② 許可リスト形式のアクセス権限
先ほどは拒否リスト形式として、IAMとEC2を明示的に拒否しましたが、今度は許可リスト形式で明示的な許可を与えてみます。
細かいコンソールでの設定方法は大体先ほどと同じなので、各OUのアクセス権限だけご覧ください。親OU
親OUにはS3、Lambda、IAMのすべてのリソースへのアクセスを許可し、デフォルトの
AWSFullAccess
はデタッチしました。
子OU
子OUにはS3とLambdaのすべてのリソースへのアクセスを許可し、デフォルトの
AWSFullAccess
はデタッチしました。
動作確認
では動作確認していきましょう!
S3とLambdaにはアクセスできて、IAMとその他サービスでは拒否されればOKです。はい、期待通りのアクセス許可、拒否になりました!
明示的に許可したサービスのうち、親でも子でも許可されたS3とLambda以外は暗黙のDenyによって弾かれることが確認できました!まとめ
今回は前回のSCPを試してみるから一歩進んで、SCPの継承について試してみました!
クラスメソッドさんのブログでのポイント、「暗黙のDeny」と「フィルター」が実際に設定してみてよくわかりました。これらを理解できると、ブログでも紹介されている「ダメな例」も理解できると思いますので、そちらもぜひご覧ください!
それでは今回はここまで!
ご覧頂きありがとうございました!参考資料
[Organizations] SCP(サービスコントロールポリシー)の継承の仕組みを学ぼう | DevelopersIO
- 投稿日:2021-03-21T20:17:34+09:00
【AWS】基本的なブログサービス(シングル構成)を構築してみた。
はじめに
この記事はインフラ初心者の私がAWS Cloudtechを通して学んだことを
記録&アウトプットするための備忘録です。ゴール
自宅PCからインターネット経由でWord PressがインストールされたEC2にアクセスしてブログ閲覧ができるようにする。
目的
・RDSの作成方法の理解
・WordPressの構築方法の理解
・基本的なシングル構築方法の理解環境
・Windows10
・TeraTerm Version 4.105
・Word Press Version 5.7環境構築
手順
VPC作成からEC2ログインまで
ざっくりとした手順(詳細手順を確認したい方は以前書いたこちらの記事を参照してください)
①VPCの作成
②AZ1-aにてPublicSubnet、PrivateSubnetを作成
③PublicSubnet内にEC2作成
④セキュリティグループの作成
⑤WebServer-1にログインするためにインターネットゲートウェイを作成
⑥VPCにアタッチ
⑦ルートテーブル編集(宛先がローカル以外の通信は全てIGWに向けるように設定する)
⑧セキュリティグループの確認(ssh接続をするため22番ポートが空いているかを確認)
⑨ssh接続補足
※対象のインスタンスを選択し、[接続]→EC2 InstanceConnectを選択し、[接続]クリックすると
ブラウザ上でssh接続ができる
RDSの作成
Subnet Groupの作成
RDSを作成するためにはSubnet Groupを作成する必要がある。
※シングル構成であろうとsubnetグループが存在していないとRDSは構築できない。
※subnetグループを作成するためには2つ以上のsubnetをグルーピングかつsubnetは複数のAZにまたがっている必要がある。①AZ1cにPublic SubnetとPrivate Subnetを作成する。
③左ペインから「サブネットグループ」を選択し、[DBサブネットグループを作成]をクリック
項目 概要 VPC Subnet Groupを作成するVPCを選択 アベイラビリティーゾーン Subnet Groupを作成するAZを選択 サブネット Subnet Groupに含めるSubnetを選択 データベースの作成
①左ペインをからデータベースを選択して[データベースの作成]をクリック
②各種設定を入力し、[データベースの作成]をクリック
■データベースの作成
今回は標準作成を選択。■テンプレート
今回は無料利用枠を選択■DB設定
今回はバースト可能クラス:db.t2.microを選択■可用性と耐久性
今回は「スタンバイインスタンスを作成しないでください」を選択■追加設定-1
データベース名を入力し、その他はデフォルト設定。
③作成したDBのステータスが利用可能になっていることを確認する。
④作成したSG(RDS-SG-1)のインバウンドルールを編集する
インバウンドルールのソースに「Web-SG-1」を指定して、[ルールを保存]をクリック。
こうすることでWeb-SG-1に所属しているもの(今回ではWebServer1)からしかアクセスできなくなる。WordPressのインストール
①ec2-userからrootに権限切り替え
②yum -y updateでパッケージを最新の状態にアップデートするyum -y update③Apache,MySQL,PHP等必要なものをインストールする。
amazon-linux-extras install php7.2 -yyum -y install mysql httpd php-mbstring php-xml gd php-gd④Apacheのサービスを再起動後も自動的に起動する用に設定する。
systemctl enable httpd.service⑤Apacheのサービスを起動する。
systemctl start httpd.service⑥(念の為、)Apacheサービスの起動状態を確認する。
systemctl status httpd.service⑦WordPressをダウンロードする
以下のコマンドでWordPressをダウンロードするwget http://ja.wordpress.org/latest-ja.tar.gz ~/WordPressのサイト上で以下の操作を行うのと同じみたいですね。
llでWordPressの最新ファイルが存在することを確認。
※wgetコマンドは指定したURLに存在するファイルをダウンロードするコマンド
■参考URL
wgetコマンド⑧圧縮ファイルを展開する
以下のコマンドで圧縮ファイルを展開する。tar zxvf ~/latest-ja.tar.gz※-zオプションは無くても展開できました。
■tarコマンドのオプション
オプション 説明 -v(--verbose) アーカイブ結果を表示する。 -x(--extract) アーカイブされたファイルを解凍し展開・復元を行う -f(--file=ARCHIVE) アーカイブファイル名を指定する -z gzip方式の圧縮または展開を同時に行う(省略可能っぽい) ※tarコマンドはアーカイブを作成/展開するコマンド
■参考URL
tarコマンド⑨展開したwordpressディレクトリをドキュメントルートにコピーする
llで確認するとwordpressディレクトリができている。これを以下のコマンドでドキュメントルートにコピーする。
cp -r ~/wordpress/* /var/www/html/⑩所有者とグループを変更する
以下のコマンドで/var/www/htmlの所有者とグループをapacheに変更するchown apache:apache -R /var/www/html※chownはファイルやディレクトリの所有者を変更するためのコマンド
■参考URL
chownコマンドブラウザでWordpressの確認
①インスタンスのパブリックIPアドレスをアドレスバーに貼り付けてEnterを押す
WordPressの初期設定ページが表示されることを確認し、[さあ、始めましょう]を選択
※データベースのホスト名はRDSのエンドポイントの箇所からコピー&ペースト
④各種項目を設定し、[WordPressをインストール]を選択
⑤インストール後、WordPressにログインできることを確認
終わりに
今回は基本的なシングル構成の構築方法について学びました。
今回のハンズオンを通してRDSの作成やWordPressの構築といったことができるようになりました。
以前学んだVPCやEC2の知識が身についているように実感できたのが嬉しかったです。講座の内容以外にも何でこうするのか?や各コマンドの詳細を調べることで理解が深まりました。
疑問に思っていたことが解決することで「勉強楽しい!」と思えるようになりました。次は冗長構成での環境構築にも挑戦します。
この記事はAWS初学者を導く体系的な動画学習サービス
「AWS CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.comおまけ:ドキュメントルートとは?
今回、なぜ/var/www/htmlに/wordpress配下のファイルをすべてコピーする必要があるのかがわからなかったため調べてみました。
調べた結果、以下のように理解しました。
単語 説明 設定ファイルの格納場所 ドキュメントルート Webサーバで公開するコンテンツを配置するディレクトリ。 /etc/httpd/conf/httpd.conf ・ドキュメントルートでApacheがどこのディレクトリに置かれたファイルを Webサーバとして公開するかを決めており、対象のディレクトリが"/var/www/html"だったと理解。
・CentOSのhttpdではデフォルトのドキュメントルートとして"/var/www/html"が設定されている。
- 投稿日:2021-03-21T20:03:53+09:00
AWS認定フルコンプリート(12認定)までの流れと学習内容
AWS認定をフルコンプリートしましたので、コンプリートまでの流れや私が実践した学習、勉強方法を記載します。
取得状況(2021.2)
経験等
- 20年以上ソフトウェアエンジニアリングに従事
- ソフトウェア開発の案件が多かったのでインフラ経験は少ない
- 社会人になってからの資格試験はAWS認定が初めて
- 本格的にAWSに触れ始めたのは6~7年前ぐらいから
- 業務としてAWSマネジメントコンソール/CLIに触る頻度は週1回あるかないか
コンプリートまでの流れ
- 難易度は、スコアや学習期間、学習難易度などで個人的な主観から決めています
- 学習期間は、資格試験から次の資格試験までの間の休日(土日祝日)を利用していました
取得順 年月 資格 スコアの良い順 難易度の高い順 1 2019/3 AWS 認定ソリューションアーキテクト – アソシエイト 10 5 ![]()
2 2019/12 AWS 認定ソリューションアーキテクト – プロフェッショナル 7 1 ![]()
3 2020/7 AWS 認定クラウドプラクティショナー 1 12 4 2020/8 AWS 認定 デベロッパー – アソシエイト 6 9 5 2020/8 AWS 認定 SysOps アドミニストレーター – アソシエイト 4 11 6 2020/10 AWS 認定 DevOps エンジニア – プロフェッショナル 2 6 ![]()
7 2020/10 AWS 認定 セキュリティ – 専門知識 5 7 ![]()
8 2020/11 AWS 認定 高度なネットワーキング – 専門知識 12 2 ![]()
9 2020/12 AWS 認定 データアナリティクス – 専門知識 11 4 ![]()
10 2020/12 AWS 認定 データベース – 専門知識 9 8 ![]()
11 2021/1 AWS 認定 Alexa スキルビルダー – 専門知識 8 10 ![]()
12 2021/2 AWS 認定 機械学習 – 専門知識 3 3 ![]()
難易度の考察
- 1位:SAPは学習範囲の広さから非常に難易度が高いと感じました、ただ、このおかげで以降がグッと楽になるので、SAPは早めが良いかも知れません
- 2位:私自身がソフトウェア側のエンジニアなので、ネットワークに関する経験は少なく、また、DirectConnectを利用するプロジェクト機会も稀という状況なので、机上の勉強のみという状況での習得なので難しく感じました
- 3位:機械学習は、統計に関する基礎知識も必要なので、この点の学習も必要でした、データサイエンティストの方には簡単かも知れませんね(私はこの領域の知識がなかったので、勉強するのに時間を要しましたが、楽しかったです)
- 4位:データ分析は、学習時間がなかなか取れず十分な学習ができていない状況で受験したため、難易度を上げています
- 5位:初めて受けた資格なので難易度が高いと感じました。
- 6位:DevOpsに関するサービスは日々使うことも多く、また、学習時間もしっかりとれたこともあり、個人的な難易度としてはそこそこかなと感じました
- 7位:SAP取得済みのこともありますが、他の資格でもセキュリティに関することは学習対象にはいるため、あまり多くの時間を掛けずに臨めた点からも難易度に反映しています
- 8位:データベースは最近できた試験ですが、他資格での学習経験や実業務でデータベースを利用する機会も多いため、比較的スムーズに学習も進みました
- 9位:デベロッパーということもあり業務上でも利用することがあったため難易度は低めでした
- 10位:Alexaは自宅でも利用していますが、改めてAlexa道場を通じて楽しく学習できました
- 11位:SAPを取得済みの状況済みの背景もあるので少ない学習で取得できました
- 12位:SAPを取得済みなので、学習なしで臨みました
学習内容
序盤でAWS 認定ソリューションアーキテクト – プロフェッショナルの取得を目指した学習に多く時間を費やしたことで他の試験の学習量が抑えられた感じです
SAP以降の試験は、基本的に以下の流れでこなしました
- サービス理解のために、該当のBlackBeltや学習サイトで理解する
- 公式模擬試験を受ける
- 演習問題のサイトを活用する
ソリューションアーキテクト – アソシエイト
Amazonで下記の教科書を購入し読み込みました。
図解もあるので、理解しやすい内容でした。徹底攻略 AWS認定 ソリューションアーキテクト – アソシエイト教科書
- この本をじっくり読み理解する
- 実際にAWSのサービスを使ってやってみる
- 模擬問題を解く という流れで1ヵ月程度学習に取り組みました
また、AWS提供のサンプル問題も実施しました。
この資格が最初のAWS認定試験であったため、どの程度まで学習すれば良いかの感覚が分からない部分が不安でしたが、これから受ける方の参考になれば幸いです。
ソリューションアーキテクト – プロフェッショナル
私の中での最難関でしたが、 AWS WEB問題集を活用して、正解と不正解が理解できるまで繰り返しました。
各設問に対して、回答が日本語で解説されるので非常にわかりやすいと思います。
勉強期間は1ヵ月程度と思います。デベロッパー – アソシエイト 、 SysOps アドミニストレーター – アソシエイト
SAP同様に、AWS WEB問題集を活用しました。
SAPほど時間はかからずに理解できました。DevOps エンジニア – プロフェッショナル 、 セキュリティ 、 高度なネットワーキング
AWS WEB問題集の問題数がまだ多くなかったため、Udemyを利用しました。
また、認定試験に合格すると無料で模擬試験を受けれるバウチャーがもらえたので、これを活用して模擬試験も受けました。
模擬試験はその認定資格に対して1回のみしか受けられず、本番同様にどの問題に正解したか、不正解だったかはわかりませんが、理解を深めるためには有用でした。英語教材となりますが、ブラウザの翻訳機能を使ってそこまで不便なく解くことができました(問題の内容によっては英語に戻さないと意味が分からないこともあります)
セキュリティ、高度なネットワーキングのUdemyは購入したのですが、いざ受講しようとした際に非掲載となってしまったことがありました。また、実際に受講してみても誤答が多かった印象でした。データアナリティクス 、データベース 、Alexa スキルビルダー 、機械学習
Udemyの質、価格の面から、Whizlabsに切り替えました。
Whizlabsは、試験モード(全部の問題回答後に採点)と、練習モード(回答を選ぶ都度解説が見れる)があり、練習モードを繰り返しやることで理解を深めました。
Udemy同様に英語教材ですが、ブラウザの翻訳機能を駆使します。Alexaを理解するには、Alexa道場を実際にハンズオンして身に着けるのが早いと思いました。
おわりに
- それぞれの試験におけるより具体的なところは別途記事にしていきます
- より具体的に参照したBlackbeltやサイトも肉付けしていきます
- 聞きたいところがあればぜひ教えてください
- 投稿日:2021-03-21T20:03:21+09:00
CodePipelineでpush順にデプロイしたい
CodePipelineでデプロイすることに取り組んできましたが、リリースがたまると不都合が発生してきたので、その課題と回避策をまとめてみます。
現在の流れ
Commit -> Build -> マニュアル承認 -> Deploy
- CodePipelineは、main(master)ブランチをトリガーに動く
- CodeBuildでDockerイメージを作って、latestタグを付与している
- CodeBuildまで成功したら、マニュアル承認でデプロイを制御する
- CodeDeployで実行するスクリプトはlatestのイメージを使っている
課題:ブランチが複数回更新されると、更新順通りの最新(latest)がデプロイできない
- 1回目の更新で動くCodePipelineでデプロイのマニュアル承認前に、2回目のブランチ更新が来ると
- 2回目の更新に連動して、CodeBuildが動くので、latestイメージが更新される(ここが問題)
- この状態で、1回目のマニュアル承認すると、latestがデプロイされるので、1回目の更新に関するデプロイができない
回避策
Commit -> マニュアル承認 -> Build -> Deploy
- CodeCommitの次に承認を入れインバウンド実行を利用して、CodeBuildをシーケンシャルにさせることでlatestを保護し順番通りのデプロイを可能にする
考察
そもそも、「デプロイスクリプト、方針、設計がよろしくない」部分もありますが、運用に入るとすぐに変更できない都合もあり、回避策の一つとして参考になれば幸いです
- 投稿日:2021-03-21T20:02:57+09:00
gitlab-ceのレポジトリをAWS CodeCommitにミラーする
自前で管理しているgitlab-ceのレポジトリを、AWS CodeCommitにミラーリングした時の流れをまとめてみました。
今までは、EC2上にgitlab-runnerを走らせてCI/CDを頑張ってきましたが、主のプラットフォームをAWSに移していってるし、CI/CDはAWS側に寄せて行こうと思い、まずはレポジトリミラーリングから始めてみた。
- 受け側を作る(AWS CodeCommit)
- ミラーリング用IAM設定を行う(AWS)
- 送る側を設定する(gitlab-ce)
AWS CodeCommitの受け側を作る
AWS CodeCommitを開いて、「レポジトリを作成」を行います
- レポジトリ名は仮に「codecommit001」で作ると、以下のレポジトリURLが発行されるので、これをメモします(後で使います)
ミラーリング用IAM設定を行う
IAMポリシーの作成
- サービスは、CodeCommitを選択
- アクションは、GitPullとGitPushのみでOK
- ARNの編集で先ほど作成したcodecommitのレポジトリを指定します
IAMユーザーの作成
- ミラーリングに使うIAMユーザーを作成し、先ほどのポリシーを割り当てます
- 作成後に、IAMユーザーの認証情報タブで以下の認証情報を生成します(HTTPSでの認証の場合は、「HTTPS Git認証情報の作成」)
- ここで生成された、ユーザー名、パスワードを後で利用します
送る側を設定する
- gitlab-ceのミラーしたいプロジェクトの、「設定 > レポジトリ」を開き、以下のように、ミラー先のCodeCommitの情報を入力し、「レポジトリのミラー」を実行
反映確認
しばらくすると、以下のようにgitlab-ceのレポジトリがミラーされていることが確認できます。
この後は
ここまでできると、gitlab-ceのレポジトリの更新がCodeCommitにミラーされるので、CodePipelineで、CodeCommit/CodeBuild/CodeDeploy等によるCI/CDもできるようになりますね
- 投稿日:2021-03-21T20:01:27+09:00
自分のタグを取得するスクリプト<EC2編>
CodeDeployは、CodeBuildの様に環境変数がPipelineから指定できないので、AppSpecFileの中でデプロイ内容をタグの値に応じて制御したいような場合に有効活用できるかも知れません
- EC2インスタンス自身のメタ情報のインスタンスIDを取得する
- インスタンスIDを指定して、特定のタグの値を取得する
例えば、「TagNoNamae」の値を取得したい場合、以下の操作で取得できる
コマンド例AWS_REGION=ap-northeast-1 MYINSTANCEID=`curl -s http://169.254.169.254/latest/meta-data/instance-id` VALUE=`aws ec2 describe-tags --region $AWS_REGION --filter "{\"Name\":\"resource-id\",\"Values\": [\"$MYINSTANCEID\"]}" --query 'Tags[?Key==\`TagNoNamae\`][Value]' --output text` echo $VALUE※「TagNoNamae」の部分を変更することで他のタグの値が取得できます
- 投稿日:2021-03-21T19:55:18+09:00
AWS FSx for Lustre 一人スキルアップセミナー
利点
良さそうだと思った箇所を引用します。
使いやすい S3 データ
- S3 からのデータ転送を管理しなくてもワークロードを実行できる
- 最新のデータに基づいて、FSx for Lustre でファイルシステムが自動的に更新される
コスト効率が高い
- SSDストレージは、レイテンシーの影響を受けやすいワークロード向けに最適化されている
- HDDストレージは、スループット重視のワークロード向けに最適化されている
あらゆるLinuxワークロードのための設計
- ファイルシステムへは、EC2、EKS、Direct Connect、VPN を使用してオンプレミスからアクセス可能
シンプルでフルマネージド型
- AWS マネジメントコンソール、AWS CLI、AWS SDKでAmazon FSx for Lustre ファイルシステムを作成してスケーリング可能
安全性とコンプライアンス
- 保管中および転送中のデータを自動的に暗号化
- POSIX パーミッションやセキュリティグループを使用して、ネットワークアクセスを制御
- FSx for Lustre のバックアップが可能
ユースケース
- 機械学習
- ハイパフォーマンスコンピューティング
- メディア処理とトランスコーディング
- 自動走行車
- ビッグデータと財務分析
- 電子機器などの設計作業の自動化
触ってみよう
プライベートサブネットに立てたEC2からLustreにアクセスし、エクスポートやインポートをします。インポートではEC2からS3にエンドポイント経由でS3バケットにファイルをアップロードし、Lustreにインポートされるか確認します。
FSx for Lustre 作成
Lustreを選択します。
容量の選択をします。
指定したバケットにファイルが新規作成されたとき、または更新されたときにインポートされるようにしたいので、以下の設定にします。
Lustreインストール、マウント
以下を順に実行
file_system_idにLustreのid、mount_nameにLustreのマウント名で書き換えます。
sudo mkdir -p /mnt/fsx sudo yum update -y sudo amazon-linux-extras install -y lustre2.10 sudo mount -t lustre -o noatime,flock file_system_id.fsx.ap-northeast-1.amazonaws.com@tcp:/mount_name /mnt/fsxクライアントVPNエンドポイント作成
相互認証を利用してクライアントVPNエンドポイントを作成します。こちらの記事を参考にしました。
プライベートサブネット
ルートテーブルのルートからインターネットゲートウェイを外します。
エクスポート
ファイルをS3にエクスポートします。マウントポイント/mnt/fsx直下にファイルを作成し、エクスポートコマンド
lfs htm_archive
を実行します。$ sudo vi /mnt/fsx/test1.txt $ sudo lfs hsm_archive /mnt/fsx/test1.txt $ sudo lfs hsm_state /mnt/fsx/test1.txt /mnt/fsx/test1.txt: (0x00000009) exists archived, archive_id:1 $ aws s3 ls s3://test-lustre-202103210434 2021-03-20 20:00:04 14 test1.txtインポート
S3にファイルをアップロードすれば、Lustreの設定により自動でインポートされます。適当なサンプルファイルtest_upload.txtをバケット直下にアップロードします。
ここでアップロード用にS3エンドポイントを作成します。
作成後、プライベートサブネットからS3にファイルをアップロードできるようになります。まずは検索でs3と入力します。2つのエンドポイントの内タイプがGatewayの方を選択します。
VPCとルートテーブルを選択します。
ここではフルアクセスにチェックを入れますが、後で変更可能です。
エンドポイントの作成をクリックします。
ファイルをS3にアップロードします。
$ aws s3 cp test_upload.txt s3://test-lustre-202103210434 upload: ./test_upload.txt to s3://test-lustre-202103210434/test_upload.txtLustreにロードされたかどうかを
lfs hsm_state
で確認します。$ sudo lfs hsm_state /mnt/fsx/* /mnt/fsx/test1.txt: (0x00000009) exists archived, archive_id:1 /mnt/fsx/test_upload.txt: (0x0000000d) exists archived, archive_id:1simple AD でユーザー管理
ドメイン登録
ADをLinux環境で使うための準備をします。simpleADで作成したドメインは
test.net
であるとします。Amazon Linux2 インスタンスを起動します。ホームディレクトリにファイルを作成します。
$ sudo vi test.shtest.shsudo yum update -y sudo yum -y install sssd realmd krb5-workstation oddjob oddjob-mkhomedir sssd samba-common-tools sudo realm join -U Administrator@test.net test.net --verbose sudo sed -i -e 's/#PasswordAuthentication yes/PasswordAuthentication yes/' -e 's/^PasswordAuthentication no//' /etc/ssh/sshd_config sudo service sssd start sudo realm list sudo chmod 460 /etc/sudoers出力結果
test.net type: kerberos realm-name: TEST.NET domain-name: test.net configured: kerberos-member server-software: active-directory client-software: sssd required-package: oddjob required-package: oddjob-mkhomedir required-package: sssd required-package: adcli required-package: samba-common-tools login-formats: %U@test.net login-policy: allow-realm-logins作成したユーザーでLustreクライアントをインストールできるようにします。そのために
sudo
を実行できるようにします。/etc/sudoersに次のように1行追加します。変更前
## Allow root to run any commands anywhere root ALL=(ALL) ALL変更後
## Allow root to run any commands anywhere root ALL=(ALL) ALL Administrator@test.net ALL=(ALL:ALL) ALL再起動します。
sudo rebootADの管理ユーザーでログインします。
$ ssh -l Administrator@test.net 127.0.0.1 Administrator@test.net@127.0.0.1's password:以下のようにログイン出来たらマウントしてファイルを確認します。
[administrator@test.net@ip-172-31-46-49 ~]$ ls /mnt/fsx/ test1.txt test_upload.txt [administrator@test.net@ip-172-31-46-49 ~]$ sudo lfs hsm_state /mnt/fsx/* [sudo] password for administrator@test.net: /mnt/fsx/test1.txt: (0x00000009) exists archived, archive_id:1 /mnt/fsx/test_upload.txt: (0x00000009) exists archived, archive_id:1ユーザー作成
ec2-userに戻ります。パスワードを聞かれたときには、Administratorのパスワードを入力します。
$ sudo net ads user ADD lustre_user Lustre1! -C "lustre_user" -U Administrator@test.net -S test.net Enter Administrator@test.net's password: User lustre_user addedユーザー一覧を表示します。
$ sudo net ads user -S test.net -U Administrator@test.net Enter Administrator@test.net's password: AWSAdminD-95671C7C1C Administrator lustre_user krbtgt Guest作成したユーザーでログインする
Administratorのときとは異なりログインに失敗します。
$ ssh -l lustre_user@test.net 127.0.0.1 lustre_user@test.net@127.0.0.1's password: Permission denied, please try again.
service
コマンドのstatus
オプションでログを見ることができます。$ sudo service sssd status以下のようなエラーでログインに失敗しています。
Client's credentials have been revoked調べてみるとこちらの記事に原因が書いてありました。
ADでユーザーパスワードのリセットが必要でした。リセットすればログインできるようになります。マウントできていることも確認できました。
[lustre_user@test.net@ip-172-31-38-93 ~]$ sudo lfs hsm_state /mnt/fsx/* /mnt/fsx/test1.txt: (0x00000009) exists archived, archive_id:1 /mnt/fsx/test_upload.txt: (0x00000009) exists archived, archive_id:1参考記事
- 投稿日:2021-03-21T18:57:12+09:00
文系新卒エンジニアがAWS認定ソリューションアーキテクト – プロフェッショナルに一発合格した話
概要
まだぎりぎり文系新卒エンジニアを名乗れる社会人1年目の年度末。
この度AWS認定ソリューションアーキテクト – プロフェッショナル(以下SAP)に合格したので、アソシエイトのときと同様、合格体験記的なものを書いておこうと思います。
これからSAPを受験される方の参考になれば幸いです。対策
まず、SAP対策で何をしたか、ということをまとめます。
前提として、私は2020年12月下旬にSAA合格した後、すぐにSAP対策を始めました。
SAA対策で得た知識は100%残っている状態でのスタートだったので、今考えるとそれがよかったのかなあと思います。
それから約4か月での合格となりました。さて、その4か月で何をしたかですが、結論だけ言えば、2冊の書籍を読みました。
どちらも良著でしたので、紹介させていただきます。AWS認定ソリューションアーキテクト-プロフェッショナル~試験特性から導き出した演習問題と詳細解説~
1冊目。大変お世話になりました。
タイトルに「演習問題と詳細解説」とあるくらいなので、演習問題とその解説は非常に充実していました。
"なぜその選択肢が正解なのか"という点だけでなく、"ほかの選択肢がなぜ不正解なのか"という点にも触れられており、自然とSAPに求められる思考パターンが身に付きます。
難易度的にも丁度よかったです(むしろ本番の試験より少し難しいかも)。構成はこんな感じ。
第1章 AWS認定ソリューションアーキテクト-プロフェッショナル試験の概要と特徴
第2章 各種サービスの概要
第3章 試験で問われるシナリオの特性
第4章 「組織の複雑さに対応する設計」分野におけるケース問題
第5章 「新しいソリューションの設計」分野におけるケース問題
第6章 「移行の計画」分野におけるケース問題
第7章 「コスト管理」分野におけるケース問題
第8章 「既存のソリューションの継続的な改善」分野におけるケース問題
第9章 模擬試験第4章から演習問題に入っていくんですが、その前の第2章、第3章も非常に意義のある内容でした。
SAAとSAPでは、単純に押さえておくべきサービスの幅が広がります。
ですので、演習問題に入る前にそのギャップをある程度埋めておいてくれるのは非常に親切だなあと思いました。
※もちろん本に書いてあるサービスだけ押さえておけばそれでOK、ということでもないんですが。。あと模擬試験があるのもよかったです。
試験の1週間前に模擬試験を解いたら正答率が50%ちょっとでした。
それが最後の追い込みに繋がったかなと思います笑。どのように使ったか
本に書いてある内容だけでSAPを突破できるかといえば、ちょっと微妙です。
「この要件はこのサービスのこの機能使えば実装できるよ~」、、え、それで解説終わり??ということがちょいちょいありました。
何その機能初見なんだけど、、みたいな。
たとえば、パッケージソフトウェアのライセンス規約上インストール先のハードウェアが固定じゃないといけないときは、EC2の専有ホスト(Dedicated Hosts)を使えばいいんだよ~と書いてあって、何それ知らな~いとなるわけです。
軽く説明はしてくれているけど、いまいちピンとこない。そんなときは自力で調べました。
お世話になったのは以下。
・AWS公式ドキュメント
⇒たまに日本語の読解が困難なことがあるが、「公式」の安心感はすごい。絶対最新情報。
・DevelopersIO: クラスメソッド発「やってみた」系技術メディア
⇒公式の読解に困ったらクラメソさんに聞く。いつもありがとうございます。
・AWS サービス別資料
⇒通称ブラックベルト。YouTubeでサービスの紹介動画を視聴できるので、視聴覚的にサービスを理解できる。調べるといろんなことが分かります。
その専有ホストってやつは「テナンシー」(テナント属性)ってところで設定するのね!とか、テナンシーって共有(デフォルト)・専用(ハードウェア専有インスタンス)・専有ホストから選択できるんや!とか。
そこまでわかると、じゃあ専有ホストと専有インスタンスの違いって何??となって、また調べます。
また、テナンシーについてさらに調べていくと、さらにVPCでもテナンシーの設定できることを知ったりします。
もはや沼・・・笑。こんな感じで、本で出てきたわからないポイントを調べ、ある程度腑に落ちたら、頭の中で整理し、本の余白に書き込む、ということをしていました。
試験前にはオリジナルの参考書っぽくなってて、テンションが上がります。
やっぱり紙の本の方が好きやなあ。
Amazonのリンクはこちら。AWSの薄い本 IAMのマニアックな話
2冊目。
直接SAPの対策につながる本ではないのですが、私自身IAMの理解がいまいちだったので購入しました。
もともとは、AssumeRoleとか意味わからんし、SCPとかリソースベースのポリシーとか、え?IAMポリシーと何が違うんですか?というような状態でしたが、この本を読んで、なんとなくその辺りが理解できたと思います。構成はこんな感じ。
はじめに
第1章 AWS と IAM
第2章 IAM の機能
第3章 IAM チュートリアル
第4章 IAM ポリシーのデザインパターン
第5章 IAM グループのデザインパターン
第6章 IAM とセキュリティ
第7章 IAM の運用
第8章 IAMとCloudFormation
第9章 IAMのテンプレート集
第10章 IAM以外のAWS サービスの活用
付録 A アカウント開設時の設定チェックリスト見事なIAM縛り・・・笑。
逆にIAMだけで本一冊書けるんやなあ、IAMぱねえなあと思いました。この本は全体を通してベストプラクティスに則った記述、解説がなされています。
要件を満たすためには様々な選択肢があって、全部機能的には可能だけど、その中でどれを選ぶのがいいのか。
そのような観点からIAM(というよりポリシー設計)について勉強できるので、非常に役に立ちました。当然SAPでもIAMに関する問題は多く出てきます。
「AWS では、クラウドのセキュリティが最優先事項です」とのことですので、それはもうややこしい問題が出題されます。
IAMの理解は必須と言っても過言ではありません。どのように使ったか
通勤中に読んでいました。
「薄い本」なのでサラサラっと読めます。
画像も多く、実際のマネジメントコンソールのキャプチャやポリシー設計のイメージ図などが多く掲載されていました。
それを見て、イメージを膨らませていました。この本を読めば「IAMマニアの称号」が手に入るそうです。
是非。
リンクはこちら。試験のコツ的なもの
あくまで個人的なものですので、ご参考までに。
①キーワードを探す
SAPの問題はとにかく冗長です笑。
長い問題文の中から重要なキーワードを見つけることが選択肢の絞り込みに繋がります。例えば「サーバレスアーキテクチャ」。
これが出てきた時点で、EC2とかRDSとか書かれている選択肢は除外することができます。
直接「サーバレス」と書かれていなくても、「高可用性」で「費用対効果が高い」アーキテクチャであれば、それすなわちサーバレス、と考えることもできます。「グローバルに配信」とくればCloudFrontの利用はほぼ確実です。
CloudFrontはAWS Shield Standardがデフォルトで有効化されており、またエッジロケーションからの配信となることから高い可用性を実現できます。「IoTデバイス」や「リアルタイム」とあれば真っ先にKinesisの利用が頭に浮かびます。
KinesisはData StreamsかData Firehoseかで悩むことが多いですが、他に「S3」「RedShift」「Elasticsearch」といった記述があれば、Firehoseかな?と考えることができます。こういう例って結構ありますよね。
キーワードを見つけ、楽に選択肢を絞っていくことがSAPの3時間75問耐久を潜り抜ける術だと思います。②プロジェクトで重視されているポイントを把握する
SAPの問題形式として多いのが、「あなたはソリューションアーキテクトで、クライアントからこんな相談を受けています」パターンです。
SAAでは4つの選択肢の中で実現可能なものが1つしかなく、それが正解、というケースが多かった印象ですが、SAPでは、え、この選択肢やろうと思えば全部やれるんじゃね?となることがよくあります。その時考えなくてはいけないことは「クライアントが何を重視しているか」です。
例えば、オンプレミス環境とAWS環境をつなぎたい、という要件を考えます。
このとき、「安定した」「セキュアな」通信が欲しいなら、答えはDirect Connectになりますし、「低コストで」「なる早で」通信できるようにしたいならVPNになります。
何をもってプロジェクト成功とするのか、という情報はチェックするようにするのがいいかと思います。①で選択肢を絞り、②で決める。
そんな感じで解き進めるのがコツです。所感
3時間耐久は体力的にきつかった。
エンジニアって体力も必要なんやなと感じるこの頃です。あと、これが文系新卒エンジニアを名乗れる最後の投稿かと思うとしみじみします笑。
未経験でIT業界入ってAWSを触る21卒の人たちに、頑張れば1年目でSAPまで行けると伝わればいいなあ。
それではまた。
- 投稿日:2021-03-21T17:21:09+09:00
EC2にJavaWebアプリ環境を構築 #2
EC2にJavaWebアプリ環境を構築 #1
EC2にJavaWebアプリ環境を構築 #2
EC2にJavaWebアプリ環境を構築 #3
EC2にJavaWebアプリ環境を構築 #4目次
1.はじめに
2.インストールはじめに
ざっくり説明するとeclipseで作ったアプリをEC2で動かす
- 前回
- インスタンスの作成が完了
インストール
JDK
開発環境と同じjdk11を使用する
インストールはamazonが提供しているパッケージからおこなうインストール
sudo amazon-linux-extras install java-openjdk11 -y-y というコマンドは全部yesと回答するオプションみたいなやつなのでコマンドを打てばインストールが完了する
java -version
でバージョン確認が可能
nginx
WEBサーバはnginxを使用
Apacheでも可能だが私は、
nginxのロゴがカッコイイ
という理由からnginxを採用小規模なアプリを稼働させるくらいなので好みで選んで良いと思う
インストール
sudo amazon-linux-extras install nginx1 -ynginxの起動と自動起動の設定も行う
#起動 sudo systemctl start nginx #自動起動 sudo systemctl enable nginx基本的には最新版がインストールされる(多分)
ステータス、バージョン確認は下記コマンド
#ステータス確認 systemctl status nginx #バージョン確認 nginx -vnginxをインストールできたらアクセスしてみる
インスタンス画面から
パブリックIPv4 DNSをコピーしアクセス
Tomcat
記事では最新のver.10を使用する
ver.9などでも基本的にやり方は変わらないので真似してOK(だと思う)雑だが10と9の違いは
//Tomcat 10 import jakarta.servlet //Tomcat 9 import javax.servletインポートの記述が違うこと
あとファイルの配置が違うくらい公式サイトより
- Core
- tar.gz
のリンクをコピー
ダウンロード
wget https://downloads.apache.org/tomcat/tomcat-10/v10.0.4/bin/apache-tomcat-10.0.4.tar.gzURLはコピーを貼り付ける
下記コマンド入力
ver.9をダウンロードした場合は
tomcat-10を
tomcat-9に変更するのが良いと思う#解凍 tar -xzvf ~/apache-tomcat-10.0.4.tar.gz #ファイル移動&リネーム sudo mv ~/apache-tomcat-10.0.4 /opt/tomcat-10 #Windowsでいうショートカット作成 sudo ln -s /opt/tomcat-10 /opt/tomcat #ユーザー追加 sudo useradd -s /sbin/nologin tomcat #所有権変更 sudo chown -R tomcat:tomcat /opt/tomcat-10 #viが起動する sudo vi /etc/systemd/system/tomcat.service【vi操作(適当)】
「i」→「貼り付け」→「ESC」→「:wq」→「エンター」Ver.10
[Unit] Description=Apache Tomcat 10 After=network.target [Service] User=tomcat Group=tomcat Type=oneshot PIDFile=/opt/tomcat-10/tomcat.pid RemainAfterExit=yes ExecStart=/opt/tomcat-10/bin/startup.sh ExecStop=/opt/tomcat-10/bin/shutdown.sh ExecReStart=/opt/tomcat-10/bin/shutdown.sh;/opt/tomcat-10/bin/startup.sh [Install] WantedBy=multi-user.targetVer.9
[Unit] Description=Apache Tomcat 9 After=network.target [Service] User=tomcat Group=tomcat Type=oneshot PIDFile=/opt/tomcat-9/tomcat.pid RemainAfterExit=yes ExecStart=/opt/tomcat-9/bin/startup.sh ExecStop=/opt/tomcat-9/bin/shutdown.sh ExecReStart=/opt/tomcat-9/bin/shutdown.sh;/opt/tomcat-9/bin/startup.sh [Install] WantedBy=multi-user.targetvi終了後
#実行権限付与 sudo chmod 755 /etc/systemd/system/tomcat.service #起動 sudo systemctl start tomcat #自動起動 sudo systemctl enable tomcatステータス確認は下記コマンド
systemctl status tomcatTomcatをインストールできたらアクセスしてみる
nginxと同様、パブリックIPv4 DNSアドレスを入力し、
末尾に「:8080」を追加する#イメージ http://amazonaws.com:8080
長くなってきたのでここまで
参考サイト
- 投稿日:2021-03-21T17:15:05+09:00
/dev/loopに容量が圧迫されてrails testができない問題...
cloud9のterminalでrails testを実行しようとしたら何と12ものエラーが...
備忘録として、またその他どなたかのお役に立てればと思い、記事を書いていきます。
キャプチャを失念しており、ほとんど文章での説明になりわかりにくいかと思いますが、ご容赦のほどお願いいたします。
では、書いていきます!【1.状況】
AWSでrails testの実行時に12ものエラーが発生し、以下のメッセージが登場。
⇒ Error:「No spacd left on device」
【2.状況分析】
→ 上記1.について色々調べていくと、どうにも容量不足のようです。容量不足とは、主に以下2つのいずれかを指します。
① ディスク容量の不足
② 「inode」の容量不足ここで、「inode」とは要するに、ファイル情報(誰が、いつetc...などのプロパティ的な
情報)を管理するためのデータであるとのこと。従って、この2つの内、どちらが原因であるのかを見極めることが必要です。
それぞれ、以下に示すコマンドをterminalで実行すれば、容量が確認できます。
・ ①の場合
2-1) $ df
・ ②の場合
2-2) $ df -i
その結果、私の場合、②のパターンであることが分かりました。内容を見ていくと、以下5つのディレクトリが使用率100%と判明。。。
・/dev/xvda1
・/dev/loop1
・/dev/loop2
・/dev/loop3
・/dev/loop4と分かれば、これらディレクトリを消去すればよいことになります。
【3.対策】
ターミナルで以下コマンドを実行すれば、ディレクトリを消去できます。$ sudo rm -d ディレクトリ名
今回の場合、/dev以下の階層を消去すれば良いので、
3-1) $ sudo rm -d /dev
を実行。 ※ rmはremove、dは(おそらく)ディレクトリの略これで、完了…と思いきや/devに格納されている全部のファイルに
以下のエラー発生。
Error:Operation not Permittedこの事象について調べていくと、どうにも上記2.の/devディレクトリに
ファイルを実行する権限が与えられていないことが原因であるとのこと。そこで、/devディレクトリにファイルの実行権限を与える操作を行います。
そのためのコマンドを以下示します。
$ sudo chmod モード ファイル名(ディレクトリ名)ここでいう、モードとは3桁の数字abcであるとのこと。
a:「所有者」の権限
b:「所有グループ」の権限
c:「その他」ここで、abcの各桁には以下数字の合計値が入ります。
モード(数字) モード(アルファベット) 権限
4 r 読み取り
2 w 書き込み
1 x 実行つまり、実行だけが必要なら1、読み取りと実行が必要なら4+1=5、
何も必要なければ、0が入ります。今回は、「所有者」と「その他」に全機能を付与したかったので、707としました。
従って、以下3-2)のコマンドをターミナルで実行しました。
3-2) $ sudo chmod 707 /devそして、再び3-1)を実行した後に2-1)を実行し、
フォルダ内を確認します。以下の画像のように/devが消去され、容量が開放されたと思われます。
エラーがなくなり、晴れて問題が解消されました。
以上となります、イメージがつきにくかったかもしれませんが、ご参考になりますと幸いです。
それでは、また!参照先
https://qiita.com/shisama/items/5f4c4fa768642aad9e06
https://mem-archive.com/2019/07/28/post-1976/
https://itojisan.xyz/trouble/15772/#2_inode
https://www.souichi.club/aws/out-of-disk-space/
- 投稿日:2021-03-21T17:07:50+09:00
AWSのサービスまとめ
AWSのサービスを調べた時のメモ。
間違いがあれば教えてもらえると助かります。ネットワーク
- VPC
- 仮想ネットワーク
- CloudFront
- Route 53
- API Gateway
- APIのエンドポイントを提供(ざっくり)
AWS Service Step FunctionsやSQS、Lambda、エンドポイントを呼び出す
30秒でタイムアウトするなどの制約がある
コンピューティング
- EC2
- 仮想サーバー
- Lambda
- サーバーレスコンピューティングサービス
PHPの実行にはbrefが便利ストレージ
- S3
- オブジェクト型のストレージサービス
IAMポリシーとバケットポリシーでアクセス制御が可能
独自ドメインを使用して静的Webサイトの公開が可能
- AWS Transfer Family
- SFTP,FTPS,FTPを使用した、S3やEFSへのファイル転送エンドポイント
Publicのものを作成することで誰でもアクセス出来るエンドポイントを作成する
VPC内に作成することでネットワークACKやセキュリティグループでアクセス制御が可能
ログを出力する場合はIAMロールを設定する必要がある
エンドポイント毎にユーザーを作成することが可能で、下記の内容を設定可能
スコープダウンポリシー・・・接続先のアクセス範囲を制限
ホームディレクトリ・・・ログイン時のフォルダ
Ristricted・・・ホームディレクトリ以外にアクセス出来なくする
SSHの公開鍵・・・複数設定可能
データベース
- RDS
- マネージドリレーショナルデータベース
Aurora PostgreSQL MySQL MariaDB ORACLE SQLServer
- ElastiCache
- インメモリデータベース
Redis Memcached開発者ツール
- CodeCommit
- ソース管理
- CodeBuild
- Dockerコンテナを立ち上げてアプリのビルドを行う
ビルド結果はS3に保存することが可能 buildspec.yml
- CodeDeploy
- EC2やLambdaへのデプロイが可能 appspec.yml
- CodePipeline
- 上の3つを連携させることが可能
管理
- Amazon CloudWatch
- AWSリソースを分析、監視する
リソースのモニタリングやログの集約、監視を行う
- Cloud Watch エージェント
- AWS Systems Manager
- AWSで使用しているインフラストラクチャを可視化し、制御するためのサービス
Run Command・・・
ステートマネージャー・・・
インベントリ・・・
メンテナンスウィンドウ・・・
パッチマネージャー・・・
オートメーション・・・
パラメータストラ・・・情報を暗号化して保存することも可能
ドキュメント・・・
- AWS Systems Manager エージェント
- CloudFormation
- インフラのコード管理
セキュリティ
- IAM
- AWSリソースへのアクセスをユーザー、グループ、ロール、ポリシー単位で管理する
ユーザーにはグループ、ポリシーを設定可能
グループにはポリシーを設定可能
ロールにはポリシーを設定可能
ポリシーではアクセス可能なリソース、操作、実行範囲、その他条件を設定可能- AWS WAF
- アプリケーションの通信をフィルター、監視、ブロックする
AWSのマネージドルールの他に自分でルールを作成して使用することも可能
CloudFront, ALB, API Gatewayに設定する- セキュリティグループ
- インバウンドルールとアウトバウンドルールを設定して通信を制御する
IP, プロトコル, ポート番号で通信をフィルタルングを行う
EC2などのインスタンスやエンドポイントに設定する
- 投稿日:2021-03-21T16:56:10+09:00
AWS CLIで(InvalidAccessKeyId)のエラーで詰まってた話
悩まされたエラー文
An error occurred (InvalidAccessKeyId) when calling the ListBuckets operation: The AWS Access Key Id you provided does not exist in our records.
経緯
- AWS CLIをインストールし
aws configure
で初期設定をしました。AWS Access Key ID [None]: ****** AWS Secret Access Key [None]: ****** Default region name [None]: ap-notheast-1 Default output format [None]: json
aws s3 ls
でアクセスできるか確認したところ、アクセスできなかったため修正方法を確認(リージョン名の綴りを間違えてましたap-notheast-1ではなくap-northeast-1)このリージョン間違いが悪夢の始まり
上記サイトを参考に
rm -r .aws
を実行再度IAMでアクセスキーを作成しコピペ、リージョン名もコピペ
全部あってるはずなのにアクセスキーが無いというエラーが出る(2、3時間公式のドキュメント見たりバージョン違いかと思ってインストールし直したり…
rm -r .aws
とアクセスキー作成10回ほどやりました…笑)
aws configure list
で登録されてる内容確認% aws configure list Name Value Type Location ---- ----- ---- -------- profile <not set> None None access_key ****************3JQ7 env secret_key ****************vnOS env region ap-northeast-1 config-file ~/.aws/configaccess_keyとsecret_keyが直前に設定したものと違うことに気づく
Locationも公式のドキュメントで見たものと違うようでどこに保存されてるかわからない…
どなたかわかる方いらっしゃいましたらコメントお願いします。今回のエラー解決?
- 初期設定の
aws configure
をaws configure --profile ユーザー名
で作成% aws configure --profile ユーザー名 AWS Access Key ID [None]: ****** AWS Secret Access Key [None]: ****** Default region name [None]: ap-northeast-1 Default output format [None]: json
aws --profile ユーザー名 s3 ls
でアクセスできた!% aws --profile ユーザー名 s3 ls 2021-03-21 13:26:25 ****** 2021-03-21 13:24:15 ****** 2021-03-21 13:31:26 ****** 2021-03-20 14:31:04 ******解決に至った参考資料
補足
% aws configure list Name Value Type Location ---- ----- ---- -------- profile <not set> None None access_key ****************3JQ7 env secret_key ****************vnOS env region <not set> None None% aws configure list --profile ユーザー名 Name Value Type Location ---- ----- ---- -------- profile ユーザー名 manual --profile access_key ****************FAFS shared-credentials-file secret_key ****************Zf7u shared-credentials-file region ap-northeast-1 config-file ~/.aws/config解決後確認してみたらこのようになってました。後々解決できればと思ってます。
- 投稿日:2021-03-21T15:44:26+09:00
【SAA試験対策】EC2 インスタンスタイプについてまとめてみた
概要
SAAの模擬試験対策の自分用のメモ
EC2のインスタンスタイプが覚えれないのでまとめてみましたネーミングポリシーについて
インスタンスタイプの表記は以下の通り
[ファミリー][世代](追加機能).[サイズ]t2.microの場合
t:ファミリー
2:世代
micron:サイズ
となる・世代・・新しい方が高性能でコストパフォーマンスも高いため、極力最新世代のインスタンス利用が推奨されている
・サイズ・・以下のネーミング順で大きくなる。サイズが1段大きくなるにつれ、vCPU、メモリのサイズが倍もしくはインスタンスサイズ名の係数に応じて倍増、価格もそれに比例して増加するnano→ micro→ small→ medium→ large→ xlarge→ 2xlarge→ 4xlarge・‥インスタンスファミリー
汎用、コンピューティング最適化、メモリ最適化、ストレージ最適化、高速コンピューティングの5つのカテゴリに分類されるため、処理するワークロードに合わせて選択する
カテゴリ 特徴 ユースケース ファミリー 汎用 CPU・メモリ・ネットワークのバランスが取れている 開発環境、Web、マイクロサービス T,M,A,Mac コンピューティング最適化 計算パフォーマンスが高い 高性能Webサーバ・バッチ処理、科学モデリング、機械学習、広告配信、ゲーム C メモリ最適化 メモリ量が多くて高速処理が可能 ハイパフォーマンスDB、インメモリDB、ビックデータ処理 R,X,z ストレージ最適化 ストレージアクセスが速い(=I/Oパフォーマンスが高い) 分散ファイルシステム、NoSQLデータベース、Apache Kafkaなどのログ分析 I,D,H 高速コンピューティング GPU(スーパーCPU)が搭載 機械学習、深層学習 P,G,F,Inf 汎用
ファミリー 覚え方 特徴 T Turbo(ターボ) CPUクレジットを蓄積し、必要な時だけバーストさせる機能をもつ M Middle(バランスが良い中間) さまざまな場面で利用可能。全インスタンスファミリーの中で基準となる A Arm 通常より最大45%コスト削減できるArmプロセッサをもつ Mac Mac(そのまんま) Apple Mac mini をもつ コンピューティング最適化
ファミリー 覚え方 特徴 C Compute 計算パフォーマンスが高い メモリ最適化
ファミリー 覚え方 特徴 R RAM(Random Access Memory) メモリ最適化 X メモリのメ=X(無理やり) EC2インスタンスの中でメモリあたりの価格が最も低い z 周波数H z 高速な最大 4.0 GHz の持続的な全コア周波数を提供 ストレージ最適化
ファミリー 覚え方 特徴 I I/O 低レイテンシー、極めて高いランダム I/O パフォーマンスのSSDをもつ D H DD 最大48TBのHDDをもち、高ディスクスループットを実現する H High disk throughput 最大16TBのHDDをもち、高ディスクスループットとバランスの取れたCPU・メモリをもつ 高速コンピューティング
ファミリー 覚え方 特徴 P G PU 汎用 GPU 搭載 G Graphic グラフィックスなどの画像描写に最適化 F FPGA FPGAカスタマイズ可能 Inf Inference(推論) 機械学習の推論に最適化 GPU(Graphics Processing Unit)・・グラフィックス処理や画像処理に適した内部構造を持つプロセッサ
FPGA(Field Programmable Gate Array)・・ デバイス内の電子制御機能の大部分を変更できる半導体 IC参考
詳細は公式サイトをご確認ください
- 投稿日:2021-03-21T15:16:33+09:00
AWS Fault Injection Simulator (FIS)
AWS Fault Injection Simulator
わざと障害を発生させて、復旧のテストをし、実際の復旧に備えるためのツールになります。
所謂、カオスエンジニアリングサービスになります。対象のリソースとアクション
随時更新されるかと思いますので、ドキュメントを参考にしましょう。
今回指定するリソースとアクションは、
aws:ec2:stop-instances
にしてみます。やってみる
EC2インスタンスの1つを停止し、次に両方のインスタンスを停止する実験テンプレートを作成してみます。
基本的な手順としては、実験テンプレートを作成 → 実験する
IAMロール
まずは、ドキュメントの通り、FISサービスがユーザーに代わってアクションを実行する権限を付与するIAMロールを作成しておきます。
CloudWatchアラーム
Cloudwatch アラームがトリガーされた場合に実験を停止するといったこともできますが、今回この停止条件を指定しないものとします。
実験テンプレートを作成する
説明とアクセス許可
適当な「説明」と先程作成した「IAMロール」を指定。
アクション1
「名前」に適当なアクション名を入力、「アクションタイプ」は "aws:ec2:stop-instances"、「アクションパラメータ」は ”5” とします。
ターゲット
「ターゲット」に適当なターゲット名を入力、「リソースタイプ」は "aws:ec2:instance" を選択。
「ターゲットメソッド」で、リソースIDを選択し、「選択モード」は ”数”、「リソースの数」は ”1” とします。
「ターゲット」に適当なターゲット名を入力、「リソースタイプ」は "aws:ec2:instance" を選択。
「ターゲットメソッド」で、リソースIDを選択し、「選択モード」は ”すべて” とします。
アクション2
「名前」に適当なアクション名を入力、「アクションタイプ」は "aws:ec2:stop-instances"。
「次の後開始」では、アクション1で作成したものを指定し、「ターゲット」は、ターゲットで作成した2つ目のターゲットを指定します。
「アクションパラメータ」は ”5” とします。
停止条件
先述の通り、今回は指定しないものとします。
実験
実験結果の、状態については、ドキュメントを参考に。
- 投稿日:2021-03-21T15:00:12+09:00
EC2にJavaWebアプリ環境を構築 #1
EC2にJavaWebアプリ環境を構築 #1
EC2にJavaWebアプリ環境を構築 #2
EC2にJavaWebアプリ環境を構築 #3目次
1.はじめに
2.EC2インスタンス起動、設定
3.接続、初期設定はじめに
EC2にJavaで作ったアプリを動かす環境を構築しようと思う
開発環境は
- Windows10
- IDEはeclipse(pleiadesのjavaのやつ)
- java11
- Tomcat10
- データベースはXamppのMySQLを利用
ざっくりいうとこんなかんじ
試していないけどMacでもやり方は同じだと思うEC2インスタンス起動、設定
ECインスタンスを起動
構成設定は基本的に変更しなくてOKだが、セキュリティグループのみ追加
- HTTP
- HTTPS(今回はなくてもOK)
- MYSQL/Aurora(データベース使わないならいらない)
- カスタムTCP:ポート範囲8080
キーペアを設定する必要がある
今回はsampleを作成キーペアは
C:\users\ユーザー名
に保存しておくと楽かも接続、初期設定
作成したインスタンスに接続するため
パブリックIPv4をアドレスをコピー
コピーしたら接続するため、
Windowsならコマンドプロンプト、
Macならターミナルを起動外部ソフトを使ったほうが楽だが、今回の作業量はそこまで多くないのでとりあえずこれで
起動したら以下を入力
ssh -i sample.pem ec2-user@パブリックIPv4sample.pem
各自作成したキーペア名で入力する
また、「C:\users\ユーザー名」にファイルを置いていない場合、
パスを入力してもできる(以下参照)ssh -i C:\~~\~~\sample.pem ec2-user@パブリックIPv4パブリックIPv4
先程コピーしたアドレスを入力する初回接続時、
Are you sure you want to continue connecting (yes/no)?
と聞かれるのでyesを入力
接続成功すると
[ec2-user@ip- ~] $
と切り替わる初期設定的な作業をしていく
文字のペーストは右クリックでできる
- パッケージ更新
sudo yum update -y
- 自動更新設定
sudo yum install yum-cron -y sudo vim /etc/yum/yum-cronviというエディターが起動する
「i」を押して文字入力に切り替え、apply_updates = yes
を貼り付けたら
「ESC」を押して「:wq」でエンター#yum-cron起動 sudo systemctl start yum-cron #yum-cron自動起動設定 sudo systemctl enable yum-cron
- 時間設定等
#タイムゾーン変更 sudo timedatectl set-timezone Asia/Tokyo #日本語追加 sudo localectl set-locale LANG=ja_JP.UTF-8 sudo localectl set-keymap jp106
参考サイト
- 投稿日:2021-03-21T13:48:06+09:00
開発効率をあげるための半年間の取り組み
所属するチームのプロダクトローンチから半年、ここ半年でチームの開発効率を上げるためにやってきたことを振り返りたいと思います。
ローンチまではとりあえず完成物を世に出すことを目的にやってきたため、過去の別プロダクトの社内資産(インフラの設定ファイルやDockerfileなど)を使い回していたのですが、2,3年も経つと各種のツールはより便利になっているしインフラもかなり進化しています。
インフラの変更といった大きいものから日々の業務の細かい改善まで粒度はバラバラですが、取り入れてきたものを挙げてみます。
小さい改善
Githubのイシューを自動クローズするようにした
弊社の開発チームではGithub上でイシューを管理しています。
今までイシューの対応が完了するたびに手動でクローズしていて無駄だったのですが、コミットにGithub指定のキーワード
+イシュー番号
を入れるだけで、プルリクエストがマージされたら自動でクローズできます。git commit -m "fix #i100"commitlintを入れた
メンバーがコミットにイシュー番号を必須で入れてもらうためにcommitlintを入れました。
大きい改善
デプロイをシェルスクリプトからGithub Actionsに変更した
以前は踏み台サーバーにリリース用のシェルスクリプトを置いておき、Githubから踏み台にプルしてリリースしていました。リリースのために踏み台にsshしたり手作業でデプロイする手間がかかっていました。
後述するインフラのECSへの変更により、CIの導入が容易になったため、リリース方法はGithubActionsに変更しました。
stageブランチにマージしたらステージ環境に自動リリース、本番リリースについてはマージベースだと事故が起きる可能性があるのでGithub上でバージョン番号をタグ付けしたらリリースするようにしています。
Github主体で開発している場合、Githubでのイベントを細かくトリガーにできるところはActionsを使う大きいメリットだと思います。Githubでプルリクエストをマージ→GithubActionsでビルド→CodeDeployでECSにブルーグリーンデプロイという流れは本当にスムーズで見ていて気持ちいいです。
Githubでタグ付けしたバージョン番号をそのままDockerのタグ名に使うと、ECR上でのバージョン管理が容易になります。
インフラをECSに変えた
以前は社内で運用経験のあったAWA Elastic BeanstalkでDockerコンテナを稼働させていました。
Beanstalkはソースコードをデプロイするだけでアプリケーションを稼働させられるのでこれはこれでメリットはあったのですが、デプロイ後に旧環境と新環境のスワップ作業が発生するなど、CIを含めた全体の開発プロセスを効率化するにはサービスとして物足りない部分がありました。元々Dockerを導入できていたこともあり、コンテナ運用に特化したECSへの変更を行いました。サーバー管理もやめたかったのでEC2ではなくサーバレスのFargateを採用しています。
まだ試行錯誤で運用している段階ではありますが、すでに変更によるメリットが色々ありました。具体的には以下のようなことです。
- CIツールを入れた開発プロセスの全体構築が劇的にスムーズになった
- CIの導入によりリリース作業が自動化できたことで、今まで週一回しかできていなかったリリースを毎日行えるようになった
- 一回のリリースの変更範囲が小さくなったことで、影響範囲を把握しやすくなり、万一リリース後に不具合が見つかってもすぐに原因特定できるようになった
- サーバーの管理をしなくて良くなった
- 負荷に応じたDockerコンテナの増減が容易になった
- 検索した時の情報量がBeanstalkに比べて圧倒的に豊富なため、課題が発生した時の対処や心理的負担がかなり軽減した
- 開発プロセスがモダンになったことで自分含めメンバーのモチベーションが上がった(これはチームの様子を見ての個人的感想)
さらに、サーバレスになったことで今後コストメリットも期待できるのではと思います。
ECSの導入に当たっては、AWSのセミナー映像や資料をかなり参考にさせていただきました。神様!!CodeDeployのブルーグリーンデプロイを入れた
ブルーグリーンデプロイ自体はBeanstalkを使っていた時から行なっていました。
しかしながらBeanstalkでは、Lambdaで切り替え処理を別途用意するなどしない限り、新環境と旧環境の切り替えや一定時間後の旧環境の終了などが自動で行えませんでした。ECSはCodeDeployと連携しているため、これらの作業を痒いところに手が届くようにやってくれます。
- 事故がおきた時のロールバックがボタン一つで簡単にできる
- 旧環境は指定時間経過後自動で終了できる
- トラフィックが切り替わるタイミングも非常にわかりやすいです↓
なお、CodeDeployとECSを組み合わせたデプロイプロセスの構築に当たってはクラスメソッドさんの資料を大いに参考にさせていただきました。
Cloudformationでインフラをテンプレート化した
ECSの環境を今後簡単に再現できるようにするために、ECS環境を作るに当たってはCloudformationで構築しました。
ロードバランサー、S3バケット、Cloudwatchのロググループ、VPCのセキュリティグループなどなど、プロダクトを構成するインフラを関連付けグループ化できるので、後から一つ一つのリソースを見たときに「これは何に使われているものだ??」「間違って削除」みたいなことが起きづらくなりました。
ただし、インフラ稼動後にテンプレートと実際のインフラの状態を完璧に一致させ続けることは難しく、ここは最初のプロビジョニングのみに利用するにとどまっています。
こちらもクラスメソッドさんのブログに本当に助けられました!!
今後試したいことリスト
世の中の会社のブログなど見聞きしているとまだやれることはありそうです。やってみてダメだったら捨てる感じで色々手を加えたい。
CodeDeployのテストリスナーを使う
CodeDeployではテストリスナーを設定できます。例えばリリース時、新環境に切り替える前に、トラフィックは旧環境に向けたまま同じデータ8080ポートで新環境を試すといったことができるみたいです。
CodeDeployでリリース状況をチャットに流す
CodeDeployのトリガーを使うとデプロイステータス随時SNSに通知できるので、それをLambda経由で開発者向けにSlack、ビジネスサイドにもChatworkへ通知する。
GithubActionsをもっと活用する
先日この記事を拝見し、もっと日々の業務改善に使えそうな感じがしました。
GitHub Actionsで日々の小さな作業を自動化するステージ環境を使っていない夜間・休日は自動でコンテナの数を0にする
こちらもクラスメソッドさんのブログで拝見しました。
検証環境のFargateのタスクを定期停止・定期起動してみた
あまり大きいコストメリットはないかもしれませんが、少ない予算で回しているチームのため、できることはやろうという感じです。終わり
改善していく作業、自動化していく作業は楽しい!
- 投稿日:2021-03-21T12:40:55+09:00
docker-compose.ymlでのECSタスク定義方法
2020/7にdokcer-compose形式のyamlファイルからECSのタスク定義ができるようになったのですが、まだまだ実用している例が少なかったので、実際にwebアプリケーションのデプロイ時に作成した際の注意点を残しておきます。Fargateインスタンスタイプでの利用例となります。
前提
docker-compose形式のファイルでタスク定義する際には、下記のファイルが必要になります。
docker-compose.yml
- コンテナ定義を行うためのファイル。通常のDocker利用時とほとんど同じだが、一部ECSで対応していない項目があるため、ECS用に修正する必要がある。
ecs-params.yml
- docker-compose.ymlだけでは設定しきれないタスク、サービスの設定を行う。
設定例
今回作成したアプリケーションは、db, api(Django), nginx, vueの4コンテナで構成されます。
docker-compose.yml
docker-compose.ymlversion: '3' services: db: image: postgres ports: - "5432:5432" environment: - POSTGRES_DB=postgres - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres volumes: - db_efs:/var/lib/postgresql/data logging: driver: awslogs options: awslogs-group: test awslogs-region: ap-northeast-1 awslogs-stream-prefix: db api: image: [ECRのイメージURL]:[タグ名] command: /bin/sh -c " ./entrypoint.sh;" env_file: - ./api/.env ports: - 8000:8000 logging: driver: awslogs options: awslogs-group: test awslogs-region: ap-northeast-1 awslogs-stream-prefix: api vue: image: [ECRのイメージURL]:[タグ名] ports: - "8080:8080" logging: driver: awslogs options: awslogs-group: test awslogs-region: ap-northeast-1 awslogs-stream-prefix: vue nginx: [ECRのイメージURL]:[タグ名] image: ports: - 80:80 logging: driver: awslogs options: awslogs-group: test awslogs-region: ap-northeast-1 awslogs-stream-prefix: nginx volumes: db_efs:ecs-params.yml
ecs-params.ymlversion: 1 task_definition: task_execution_role: ecsTaskExecutionRole ecs_network_mode: awsvpc task_size: mem_limit: 0.5GB cpu_limit: 256 services: db: essential: true healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 10s timeout: 5s retries: 5 api: essential: true depends_on: - container_name: db condition: HEALTHY vue: essential: true nginx: essential: true depends_on: - container_name: api condition: START efs_volumes: - name: db_efs filesystem_id: [EFS ID] run_params: network_configuration: awsvpc_configuration: subnets: - "サブネットID" - "サブネットID" security_groups: - "セキュリティグループ名" assign_public_ip: ENABLED注意点
下記の点に注意が必要です。
イメージの利用
ECSではdocker-coompose.ymlのbuild項目がサポートされておらず、必ずECRやdocker-hubにあるイメージをpullする形となります。
image: [ECRのイメージURL]:[タグ名]コンテナ間の依存関係
ECSではdocker-composeでのdepends_onがサポートされていません。
代わりに、ecs-params.ymlに記載します。この際、コンテナ間の依存関係はヘルスチェックの状態に基づいて定義します。api: essential: true depends_on: - container_name: db condition: HEALTHYdb: essential: true healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 10s timeout: 5s retries: 5上記のように設定することで、dbコンテナでは起動時にヘルスチェックが行われ、dbコンテナがHEALTHY状態になってからapiコンテナが起動するという依存関係を定義することができます。
EFS Volumeの利用
Fargateインスタンスタイプで永続ボリュームを利用する際は、EFSをマウントさせる必要があります。
ecs-params.ymlで下記を記載することで、あらかじめ作成しておいたEFSをマウントさせることができ、efs_volumes: - name: db_efs filesystem_id: [EFS ID]下記のようにdocker-compose.ymlからvolumesを指定することができます。
services: db: image: postgres volumes: - db_efs:/var/lib/postgresql/data volumes: db_efs:Cloudwatch Logsの利用
Cloudwatch Logsと連携させることで、コンテナのログを出力させることができます。
例えば、docker-compose.ymlのdbコンテナの設定で下記を記載することで、
testロググループが作成され、dbというprefixでログが記録されます。db: logging: driver: awslogs options: awslogs-group: test awslogs-region: ap-northeast-1 awslogs-stream-prefix: dbサービスのデプロイ
上記のファイルを用意した後は、下記コマンドでデプロイを行います。
この際に、ELBでターゲットとなるtargetGroupを指定しています。
ecs-params.ymlは、このファイル名にしておくとデフォルトで設定ファイルとして選択されます。ecs-cli compose \ --file docker-compose.yml \ --project-name test service up \ --create-log-groups \ --cluster-config test \ --ecs-profile test-profile \ --target-groups targetGroupArn=[targetGroupのARN],containerName=vue,containerPort=8080 \ --target-groups targetGroupArn=[targetGroupのARN],containerName=nginx,containerPort=80
- 投稿日:2021-03-21T11:06:17+09:00
MacでAmazon Kinesis Video Streamを試してみた
はじめに
Android端末でストリーミング動画の再生と保存を実現する必要があったので、まずは手元のMacで試してみることにしました。
C++プロデューサーSDKをGStreamerプラグインとして使用します。
以下のREADME.mdを参考にしています。
Kinesis Video Streamとは
デバイスからAWSクラウドへのビデオのライブストリーミングに使用したり、あるいはリアルタイムのビデオ処理やバッチ指向のビデオ分析のためのアプリケーションを構築できる完全管理のAWSのサービスです。
用意されているSDKを使用することで、デバイスのメディアソースをAWSにストリーミングして再生、保存、分析、機械学習
などを実行できます。
プロデューサーSDKの準備
まずは
git clone
でC++プロデューサーSDKをGitHubからダウンロードします。$ git clone https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp.gitダウンロードしたリポジトリに
build
ディレクトリを準備します。$ cd amazon-kinesis-video-streams-producer-sdk-cpp $ mkdir build $ cd build必要なライブラリを取得します。
$ brew install pkg-config openssl cmake gstreamer gst-plugins-base gst-plugins-good gst-plugins-bad gst-plugins-ugly log4cplus gst-libavbuildディレクトリでcmakeを実行し、GStreamerサンプルプログラムを含めてビルドします。
$ cmake .. -DBUILD_DEPENDENCIES=OFF -DBUILD_GSTREAMER_PLUGIN=ONここで、私の環境では以下のようなエラーが発生しました。
エラー内容と解決方法
Compatibility with CMake < 2.8.12 will be removed from a future version of CMake. Update the VERSION argument <min> value or use a ...<max> suffix to tell CMake that the project does not need compatibility with older versions. -- Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR (missing: OPENSSL_CRYPTO_LIBRARY OPENSSL_INCLUDE_DIR) CMake Error at dependency/libkvscproducer/kvscproducer-src/CMakeLists.txt:118 (message): OpenSSL is not found. Make sure to export PKG_CONFIG_PATH to where OpenSSL's pc file isopensslがうまくリンクされていなかったようです。
brew link
で解決できました。brew link openssl --force
cmake
を実行した後、buildディレクトリでmake
を実行します。$ make以下のように出力されれば、コンパイル完了です。
[ 38%] Built target kvspic [ 58%] Built target kvspicUtils [ 68%] Built target kvsCommonCurl [ 79%] Built target cproducer [ 89%] Built target KinesisVideoProducer [ 91%] Built target kvs_gstreamer_multistream_sample [ 92%] Built target kvs_gstreamer_audio_video_sample [ 94%] Built target kvs_gstreamer_file_uploader_sample [ 95%] Built target kvs_gstreamer_sample [100%] Built target gstkvssinkGStreamerプラグインを使用して実行
以下は、buildディレクトリではなく、リポジトリのルートから実行します。
$ export GST_PLUGIN_PATH=`pwd`/build $ export LD_LIBRARY_PATH=`pwd`/open-source/local/lib $ gst-inspect-1.0 kvssink上記が問題なく実行できれば、ストリーミングの実行が可能です。
以下のように、実行するとKinesis Video Streamのコンソール上でストリーミング動画を確認できます。音声は入りません。
gst-launch-1.0 autovideosrc ! videoconvert ! video/x-raw,format=I420,width=1280,height=720 ! vtenc_h264_hw allow-frame-reordering=FALSE realtime=TRUE max-keyframe-interval=45 bitrate=512 ! h264parse ! video/x-h264,stream-format=avc,alignment=au,profile=baseline ! kvssink stream-name=MyKinesisVideoStream storage-size=512 access-key="YourAccessKeyId" secret-key="YourSecretAccessKey" aws-region="ap-northeast-1"音声を含めてストリーミングする場合は、以下を実行します。
gst-launch-1.0 -v avfvideosrc ! videoconvert ! vtenc_h264_hw allow-frame-reordering=FALSE realtime=TRUE max-keyframe-interval=45 ! kvssink name=sink stream-name="MyKinesisVideoStream" access-key="YourAccessKeyId" secret-key="YourSecretAccessKey" aws-region="ap-northeast-1" osxaudiosrc ! audioconvert ! avenc_aac ! queue ! sink.実行すると、Kinesis Video Streamに"MyKinesisVideoStream"というストリーム名でビデオストリームが作成されました。
メディア再生
のタブを開くと、ストリーミング映像が確認できます。
クリップをダウンロード
からMP4形式でダウンロードすることができます。
Macでの実行例
Macでの様々な実行例が以下に記載されています。
おわりに
Android端末でも試してみました。
Android端末では、AndroidプロデューサーライブラリとAmazon Cognitoを使用してストリーミングすることができます。
以下を参考にして手順通りに実行すると、スムーズにストリーミングできました。
- 投稿日:2021-03-21T10:53:33+09:00
【SAA試験対策】EC2 物理ホストについてまとめてみた
概要
SAAの模擬試験対策の自分用のメモ
EC2は仮想サーバであるが、種類によっては物理ホスト(インスタンス)と関連づけることができる
種類は、以下の2つ・Deticated Instatnce
・Deticated Hosts特徴
どちらもお客様専用の物理サーバにEC2インスタンスを起動できるオプション
Deticated Instatnce
物理ホストをアカウントに割り当て、その物理ホスト内でインスタンスを起動できる
■ユースケース
・コンプライアンス要件などで他のAWSアカウントと異なるサーバで起動する必要がある場合Deticated Hosts
物理インスタンスがデプロイされる物理ホスト自体を固定できる
Deticated Instatnceの特徴+αの管理機能がある
※Dedicated Instatnceの機能の不足を補うために後に公開されたサービスらしい■+αの管理機能
・インスタンスの詳細コントロール
・リソース可視性
・CPUコアごとまたはソケットごとにライセンスが消費されるソフトウェア管理ツール■ユースケース
・動作させるソフトウェアのライセンス上ハードウェアを専有することが条件であることが必要な場合
・保有するライセンスをインストールに持ち込む場合(=BYOL(Bring Your Own License)と呼ぶらしい)
・同じAWSアカウントでもIAMによるアクセス権限を制御をしたい場合ちなみにEC2起動時の「ステップ3.インスタンスの詳細の設定」にあるテナンシーより選択することができる
また同じ問題の選択肢によく出てくるベアメタルについても補足。。
ベアメタル
物理サーバを直接操作可能でありハードウェアへのダイレクトアクセスを提供される
■ユースケース
・仮想化環境上からは利用できないワークロードを実装したい場合
・独自にハイパーバイザ(仮想環境を作ってうごかすためのソフトウェア)を導入・管理し、CPU/メモリをより柔軟に仮想サーバに割り当てたりしたい場合
※専有ホストにはハイパーバイザが事前にインストールされている参考
詳細は公式サイトをご確認ください
- 投稿日:2021-03-21T08:56:38+09:00
AWSの構成図を作りながら主要な機能を学ぼう!その3
自己紹介
現在AWS SAA合格を目標に学習中の駆け出しエンジニアです。
2021年3月にAWS CLFに合格しました。
次のステップとしてSAAの学習を始めましたが、ハンズオンでAWSに触れながら学習する事と並行して、構成図を作成して自分にも他の人にも解りやすく説明できるレベルになる事を目指していきます。前回の記事を見られる方はこちらをどうぞ
その2 VPCとサブネットについて記事の読み方
学習中の内容に沿っていくので、具体的なアプリ(ポートフォリオなど)のデプロイ手順とは少し異なる内容になると思います。AWSの仕組みをもっとよく知りたい人や、自分でネットワーク設計を行っていきたい人向けの内容になるかと思います。
もちろん私の様にSAA合格へ頑張る人に役立てれば最高です。
また構成図を見て各サービスの関係性を理解する事を重視してますので、実際のハンズオンの手順と異なる点があると思います。その点はご容赦ください。その3パブリックサブネットに必要な条件についてへ
前回の話でVPCを1つのコンビニとして例えていましたので、今回もコンビニに例えて一緒に考えていこうと思います。
前回はコンビニ(VPC)の中にサブネットを作成するイメージを構成図にしました。
今回はこの続きになります。
パブリックサブネットはお客さんに利用してもらう領域(フロアスペースやトイレ)でプライベートサブネットはスタッフだけ出入り出来る領域です。
これをネットワーク上で実現しようとすると、どの様な条件が必要なのでしょうか?
もちろん設定する際の名前などで区別するのも大事ですが、機能として必要なものがあります。インタネットゲートウェイ
インターネットゲートウェイはAWSサービスの中で、インターネットと自身のリソースを繋ぐ為のコンポーネントです。コンポーネントは部品と言う意味です。これもよく使われる単語ですが、ややこしい場合は部品だと理解しておきましょう。このインターネットゲートウェイをパブリックサブネットにアタッチする事が必要です。
ちなみにアタッチは接続するとか言う意味です。これも良く使われますが接続で良いです。ちなみに反対の意味でデタッチと言うワードも良く使われますが、接続解除と言う理解で良いと思います。
ちなみに私は学習当初、この様な初めて聞くワードが次々と現れる事でメチャクチャ苦労しました。今もそれは変わりませんが、文章の意味が最低限理解できる程度の解釈が出来れば良いやと割り切って学習する様になってからは少しストレスが減りました。ではこのインタネットゲートウェイを構成図に入れるとこんな感じです。
コンビニで言う所の自動ドアでしょうか。続いてのコンポーネントについて考えていきます。
ルートテーブル
ルートテーブルは各IPアドレスとサブネットの関係性をどの様に定義・ルールを決めるかと言った際に使用するものです。これもコンビニに例えてみましょう。
パブリックサブネットの場合はお客さんもスタッフも関係業者の方も全ての人が行き来をする領域なので、誰でもOKと言うルールを定義したり、プライベートサブネットの場合はスタッフだけに制限する等と言ったルールを定義したりします。
構成図に入れるとこんな感じです。
次にパブリックサブネットのルートテーブルにインターネットの世界と通信が出来る為の道筋を作っていきます。
この事をルーティングと言います。
※記事はIPアドレスはIPv4を前提で話を進めます。またIPアドレスやサブネットマスクの話はそれだけで結構なボリュームになってしまいそうなので、改めて別の機会で記事に出来ればと考えています。ルートテーブルにこの様なルールを追加します。
送信先 ターゲット 0.0.0.0/0 Internet Gateway この条件をパブリックサブネットに追加する事で、パブリックサブネットにはどのIPアドレスからもアクセスが可能になります。
パブリックとプライベートを区別する方法についてはこのインターネットゲーウェイへのルーティングの有無で決めると言った感じです。
逆に自分がプライベートで扱うつもりだったサブネットにインターネトゲートウェイへのルーティングを設定すると実質はパブリックサブネットとして機能して、公開したくないリソースを世に出してしまい兼ねないので、とっても大事な考え方になります。ネットワークACL
今回の記事の最後はネットワークACLと言うものについて考えていこうと思います。
ネットワークACLはサブネットにごとに設置するファイアウォールです。
ファイアウォールとは、インターネットの世界で不審な通信などを制御するセキュリティ対策の1つです。
通信は基本的にリクエストとレスポンスの繰り返しになります。
コンビニで例えるなら、
お客さんが肉まんをくださいと言うのがリクエスト
お店の人が肉まんを渡すのがレスポンス立場を逆転するなら
お店の人が代金を請求するのがリクエスト
お客さんが代金を支払うのがレスポンスこう言った事の繰り返しが通信の世界でも行われています。
この時に通信を受け入れるのをインバウンド、通信を外部に発信する事をアウトバウンドと言います。
ネットワークACLはこのインバウンドとアウトバウンドに対してチェックを入れて、通信しても良いインバウンド/アウトバウンドなのかを判断してます。ダメな通信に関してはその通信を破棄します。ネットワークACLはステートレスです。
ステートレスと言うのは状態がないと言う意味らしいですが、別の表現で例えるなら履歴を残さないと言った感じです。
つまりお客さんが来店(インバウンド)する際に毎回来店チェックをする感じです。ちなみに店員が少し外出(アウトバウンド)する際にもチェックを入れる感じです。ステートレスと言う言葉は次回の記事でも少し触れていこうと思いますので、今はへ〜そうなんだ位でOKです。
少しずつですが構成図にも色々加えられてきました。
ただネットワークACLあたりからコンビニで例えるのに限界を感じてますww
別の表現にするかもう少しコンビニで例え続けるかは次回の記事を作りながら考えていこうと思います。
ここまで読んでくださり有り難う御座いました。
次回はAWSのメイン機能であるEC2に付いて触れていこうと思います。
AWSの構成図を作りながら主要な機能を学ぼう!その4へ(作成中)
- 投稿日:2021-03-21T07:44:08+09:00
【AWS】mac EC2でデプロイ時エラー No space left on device 空き容量の不足の対処
経緯
Capistrano導入後、久々にローカルでデプロイ
bundle exec cap production deploy
するとNo space left on deviceのエラーが発生しました。
解決までの経緯を紹介します。環境
macOS:Catalina 10.15.7
ハードディスクサイズ 8GB【エラー文】
Net::SCP::Error: scp: /tmp/git-ssh-.sh: No space left on device
「デバイスにスペースがない」
いろいろ調べてみましたが、要は上の通りスペースがないのが原因でした。結論
ファイルを削除し、再度作成しました。
対応
何にどれくらい使ってるか調査します。
EC2内df -h ファイルシス サイズ 使用 残り 使用% マウント位置 devtmpfs 482M 0 482M 0% /dev tmpfs 492M 0 492M 0% /dev/shm tmpfs 492M 6.6M 486M 2% /run tmpfs 492M 0 492M 0% /sys/fs/cgroup /dev/xvda1 8.0G 8.0G 20K 100% / ⇦これが大きい tmpfs 99M 0 99M 0% /run/user/1000最大容量が8Gに対して
/dev/xvda1
で既に8.0G使ってる事わかりました。
/dev/xvda1
内のもっと詳細を調査しました。EC2内sudo du -sh /* . . . . . 0 /proc 28K /root 448K /run 0 /sbin 0 /srv 512M /swapfile1 0 /sys 8.5M /tmp 1.5G /usr 5.7G /varどうやら以下の2つのディレクトリ内に大きファイルがあるようでした。
1.5G /usr
5.7G /var
どのファイルか特定します。EC2内cd /var sudo du -sm ./* | sort -rn | head -5 118891 ./www 2541 ./lib 124 ./log 84 ./cache 14 ./tmp
118891 ./www
が半端なく大きにのでこれを削除します。EC2内sudo rm -rf /var/www確認します。
EC2内df -h ファイルシス サイズ 使用 残り 使用% マウント位置 devtmpfs 482M 0 482M 0% /dev tmpfs 492M 0 492M 0% /dev/shm tmpfs 492M 416K 492M 1% /run tmpfs 492M 0 492M 0% /sys/fs/cgroup /dev/xvda1 8.0G 3.4G 4.7G 42% / #⇦減ってる tmpfs 99M 0 99M 0% /run/user/10008GBが3.4Gとだいぶ小さくなりってます。
最後新しい入れ物を作ります。EC2内[ec2-user@xxxxxxxxxx ~]$ cd [ec2-user@xxxxxxxxxx ~]$ sudo mkdir /var/www/ [ec2-user@xxxxxxxxxx ~]$ sudo chown ec2-user /var/www/ [ec2-user@xxxxxxxxxx ~]$ cd /var/www/ [ec2-user@xxxxxxxxxx www]$ git clone https://github.com/アカウント名/デポジトリ名.git [ec2-user@xxxxxxxxxx www]$ cd /var/www/デポジトリ名 [ec2-user@xxxxxxxxxx デポジトリ名]$ bundle installローカルbundle exec cap production deployうまく行きました!!
参考
- 投稿日:2021-03-21T01:27:31+09:00
DynamoDBでPartiQLをjavaSDKで実行してみる。
この記事について
将来的に書く予定の「JavaFX で DynamoDB Viewer作ってみた」記事の1ステップ。
結構大きな話になると思うので、少しずつ技術ポイント毎に記事を書いて、ある一定程度の要件を満たせた段階で前述まとめ記事書く予定。第一回記事:DynamoDBの情報を読み込んでJavaFXで表示してみる
第二回記事:JavaFXで動的にテーブル列を設定する
第三回記事:AWS java SDKでDynamoDBテーブル情報を取得してみる
第四回記事:JavaFX の TableView の選択範囲をクリップボードにコピーする。
第五回記事:JavaFX でコンポーネント作って動的生成してみる
第六回記事:DynamoDBのデータ型をjava SDKから把握してみる。
第七回記事:JavaFXでジェネリック使って入力ダイアログ作成してみる
第八回記事:JavaFXで各種サイズ制御
第九回記事:JavaFXのDialogで入力値チェック制御※これまでの記事が基本になってます。メソッドなど細かい部分で再説明していない部分があります。不明点などありましたらコメントなど頂けたら対応しようと思います。
今回の追加機能
PartiQL対応
DynamoDBのレコード更新時、確認メッセージを出すように
表のカラム幅を最大1000に現在の進捗
今回の記事の背景
前回までの状態では、データ読み込みは一括読み込みか、プライマリーキーを1つだけ指定して読み込むという事のみ。実際のデータ取得では、複数のデータを指定して読み込む事を行いたい。
SQLライクに問い合わせ可能な PartiQL をAWSがサポートしたという話を聞いた。
確かにJavaSDKのページ Interface DynamoDbClient を見てみると、PartiQLの文字が見える。が、SDKの使用サンプルページは更新されていない様子。
待っていればサンプルも充実すると思うが、ここはチャレンジしておきたい。前準備
前述のSDKページからすると、現時点でのsoftware.amazon.awssdk最新バージョンは2.16.23らしいので(2021-03-20時点)、pomのバージョンを変更しておく。
SDKページ確認
基本的な問い合わせが出来そうなSDKページのexecuteStatement部分を見る。ちゃんとPartQLが使えると書いてある。
DynamoDbClient#executeStatement
多分一番基本的な問い合わせ。引数にClass ExecuteStatementRequest を指定するらしい。
テストしてみる。
そして、ちょっとEclipseのコード補完を頼りにやってみたらあっさり出来た。
String partiQLString = "select * from hogehoge_table"; DynamoDbClient dbclient = DynamoDbClient.builder().region(Region.AP_NORTHEAST_1).build(); ExecuteStatementRequest executeStatementRequest = ExecuteStatementRequest.builder().statement(partiQLString).build(); ExecuteStatementResponse executeStatementResponse = dbclient.executeStatement(executeStatementRequest); List<Map<String, AttributeValue>> items = executeStatementResponse.items();もうちょっと苦労するかと思っていたが、ちょっと拍子抜け。もちろんRDBのSQLの様な好き勝手は出来ず、基本的にはDynamoDBの読み込みで可能な範囲のみ出来る。例:キー属性出ないとwhere句に指定できない。しかし、キー値でin句が使えるのは個人的には嬉しい。
次回予定
csv、json形式などでのファイル出力
累積残課題
- 変更ダイアログで取り消しボタンでもチェックが走ってしまう
- 新要素を追加した時、テーブルに列が追加されない
参考にさせて頂いたページ
公式ページ
Interface DynamoDbClient
executeStatement
Class ExecuteStatementRequest