20210513のAWSに関する記事は19件です。

[AWS_13.2]必須モジュール gd がインストールされていないか、無効化されています。

環境 AWS EC2 t2.micro PHP 8.0.2 WordPress 5.7.2 エラー 原因 phpのアップデートでphpのつく諸々を削除したが、phpを再インストールする際にその諸々は再インストールしていなかった。 解決法 yum -y install mysql httpd php-mbstring php-xml gd php-gd
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

クロスアカウントでAthenaクエリ

Atheaのクロスアカウントを試した自分メモ データ所有アカウント:999999999999 Athenaクエリするアカウント:666666666666 6666..でAthenaクエリ 9999..にGlueカタログやS3のオブジェクト 権限設定 S3権限 【データ所有アカウント操作】 "データ所有アカウント"のAthenaでクエリされるS3バケットのバケットポリシーを以下のようにして、"Athenaクエリアカウント"からのアクセス許可しておく { "Version": "2012-10-17", "Id": "Policy1620910711847", "Statement": [ { "Sid": "Stmt1620910644611", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::666666666666:root" }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::test-bucket-ue", "arn:aws:s3:::test-bucket-ue/*" ] } ] } Glue権限 【データ所有アカウント操作】 Glueの設定をクリックして、以下のアクセス権限ポリシーを設定し、"Athenaクエリアカウント"からのGlue Data Catalogへのアクセス許可する。(Glueのリソースベースのアクセス許可) { "Version" : "2012-10-17", "Statement" : [ { "Effect" : "Allow", "Principal" : { "AWS" : "arn:aws:iam::666666666666:user/uehara" }, "Action" : "glue:*", "Resource" : [ "arn:aws:glue:ap-northeast-1:999999999999:catalog", "arn:aws:glue:ap-northeast-1:999999999999:database/default", "arn:aws:glue:ap-northeast-1:999999999999:table/default/*" ] } ] } IAM権限 【Athenaクエリアカウト操作】 "データ所有アカウント"のデータカタログデータベースやテーブルにアクセス許可を与えるIAMポリシーを作成し、作成したIAMポリシーを操作するIAMユーザー(またはIAMロール)にアタッチする IAMポリシー { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "glue:*", "Resource": [ "arn:aws:glue:us-east-1:999999999999:catalog", "arn:aws:glue:us-east-1:999999999999:database/default", "arn:aws:glue:us-east-1:999999999999:table/default/*" ] } ] } Athenaデータカタログとデータソース作成 【Athenaクエリアカウト操作】 Athenaの上部で[データソース]をクリックし、[データソースを接続する]をクリックする そのまま[次へ] [別のアカウントのGlue データカタログ]にチェック入れて[次へ] カタログ名に任意の名前(ここではcrosstest-uehara2)、カタログIDに"データ所有アカウント"のアカウントIDを入れて[登録]をクリック Athenaでクロスアカウントクエリ データソースに作成したAthenaデータカタログを選択しクエリ。"データ所有アカウント"のGlueテーブルを使い、"データ所有アカウント"のS3のデータに、"Athenaクエリアカウント"からクエリ出来ている 参考ドキュメント 公式 https://docs.aws.amazon.com/ja_jp/athena/latest/ug/data-sources-glue-cross-account.html https://docs.aws.amazon.com/ja_jp/athena/latest/ug/security-iam-cross-account-glue-catalog-access.html 補足 aws cliでAthenaのデータカタログを作成する $ cat tmpcross.json { "Description": "Cross-account Glue catalog", "Name": "ownerCatalog", "Parameters": {"catalog-id" : "999999999999"}, "Type": "GLUE" } $ aws athena create-data-catalog --cli-input-json file://tmpcross.json
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Capistrano自動デプロイ時に (SSHKit::Runner::ExecuteError)エラーの解決法

はじめに Capistrano自動デプロイ時に (SSHKit::Runner::ExecuteError)エラーが出たのでその解決法を書いておきます。 エラー内容 Terminal # プロジェクトのディレクトリ $ bundle exec cap production deploy SSHKit::Runner::ExecuteError: Exception while executing as ec2-user@ElasticIP: Authentication failed for user ec2-user@ElasticIP Caused by: Net::SSH::AuthenticationFailed: Authentication failed for user ec2-user@ElasticIP Tasks: TOP => rbenv:validate (See full trace by running task with --trace) 原因 インスタンスを再起動したことで、 sshディレクトリにキーペアがなくなってしまったことが原因だったので 再度追加します。 以下方法です。 解決法 Terminal # [~/.ssh] $ ssh-add ~/.ssh/peachbranch.pem
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS初心者の俺がたった10日でAWSプラクティショナーに合格した件。

はじめに クラウドファーストのこの時代。トップシェアを誇るAWSの知識は全エンジニアにおいて不可欠なものになりました。 自分は、インフラ案件に携わったことが無いAWS初心者でしたが、まずは手始めに「AWSプラクティショナー」の資格を取ろうと思いました。 短期間で取得したかったので、計画的に学習した結果、約10日で取得出来ました。 「どうやって短期間で取るのか?」に重きを置いて解説したいと思います! AWSプラクティショナーとは? AWSクラウドの知識とスキルを身に付け、全体的な理解を効果的に説明できる個人が対象です。その他の AWS 認定で扱われる特定の技術的役割からは独立しています。(中略) AWS認定クラウドプラクティショナーは、アソシエイト認定または専門知識認定を取得するために推奨される任意のステップです。 (参照) AWS 認定 クラウドプラクティショナー AWSを利用する上での基本的な知識を中心とした問題が出題されるので、基礎を押さえるという意味では最適です。 ここでは、出題範囲や合格点数など詳しいことは解説しませんので、詳しくは以下を参照ください。 (参照) クラウドプラクティショナーとは?難易度や合格率、おすすめ参考書について 使用した教材 自分は、Udemyの以下の教材2つを利用して学習しました! 正直、この2つで事足りると思います。 ①これだけでOK! AWS認定クラウドプラクティショナー試験突破講座(豊富な試験問題290問付き) ②この問題だけで合格可能!AWS 認定クラウドプラクティショナー 模擬試験問題集(7回分455問) ※Udemyは教材が高いのでセール中に購入することをおすすめします!(意外と頻繁に開催してます) 学習スケジュール ここでは、自分が実際に行った学習の大まかなスケジュールを書いています。 全く同じにしなくても良いですが、参考になればと思います! 1〜3日目 3日目までに、「①」の教材を終了させます! ここでは、大まかな全体像を掴むために動画を見て聞いて、「こういったものがあるんだ」程度に理解しておきましょう! ※全部で約10.5時間あるので、3時間/日で完了出来ます。 4日目 4日目は、動画内で使用されているPDFのスライドショーが「①」の教材に添付されているので、それを読みましょう! 動画で見るよりも、スピーディに進めるので2周ほど読みながら覚えるようにしましょう。 5日目 5日目は、「①」の教材の最後にある問題集を行います! 最初は、低い点数で心が折れそうになるかもしれませんが、自分も最初はとても低かったので安心してください!笑 2つの模擬問題集がついていますが、それぞれ終わった後は、正解・不正解問わずに解説を読んで理解を深めてください。 これも2,3周ほどすれば80点くらい取れてくると思うので、80点を目標に学習しましょう! 6〜8日 8日目までに、「②」の教材の問題集を全て80点以上取れるようにします。 これも、2,3周ほどすれば80点くらい取れてくると思うので、「①」の教材の問題集と同じく、80点を目標に頑張りましょう! 9日目 おそらくここまでついてこれてる人は、かなり基礎が固まっていると思います。 9日目では、「①」と「②」の教材の問題集を全てやり直してみましょう! ここでは、90点以上取れているのがベストかなと思います。 前回よりも良い点数になっていれば、及第点です! 10日目 自分の場合は試験当日。 朝早くに起きて、問題集を片っ端から解いていきます。(この時点でかなり知識が付いているので、問題集もすぐ終わると思います。) 解説まで読み終えたら、あとは残り時間PDFのスライドショーの資料をひたすら読むことです。 このスライドショーの資料は大事な情報が詰まっているので、重宝してください! 合格するためのコツ アウトプットを忘れない 学習をしていると、自分の得意な部分や、なかなか覚えられない部分が出てきます。覚えられない部分に関してはアウトプットをすることで知識を定着させましょう! 自分の場合は、Twitterに簡潔にツイートすることで理解度を深めることが出来ました。 アウトプット方法は、各自自由で大丈夫です! 問題集の解説を読む 解説には、教材の動画中には説明してくれていなかったことまで書いてあります。 実際に、動画以外の範囲で試験でも問題が出ましたが、解説を読んでいたので対応できました! 無理せず自分のペースで 「自分は短期間で取ってやる!」という強い意志があったので、大丈夫でしたが、ここまで速攻で取得しなくてもいい人はペースを緩めて、ゆっくりでも大丈夫です。 その際は、問題集を100点取るつもりで頑張りましょう! ※ちなみに自分は、全ての問題集を試験前には100点取れるようにしていました笑 おわりに どうでしたでしょうか?? プラクティショナー試験は学習すれば、大体の人は合格出来ると思うので、実績のある僕の学習方法でぜひ合格を目指してみてください!!!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Vue.js + axiosでLambdaのAPIを叩く方法

開発環境 Windows10 AWS Lambda Vue.js APIの作成 Lambda lambda.function.py(GET) import json def lambda_handler(event, context): items = ['福岡','佐賀','熊本','大分','鹿児島','長崎'] return { 'statusCode': 200, 'body': json.dumps(items), 'headers': { 'Access-Control-Allow-Headers': '*', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET' } } lambda.function.py(OPTIONS) import json def lambda_handler(event, context): return { 'statusCode': 200, 'body': '', 'headers': { 'Access-Control-Allow-Headers': '*', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET' } } 九州の都道府県を返すサンプルです。    サーバーは別のサイト(オリジン)から送られてきたhttpリクエストをブロックすることができます。 CSR (Cross-site Request Forgery) などの対策のためです。    許可する場合はサンプルのようにレスポンスヘッダーでAccess-Control-Allow情報を返す必要があります。 Access-Control-Allow-Origin : 許可するオリジンを指定できます。上の例はワイルドカードですべてのオリジンからのリクエストを許可しています。 Access-Control-Allow-Headers : 許可するリクエストヘッダーを指定できます。上の例はワイルドカードですべてのリクエストヘッダーを許可しています。 Access-Control-Allow-Methods : 許可するリクエストメソッドを指定できます。上の例はGET,POST,OPTIONSを許可しています。    オリジンから別のオリジンにアクセス権を許可する仕組みをCORS(Cross-Origin Resource Sharing)といいます    OPTIONSについては後程説明します。 API Gatewayの設定 リソースの作成 GETおよびOPTIONSメソッドを作成 上の関数をAPI化しました。 OPTIONSメソッドとは サーバーからクライアントに対してアクセス権を返します。 クライアントからサーバーに対してOPTIONSリクエストを送ることをPreflight requestといいます。 サンプルの例では まず、クライアントがPreflight requestをサーバーに送る。 サーバーがOPTIONSレスポンス(アクセス権)を返す。 クライアントはアクセス権を確認し、アクセス可能であればGETメソッドリクエストを送る。 サーバー側はGETレスポンスを返す。 という流れになります。 AWSが用意しているのCORSを使用することもできるのですが、正しく動作させることができなかったため自作することにしました。 Preflight requestはブラウザが自動的に送信するためクライアントの実装では意識する必要はありません APIキーの必要性の設定 ※ OPTIONSはAPIキーの必要性をfalseのままにしておく ブラウザがPreflight requestを送るときにリクエストヘッダを追加することができないため、falseにしておいてください。 GETメソッドにはAPIキーを設定することができます。 デプロイ Vue プロジェクトにaxiosをインストール npm install axios サンプルコード Sample.vue <template> <div> <ul> <li v-for="item in items" :key="item">{{item}}</li> </ul> </div> </template> <script> import axios from 'axios'; export default { data() { return { items: null } }, async mounted() { await this.getData(); }, methods:{ getData: async function(){ const result = await axios( { method:'GET',// GET,POSTなど url:'https://××××.×××',// APIのURL headers:{ 'X-Api-Key':'××××××××××××××××'//リクエストヘッダー }}, ).then(response => this.items = response.data); } }, } </script> APIにGETリクエストを送ってレスポンスをitemsに保存。Viewでitemsの中身を表示しています。 OPTIONSリクエストは自動で送信されるため記述は必要ありません。 確認 APIから情報を取得するのに成功しています。 参考にさせていただいたサイト
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Errno::ENOSPCが表示された時

rails sでサーバーを立ち上げようとすると、Errno::ENOSPCの表示が。 エラー内容 まずこのエラーの内容を確認すると、「No space left on device」の文字が確認でき、これは容量不足を示しています。 こいつが起きると何も操作ができなくなってしまい、だいぶやっかいです。 この容量不足には、ディスクの容量不足とinodeの容量不足の2パターンがあります。 解決に向けて  ※出力結果は例となります。 まずは以下コマンドにて、現在の使用容量を確認します。 ターミナル $ df >ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置 devtmpfs 492676 0 492676 0% /dev tmpfs 503448 0 503448 0% /dev/shm tmpfs 503448 472 502976 1% /run tmpfs 503448 0 503448 0% /sys/fs/cgroup /dev/xvda1 8376300 5655364 2720936 68% / tmpfs 100692 0 100692 0% /run/user/1000 ここでは使用%という部分が、現在のディスク使用率を表示しています。 ここが100%になっていれば、ディスク容量が一杯になっています。 ※ここでは容量不足解消後の出力結果なので、100%のものはありません。 続いてinodeの容量確認ですが、こちらは先ほどのコマンドに-iを追加します。 ターミナル $ df -i >ファイルシス Iノード I使用 I残り I使用% マウント位置 devtmpfs 123169 284 122885 1% /dev tmpfs 125862 2 125860 1% /dev/shm tmpfs 125862 373 125489 1% /run tmpfs 125862 16 125846 1% /sys/fs/cgroup /dev/xvda1 4193216 127452 406576 4% / tmpfs 125862 1 125861 1% /run/user/1000 こちらもI使用%という部分を確認して、ここが100%になっていれば、inodeの容量不足となります。 上記コマンドで容量不足の確認ができたところで、不要なファイルを削除していきます。 まず、どのファイルが容量を圧迫しているか確認する必要があるので、以下コマンドで確認します。 ターミナル $ find / -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -nr > 59177 usr 33328 home 4025 var 526 etc 16 opt 13 boot 1 swapfile1 1 .autorelabel こんな感じで、左側にファイル数、右側にディレクトリが表示されるかと思います。 ファイル数が多いものが容量を圧迫しているので、更にその中で圧迫の原因となっているものを探っていきます。 先ほどの出力結果だと、usrディレクトリのファイル数が多かったので、これを更に深めていきます。(findの後に確認したいディレクトリ名を記載します。) ターミナル $ find /usr -xdev -type f | cut -d "/" -f 3 | sort | uniq -c | sort -nr > 28277 share 17869 lib 7387 lib64 3676 include 929 bin 526 local 377 sbin 136 libexec ここではディレクトリ別のファイルが表示されています。この操作によって、ファイル数が多く、不要なディレクトリを探します。 上記コマンドでディレクトリを特定できれば、次はそれを削除していきます。 削除する時は、以下コマンドを使用します。 ターミナル $ sudo rm -rf ディレクトリ名 例えば先ほどの出力結果だと、usr/shareが多かったので、これを削除する場合、 「$ sudo rm -rf usr/share」となります。 このコマンドは-rfがついているため、コマンドを実行すると強制的に削除が実施されるので、必要なファイルを削除しないようにご注意ください。 不要なファイルを削除したらもう一度、「df (-i)」コマンドにて使用率を確認して、使用容量が減っているか確認してみてください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS勉強まとめ

はじめに AWS初挑戦の記録です。 ほんの一握りの知識ですがまとめました。 インフラの学習はコードを書くわけでもなく、目に見えた変化も感じにくいので大変ですね。。。 この記事を見て、一人でも参考になる方がいれば幸いです。 専門用語 ■ローンチ 新しい商品やサービスの提供を(開始)すること ■オーバーヘッド コンピュータが何か処理を行った時に発生する付加的な処理(負荷になる) (実行したい処理に関わることだけど必要ない処理) ■ファイアウォール 不正な通信がネットワークに侵入することを遮断し、保護するセキュリティ対策機能 ■ストレージ データをしまっておく箱 電気が流れていなくてもデータを保存しておくことができるがCPUとやりとりはできない (CPUとやりとりするのはメモリの役割) ■I/O input/outputの略。日本語訳「入出力」 情報を入力し(input)、結果を出力する(output)という処理の総称 ■メタデータ 主となるデータの付帯情報が書いてあるデータ(補足、説明書き) ■しきい値 条件分岐の境目となる値 ■レイテンシ(latency) データ転送における指標の一つ データ転送の要求を出してから結果が帰ってくるまでにかかる時間 レイテンシが低い = 処理速度が早い ■スループット 一定期間にどれほどの処理を行うことができるかを表す指標 ■ホスティングサービス 自分らが設置したサーバーをネットワーク越しに他者へ使わせてあげること(レンタルサーバー) ■API 外部のプログラムからその機能を使わせてあげるための窓口に関する使い方などの決まりごと ■トラッキング 訪問者の行動などを記録して分析すること ■オンプレミス クラウドを使わず、コンピュータやシステムを自ら設置して自ら運用する方法(自社運用) ■DNS インターネット上でドメイン名を管理・運用するために開発されたシステム ■ポート ネットワークとPCの間にあるドアのこと(たくさんある) 通信においてデータの送受信を行う際、データの種類によって使うドアが決まっている そのドアには各々番号が割り振られており、その番号を「ポート番号」という VPCについて リージョン上に構築する仮想ネットワーク サーバーなどをAWSで使うために必要な仮想ネットワークを構築するサービス 仮想ネットワークを構築するには、 そのネットワークが持つIPアドレスの範囲を定義しなければならない ↓ IPアドレスの範囲を定義する方法として「CIDR」というものがある CIDR(サイダー)とは ネットワークを構成する際に必要なIPアドレスの範囲を決める方法 IPアドレスの範囲は世界共通ルール(下記参照) サブネットとは VPCのIPアドレスの範囲内で、さらに小さな仮想ネットワークを作成するAWSのサービス 耐障害性を考慮して、異なるアベイラビリティーゾーンにネットワークを作成できる (=1つのリージョン内の異なるアベイラビリティーゾーンにネットワークを分散できる) このサブネットは公開・非公開が設定できる =個人情報などを扱うデータベースは非公開、Webサーバーは公開のように設定可能 ※公開=public , 非公開=private サブネットもVPC同様、IPアドレスの範囲を設定しなければならない サブネットのIPアドレスの範囲はVPCで決めた範囲内でしか指定できない サブネットは複数作成可能だが、IPアドレスの範囲は重複して作成できない プライベートサブネット:インターネットに接続できないサブネット パブリックサブネット:インターネットに接続できるサブネット ルートテーブルとは インターネットからVPCに接続した時、どこに通信しにいくのか(どのサブネットにいくのか)をルール決めをしたもの サブネットの公開の設定を行う →ルートテーブルは作成時デフォルトで非公開(private)になっている。 1:ルートテーブルにインターネットゲートウェイを設定すると公開(public)になる 2:そのルートテーブルにサブネットを関連付けることで、サブネットも公開(public)になる インターネットゲートウェイとは AWSリソース(EC2インスタンスなど)とインターネット間を通信できるようにするもの(窓口) 主な役割 1:ルートテーブルにインターネットへのルートを追加する 2:EC2インスタンスのプライベートIPアドレスをパブリックIPアドレスに変換する IPアドレスについて IPアドレスはネットワークに接続された機器がもっている番号 =インターネット上の住所 IPアドレスは「ICANN」という組織が管理をしている IPアドレスの種類 1:パブリックIPアドレス(グローバルIPアドレスともいう) 2:プライベートIPアドレス パブリックIPアドレス →インターネットに接続される機器にそれぞれ個別に割り振られる番号。番号は一意 プライベートIPアドレス →インターネットに直接接続されていないネットワーク機器で利用されるIPアドレス 一意である必要はない   プライベートIPアドレスは範囲が限定的 - 10.0.0.0 ~ 10.255.255.255 - 172.16.0.0 ~ 172.31.255.255 - 192.168.0.0 ~ 192.168.255.255 EC2について EC2とは AWSのクラウドにて、仮想化基盤上にサーバーを実行するサービス(EC2 = サーバー) 仮想化とは 単一の物理サーバー上で、複数の仮想サーバーを実行すること この、仮想化基盤上にある(作った)サーバーをEC2インスタンスorインスタンスと呼ぶ EC2インスタンス これはあくまで仮想サーバーであるため、実際の処理はAWSデータセンター内にある物理サーバー上で実行される AWSデータセンターは指定したAZ内(アベイラビリティーゾーン)に存在する ENI EC2インスタンスに付与される仮想ネットワークインターフェース インスタンスのへ通信はすべてENIを経由して行われる セキュリティグループ EC2インスタンスにアクセスできる通信を制限する (許可する通信を指定し、それ以外の通信を全て遮断する) (不正な通信がネットワークに侵入することを遮断し、保護するセキュリティ対策機能) インスタンスにアタッチされているENIに関連付けられ、最大5つまで関連付けが可能 インバウンドトラフィック(インスタンスに入ってくる通信)=インバウンドルール と アウトバウンドトラフィック(インスタンスから出ていく通信)=アウトバウンドルール を 別々に設定できる ネットワークACL サブネットに属する全てのインスタンスに対して適用されるファイアウォール        (セキュリティーグループはインスタンスごとに設定するがこっちはサブネットごとに適用できる) →大枠はネットワークACLで設定し、細かいところをセキュリティグループで設定するといった使い方をする ライフサイクル EC2インスタンスを起動してから終了するまでの状態遷移のことを意味する Amazon EBSについて Amazon EBSとは EC2インスタンスで最もよく使われるストレージ ※AWSでは、CPUやメモリをもつEC2インスタンスと、HDD(ハードディスクドライブ)としてのストレージに分かれている CloudWatchについて CloudWatchとは サービス(EC2インスタンスなど)の状態を監視するシステム 利用者がサービスを使える状態であるかや、利用者の増加によってシステムに負荷が増えていないかなどを監視できる 3つの機能がある 1:モニタリング(監視) 2:可視化(監視結果をグラフで表示) 3:通知機能(設定した条件に合う時、メールで通知を送る) 自動化ツールについて AWSで利用できる自動化ツールは様々だが、一部抜粋(3つ) 1:UserData 2:InstanceMetadata 3:Launch Template 1:UserData EC2を起動した後(作成した後)に行う処理を自動化できる (例:ngnixをインストールする、Rubyをインストールするなど) EC2起動時、インスタンスの詳細設定の一番下、高度な詳細の中にユーザーデータというフォームがある。 そのフォームにインストールなどで実行するコマンドを記載すると、インスタンス作成後にそのコマンドを実行してくれる 2:InstanceMetadata 実行中のEC2インスタンスに関する情報を取得することができる EC2インスタンスにSSH接続後、コマンド入力 ec2-metadata --help →コマンドのオプション一覧が出力される そのオプションを参照し、ec2-metadata  オプションとコマンド入力することで情報取得が可能になる 3:Launch Template EC2インスタンスを起動(作成)するための設定をテンプレートとして保存できるサービス EC2サイドバーの「 テンプレートの起動」から設定が可能 ※起動テンプレートは設定に不具合があってもインスタンスを作成してしまう →インスタンス起動時にエラーが表示される。 踏み台サーバーとバッチサーバー 踏み台サーバー(Bastion)とは インターネットに直接接続されていないサーバーにアクセスするためのサーバー (privateサブネット内のサーバーにアクセスするためのpublicサブネット内のサーバー) バッチサーバーとは あるタイミングでまとめて処理を実行することを目的としたサーバー バッチサーバーへアクセスするには 踏み台サーバーにssh接続後、そこからバッチサーバーにssh接続する(=鍵が2つ必要) 秘密鍵の送り方 踏み台サーバーにssh接続した状態で、バッチサーバーの秘密鍵をドラック&ドロップしても使えない ↓ 下記手順で対応する 1:ローカル環境時に踏み台サーバー用と、バッチーサーバー用の2つの鍵を置く(ドラック&ドロップ) 2:ローカル環境から踏み台サーバーへ、バッチサーバー用の鍵を送る(scpコマンド) コマンド形式 scp -i 踏み台サーバー用秘密鍵へのpath バッチサーバー用秘密鍵のpath ユーザー名@踏み台サーバーのpublicIPアドレス:鍵保存場所のpath イメージ例 scp -i A B C:D CにAを使って接続し、DにBを保存する AWS責任共有モデル AWS責任共有モデルとは AWS側と利用者側で役割分担を行い、全体のセキュリティを担保しようという考え方 IAM AWSにログインできるユーザー追加し、 そのユーザーのアクセス権限を管理できるサービス イメージ ユーザー名「○○」でログインしていいよ!(IAMユーザーの作成・追加) でも、EC2インスタンス見ることしかできないからね!(アクセス権限の設定) MFA AWSを2段階認証できるサービス CloudTrail ユーザーやAWSサービスが実行したアクションを「イベント」として記録するサービス 90日感保存でき、活動を可視化することにより、不正利用などを監査することができる 90日より多く保存したい場合は有料(「証跡」を作成してS3に保存) Amazon S3 Amazon Simple Strage Serviceの略 クラウド上にデータやファイルを保存できるサービス Amazon S3の特徴 1:容量無制限 保存できるデータ容量とオブジェクト数は無制限。※オブジェクトサイズは最大5TBまで 2:高度な耐久性 3:拡張性のある複数のストレージクラス どんなときに使うのがおすすめか 大規模なデータ配信を行うアプリケーションやサービス ↓ 他のストレージとファイルを転送する際の性能は差がないが、同時に複数ファイルを転送する際に他のストレージより性能が落ちにくいため S3に保存するデータは最低3つのアベイラビリティゾーンに自動的に保存される。 →高度な耐久性を維持することができる。 そのため、データの更新や削除は反映に時間がかかってしまう。 (=あるユーザーの更新内容を別のユーザーがすぐに反映しなければならないアプリには不向き) Application Load Balancer(ALB) ディザスタリカバリ(Disaster Recovery)(DR)とは 自然災害やサイバー攻撃などでデータセンターやシステムの稼働に門外が発生した場合、 損害の軽減や機能の維持、回復や復旧のための対策を講じること DR環境 = メインのデータセンターとは離れた場所にある別のデータセンターにコピー環境を構築しておく Application Load Balancerとは アプリケーションへの(サーバーへの)アクセスを分散させるサービス アプリケーションへの(サーバーへの)アクセスを分散させることで、アクセス集中による負荷を軽減し、処理速度の工場や、高い可用性の維持を行うことができる ※ロードバランサーは使用した分のみ料金が発生する (アクセスがない場合でも固定時間料金がかかるため、1ヶ月で18ドルは最低でもランニングコストがかかる) スティッキーセッションとは サーバーが複数ある場合、初回リクエストで保存したSessionIDで持った状態で別のWebサーバーにアクセスしてしまう可能性がある。(別のWebサーバーから見れば初回リクエストである為、Sessionを維持することができない) この問題を解消するために 「セッションが有効ない間は同じサーバーにリクエストする」という設定を行う必要がある。 その設定が「スティッキーセッション」である CookieとSession (前提) HTTP通信はステートレス ステートレス:状態を保持することができない(例:ログイン状態をページ遷移時に保持できない) Cookieとは Webサーバーが発効し、ブラウザで保持されるテキストデータのこと このCookieをクライアント側(ユーザー側)で保存することにより、 次回訪問時に、状態を保持した状態で表示することができる Cookieの処理順序 初回訪問時 1:ブラウザにアクセスした時、WebサーバーからCookieが発行される 2:ブラウザ(クライアント)がCookieを保存する 次回訪問時 3:ブラウザでアクセスするときにCookieも一緒に持っていく 4:WebサーバーはCookieを参照し、初回訪問時の状態を踏まえてレスポンスを返す Sessionとは Webサーバーで保持されるクライアントWebサーバーの通信状態を表すデータ ・ポイント Cookieはクライアント側で保持 Sessionはサーバー側で保持 Sessionの処理順序 初回訪問時 1:ブラウザにアクセスしたクライアントの「Email」と「Password」を元に「SessionID」を発行する 2:SessionIDをCookieに渡す(Webサーバー側でもSessionIDを管理) 次回訪問時 3:Cookie内のSessionIDをWebサーバー上で保持しているSessionIDと照らし合わせる 4:整合性が取れたら、初回訪問時の状態を踏まえてページを表示する ※なぜSessionが必要なのか Cookieのみの場合、Cookieはクライアント側管理であるため、改竄が可能であり不正アクセスなどの恐れがある。 SessionはWebサーバー上で保持しているSessionIDとの整合性を確かめる為、改竄ができない。 ・おまけ Cookieは検証ツールのApplication→Storge→Cookieから確認することができる
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS勉強備忘録(自分用)

はじめに 完全に殴り書きです。自分用の備忘録です。 専門用語 ■ローンチ 新しい商品やサービスの提供を(開始)すること ■オーバーヘッド コンピュータが何か処理を行った時に発生する付加的な処理(負荷になる) (実行したい処理に関わることだけど必要ない処理) ■ファイアウォール 不正な通信がネットワークに侵入することを遮断し、保護するセキュリティ対策機能 ■ストレージ データをしまっておく箱 電気が流れていなくてもデータを保存しておくことができるがCPUとやりとりはできない (CPUとやりとりするのはメモリの役割) ■I/O input/outputの略。日本語訳「入出力」 情報を入力し(input)、結果を出力する(output)という処理の総称 ■メタデータ 主となるデータの付帯情報が書いてあるデータ(補足、説明書き) ■しきい値 条件分岐の境目となる値 ■レイテンシ(latency) データ転送における指標の一つ データ転送の要求を出してから結果が帰ってくるまでにかかる時間 レイテンシが低い = 処理速度が早い ■スループット 一定期間にどれほどの処理を行うことができるかを表す指標 ■ホスティングサービス 自分らが設置したサーバーをネットワーク越しに他者へ使わせてあげること(レンタルサーバー) ■API 外部のプログラムからその機能を使わせてあげるための窓口に関する使い方などの決まりごと ■トラッキング 訪問者の行動などを記録して分析すること ■オンプレミス クラウドを使わず、コンピュータやシステムを自ら設置して自ら運用する方法(自社運用) ■DNS インターネット上でドメイン名を管理・運用するために開発されたシステム ■ポート ネットワークとPCの間にあるドアのこと(たくさんある) 通信においてデータの送受信を行う際、データの種類によって使うドアが決まっている そのドアには各々番号が割り振られており、その番号を「ポート番号」という VPCについて リージョン上に構築する仮想ネットワーク サーバーなどをAWSで使うために必要な仮想ネットワークを構築するサービス 仮想ネットワークを構築するには、 そのネットワークが持つIPアドレスの範囲を定義しなければならない ↓ IPアドレスの範囲を定義する方法として「CIDR」というものがある CIDR(サイダー)とは ネットワークを構成する際に必要なIPアドレスの範囲を決める方法 IPアドレスの範囲は世界共通ルール(下記参照) サブネットとは VPCのIPアドレスの範囲内で、さらに小さな仮想ネットワークを作成するAWSのサービス 耐障害性を考慮して、異なるアベイラビリティーゾーンにネットワークを作成できる (=1つのリージョン内の異なるアベイラビリティーゾーンにネットワークを分散できる) このサブネットは公開・非公開が設定できる =個人情報などを扱うデータベースは非公開、Webサーバーは公開のように設定可能 ※公開=public , 非公開=private サブネットもVPC同様、IPアドレスの範囲を設定しなければならない サブネットのIPアドレスの範囲はVPCで決めた範囲内でしか指定できない サブネットは複数作成可能だが、IPアドレスの範囲は重複して作成できない プライベートサブネット:インターネットに接続できないサブネット パブリックサブネット:インターネットに接続できるサブネット ルートテーブルとは インターネットからVPCに接続した時、どこに通信しにいくのか(どのサブネットにいくのか)をルール決めをしたもの サブネットの公開の設定を行う →ルートテーブルは作成時デフォルトで非公開(private)になっている。 1:ルートテーブルにインターネットゲートウェイを設定すると公開(public)になる 2:そのルートテーブルにサブネットを関連付けることで、サブネットも公開(public)になる インターネットゲートウェイとは AWSリソース(EC2インスタンスなど)とインターネット間を通信できるようにするもの(窓口) 主な役割 1:ルートテーブルにインターネットへのルートを追加する 2:EC2インスタンスのプライベートIPアドレスをパブリックIPアドレスに変換する IPアドレスについて IPアドレスはネットワークに接続された機器がもっている番号 =インターネット上の住所 IPアドレスは「ICANN」という組織が管理をしている IPアドレスの種類 1:パブリックIPアドレス(グローバルIPアドレスともいう) 2:プライベートIPアドレス パブリックIPアドレス →インターネットに接続される機器にそれぞれ個別に割り振られる番号。番号は一意 プライベートIPアドレス →インターネットに直接接続されていないネットワーク機器で利用されるIPアドレス 一意である必要はない   プライベートIPアドレスは範囲が限定的 - 10.0.0.0 ~ 10.255.255.255 - 172.16.0.0 ~ 172.31.255.255 - 192.168.0.0 ~ 192.168.255.255 EC2について EC2とは AWSのクラウドにて、仮想化基盤上にサーバーを実行するサービス(EC2 = サーバー) 仮想化とは 単一の物理サーバー上で、複数の仮想サーバーを実行すること この、仮想化基盤上にある(作った)サーバーをEC2インスタンスorインスタンスと呼ぶ EC2インスタンス これはあくまで仮想サーバーであるため、実際の処理はAWSデータセンター内にある物理サーバー上で実行される AWSデータセンターは指定したAZ内(アベイラビリティーゾーン)に存在する ENI EC2インスタンスに付与される仮想ネットワークインターフェース インスタンスのへ通信はすべてENIを経由して行われる セキュリティグループ EC2インスタンスにアクセスできる通信を制限する (許可する通信を指定し、それ以外の通信を全て遮断する) (不正な通信がネットワークに侵入することを遮断し、保護するセキュリティ対策機能) インスタンスにアタッチされているENIに関連付けられ、最大5つまで関連付けが可能 インバウンドトラフィック(インスタンスに入ってくる通信)=インバウンドルール と アウトバウンドトラフィック(インスタンスから出ていく通信)=アウトバウンドルール を 別々に設定できる ネットワークACL サブネットに属する全てのインスタンスに対して適用されるファイアウォール        (セキュリティーグループはインスタンスごとに設定するがこっちはサブネットごとに適用できる) →大枠はネットワークACLで設定し、細かいところをセキュリティグループで設定するといった使い方をする ライフサイクル EC2インスタンスを起動してから終了するまでの状態遷移のことを意味する Amazon EBSについて Amazon EBSとは EC2インスタンスで最もよく使われるストレージ ※AWSでは、CPUやメモリをもつEC2インスタンスと、HDD(ハードディスクドライブ)としてのストレージに分かれている CloudWatchについて CloudWatchとは サービス(EC2インスタンスなど)の状態を監視するシステム 利用者がサービスを使える状態であるかや、利用者の増加によってシステムに負荷が増えていないかなどを監視できる 3つの機能がある 1:モニタリング(監視) 2:可視化(監視結果をグラフで表示) 3:通知機能(設定した条件に合う時、メールで通知を送る) 自動化ツールについて AWSで利用できる自動化ツールは様々だが、一部抜粋(3つ) 1:UserData 2:InstanceMetadata 3:Launch Template 1:UserData EC2を起動した後(作成した後)に行う処理を自動化できる (例:ngnixをインストールする、Rubyをインストールするなど) EC2起動時、インスタンスの詳細設定の一番下、高度な詳細の中にユーザーデータというフォームがある。 そのフォームにインストールなどで実行するコマンドを記載すると、インスタンス作成後にそのコマンドを実行してくれる 2:InstanceMetadata 実行中のEC2インスタンスに関する情報を取得することができる EC2インスタンスにSSH接続後、コマンド入力 ec2-metadata --help →コマンドのオプション一覧が出力される そのオプションを参照し、ec2-metadata  オプションとコマンド入力することで情報取得が可能になる 3:Launch Template EC2インスタンスを起動(作成)するための設定をテンプレートとして保存できるサービス EC2サイドバーの「 テンプレートの起動」から設定が可能 ※起動テンプレートは設定に不具合があってもインスタンスを作成してしまう →インスタンス起動時にエラーが表示される。 踏み台サーバーとバッチサーバー 踏み台サーバー(Bastion)とは インターネットに直接接続されていないサーバーにアクセスするためのサーバー (privateサブネット内のサーバーにアクセスするためのpublicサブネット内のサーバー) バッチサーバーとは あるタイミングでまとめて処理を実行することを目的としたサーバー バッチサーバーへアクセスするには 踏み台サーバーにssh接続後、そこからバッチサーバーにssh接続する(=鍵が2つ必要) 秘密鍵の送り方 踏み台サーバーにssh接続した状態で、バッチサーバーの秘密鍵をドラック&ドロップしても使えない ↓ 下記手順で対応する 1:ローカル環境時に踏み台サーバー用と、バッチーサーバー用の2つの鍵を置く(ドラック&ドロップ) 2:ローカル環境から踏み台サーバーへ、バッチサーバー用の鍵を送る(scpコマンド) コマンド形式 scp -i 踏み台サーバー用秘密鍵へのpath バッチサーバー用秘密鍵のpath ユーザー名@踏み台サーバーのpublicIPアドレス:鍵保存場所のpath イメージ例 scp -i A B C:D CにAを使って接続し、DにBを保存する AWS責任共有モデル AWS責任共有モデルとは AWS側と利用者側で役割分担を行い、全体のセキュリティを担保しようという考え方 IAM AWSにログインできるユーザー追加し、 そのユーザーのアクセス権限を管理できるサービス イメージ ユーザー名「○○」でログインしていいよ!(IAMユーザーの作成・追加) でも、EC2インスタンス見ることしかできないからね!(アクセス権限の設定) MFA AWSを2段階認証できるサービス CloudTrail ユーザーやAWSサービスが実行したアクションを「イベント」として記録するサービス 90日感保存でき、活動を可視化することにより、不正利用などを監査することができる 90日より多く保存したい場合は有料(「証跡」を作成してS3に保存) Amazon S3 Amazon Simple Strage Serviceの略 クラウド上にデータやファイルを保存できるサービス Amazon S3の特徴 1:容量無制限 保存できるデータ容量とオブジェクト数は無制限。※オブジェクトサイズは最大5TBまで 2:高度な耐久性 3:拡張性のある複数のストレージクラス どんなときに使うのがおすすめか 大規模なデータ配信を行うアプリケーションやサービス ↓ 他のストレージとファイルを転送する際の性能は差がないが、同時に複数ファイルを転送する際に他のストレージより性能が落ちにくいため S3に保存するデータは最低3つのアベイラビリティゾーンに自動的に保存される。 →高度な耐久性を維持することができる。 そのため、データの更新や削除は反映に時間がかかってしまう。 (=あるユーザーの更新内容を別のユーザーがすぐに反映しなければならないアプリには不向き) Application Load Balancer(ALB) ディザスタリカバリ(Disaster Recovery)(DR)とは 自然災害やサイバー攻撃などでデータセンターやシステムの稼働に門外が発生した場合、 損害の軽減や機能の維持、回復や復旧のための対策を講じること DR環境 = メインのデータセンターとは離れた場所にある別のデータセンターにコピー環境を構築しておく Application Load Balancerとは アプリケーションへの(サーバーへの)アクセスを分散させるサービス アプリケーションへの(サーバーへの)アクセスを分散させることで、アクセス集中による負荷を軽減し、処理速度の工場や、高い可用性の維持を行うことができる ※ロードバランサーは使用した分のみ料金が発生する (アクセスがない場合でも固定時間料金がかかるため、1ヶ月で18ドルは最低でもランニングコストがかかる) スティッキーセッションとは サーバーが複数ある場合、初回リクエストで保存したSessionIDで持った状態で別のWebサーバーにアクセスしてしまう可能性がある。(別のWebサーバーから見れば初回リクエストである為、Sessionを維持することができない) この問題を解消するために 「セッションが有効ない間は同じサーバーにリクエストする」という設定を行う必要がある。 その設定が「スティッキーセッション」である CookieとSession (前提) HTTP通信はステートレス ステートレス:状態を保持することができない(例:ログイン状態をページ遷移時に保持できない) Cookieとは Webサーバーが発効し、ブラウザで保持されるテキストデータのこと このCookieをクライアント側(ユーザー側)で保存することにより、 次回訪問時に、状態を保持した状態で表示することができる Cookieの処理順序 初回訪問時 1:ブラウザにアクセスした時、WebサーバーからCookieが発行される 2:ブラウザ(クライアント)がCookieを保存する 次回訪問時 3:ブラウザでアクセスするときにCookieも一緒に持っていく 4:WebサーバーはCookieを参照し、初回訪問時の状態を踏まえてレスポンスを返す Sessionとは Webサーバーで保持されるクライアントWebサーバーの通信状態を表すデータ ・ポイント Cookieはクライアント側で保持 Sessionはサーバー側で保持 Sessionの処理順序 初回訪問時 1:ブラウザにアクセスしたクライアントの「Email」と「Password」を元に「SessionID」を発行する 2:SessionIDをCookieに渡す(Webサーバー側でもSessionIDを管理) 次回訪問時 3:Cookie内のSessionIDをWebサーバー上で保持しているSessionIDと照らし合わせる 4:整合性が取れたら、初回訪問時の状態を踏まえてページを表示する ※なぜSessionが必要なのか Cookieのみの場合、Cookieはクライアント側管理であるため、改竄が可能であり不正アクセスなどの恐れがある。 SessionはWebサーバー上で保持しているSessionIDとの整合性を確かめる為、改竄ができない。 ・おまけ Cookieは検証ツールのApplication→Storge→Cookieから確認することができる
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS S3 からバケットごと一括でダウンロードするとき手順メモ

AWS S3 からバケットごと落としてくるとき自分用メモです。 初めてされる方は公式ドキュメントを読みましょう。 aws コマンドのインストール curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" unzip awscliv2.zip sudo ./aws/install aws --version 接続情報の設定 aws configure バケット取ってくる mkdir bucket-name aws s3 cp -r s3://bucket-name ./bucket-name/ --exclude "*_logs*" --recursive
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS仕組み

AWSの仕組みについて勉強したのでメモしていきます。 EC2は簡易的なサーバーのようなもの アカウントさえあれば数分で作ることが可能。 またELB(ロードバランサー)を使用すれば冗長構成も可能 メインとセカンダリのサーバを構成できる。 後にDBを追加して解析、蓄積も可能(RDS) ネットワークを構築して使用する場合は VPCに接続して仮想的に、サーバーの運用が可能 外部に繋いでいく場合、DNSサービスとしてRoute53というサービスがある またバックアップにS3というストレージに保存可能 仕組み アンマネージド スケーリング 冗長構成 ユーザー側で管理 設定が柔軟 EC2 サーバのセッティングは自分でやる マネージド AWS側で管理 設定範囲が限定的 Route53 AWS側で管理 100%の可用率 グローバルインフラ構成 リージョン>AZ>エッジロケーション 世界中に多数のデータセンター リージョン 24 地域で分けられている  中国は他国と違う 中国はデータを提示する義務がある 日本には東京 大阪がある リージョン間は物理的に完全に独立したインフラ拠点 隣接リジョン間は物理的なネットワーク回線で接続されている 例)障害対応で東京のインフラのバックアップを大阪にとっておく リージョンに応じてAWSサービスの利用可否がある BCP対策のために他リージョンにサーバ構成すると良い direct connect GW AZ 76 リージョンの中にAZが存在する AZに物理サーバがある そのAZないの物理サーバを仮想化して提供している 複数AZでセカンダリサーバやDBを構築しておくのが基本 エッジロケーション 205以上 キャッシュデータなどを利用する際のさらに小さなエンドポイントとなる拠点 AWS全体像 試験で問われる内容 必須レベル アプリケーション統合、コンピューティング、AWSコスト管理 DB、マネジメントコンソール、移行と転送、ネットワーキングとコンテンツ配信 セキュリティ・アイデンティティ・コンプラ、ストレージ その他 分析、コンテナ、開発者用ツール、機械学習 コンピューティング EC2 仮想サーバを立ち上げるサービス ELB/AutoScaling/セキュリティグループ Lambda サーバレスでプログラミングコード処理を実行するサービス Lightsail EC2より簡単 ECS Docker形式でインフラを総合的に構成できる ストレージ S3 可用性、耐久性が高い 中長期に向いてる 大量にデータ保存可能 EBS EC2にネットワークを介してアタッチして利用する専用のブロックストレージ インスタンスストア EC2に物理的に接続されている一時データ保存用ストレージ EFS 複数のEC2インスタンス間で内部用でアクセス S3Glacier あまり使用しないバックアップとかに使う ネットワーキングやコンテンツ配信 VPC 仮想ネットワーキング環境を構築するサービス クラウドフロント コンテンツ配信ネットワークサービス Route53 DNSサーバの機能提供 ドメイン登録とルーティング direct connect AWSとデータセンター、オフィス、コロケーション環境との間にプライベート接続を確立するサービス API GW 他のサービスからアクセスする ストレージGW オンプレとクラウドストレージを連携構成を使える データベース マネージド型で提供されている RDS  リレーショナルDBサービス Aurora RDSのデータベースエンジンとして使われる RDSより高性能なRDBを使う場合はこっち dynamo DB 規模に関係なく数ミリ秒台のパフォーマンスを発揮する キーバリュー型のノンSQL型のDB セッション管理、ドキュメント管理 ElastiCache インメモリ型データストア メモリ内にキャッシュをためて最速に接続できる Redshift 高速かつシンプルで費用効果の高い完全マネージド型のデータウェアハウス データ分析に使う 今日はここまで 明日清書してみやすくします
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

自分用メモ: CloudWatchの捉え方

CloudWatchは時系列DBを直接操作させてくれるサービスと捉えれる. InfluxDBは時系列DBである. InfluxDBにはContinuous Queryというのがある. メトリクスの保持 CloudWatch には、メトリクスデータが次のように保持されます。 * 期間が 60 秒未満のデータポイントは、3 時間使用できます。これらのデータポイントは高解像度カスタムメトリクスです。 * 期間が 60 秒 (1 分) のデータポイントは、15 日間使用できます。 * 期間が 300 秒 (5 分) のデータポイントは、63 日間使用できます。 * 期間が 3600 秒 (1 時間) のデータポイントは、455 日 (15 か月) 間使用できます。 InfluxDBではこれはこの様に表現できる. それぞれの粒度毎にDB又はtableを分けて表現する. 期間が 60 秒 (1 分) のデータポイントは、15 日間使用できます CREATE CONTINUOUS QUERY "60" ON "log_group" BEGIN SELECT * INTO "log_group"."15days"."log_stream" FROM "original" GROUP BY time(60s) END 期間が 300 秒 (5 分) のデータポイントは、63 日間使用できます。 CREATE CONTINUOUS QUERY "300" ON "log_group" BEGIN SELECT * INTO "log_group"."63days"."log_stream" FROM "original" GROUP BY time(300s) END 期間が 3600 秒 (1 時間) のデータポイントは、455 日 (15 か月) 間使用できます。 CREATE CONTINUOUS QUERY "3600" ON "log_group" BEGIN SELECT * INTO "log_group"."63days"."log_stream" FROM "original" GROUP BY time(3600s) END CloudWatchのコンソール上ではこの様に作成されたtableを選択肢し、queryをしている様に見受けられる. 参考文献 https://qiita.com/nmrmsys/items/cdeb4afa76c591acfd3f https://zkat.hatenablog.com/entry/2020/01/01/013519
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Django アプリを AWS EC2 にデプロイ

はじめに フロントエンド React + バックエンド Django REST Framework でアプリを作成したが、ローカル環境でしか動かすことができないので、AWS EC2 インスタンス上にデプロイして外部からもアクセスができるようにする。React アプリを AWS EC2 にデプロイにて、フロントエンド側をデプロイしたので、今回はバックエンドである DRF API をデプロイすることとし、Web サーバーソフトウェアには、nginx を用いる。なお DRF API はすでに作成されていることを前提とする。【丁寧解説】秒速でもDjango 3アプリをAWS EC2で公開【Nginx, gunicorn, postgresqlデプロイ】を参考にした。 GitHub への push デプロイ前にコードを GitHub へ push する。DB との接続情報など機密情報があるので、(レポジトリ自体を private にしているが念のため)あらかじめ別ファイルとして GitHub 上へはあげないようにする。まず環境変数の管理を行う django-environ パッケージをインストールする。 $ pip install django-environ [Django] django-environで環境変数を管理してみる djangoを参考に .env ファイルを作成する。ここでは SECRET_KEY, DEBUG, DATABASE_URL の3項目を記述している。.env ファイルは GitHub 上にあげないように、以下のような .gitignore ファイルも合わせて作成する。 .gitignore .env 次に .env ファイルに分けた情報を settings.py にて読み込むために以下のようにコードを修正する。 settings.py import environ import os env = environ.Env() env.read_env(os.path.join(BASE_DIR, '.env')) SECRET_KEY = env('SECRET_KEY') DEBUG = env('DEBUG') DATABASES = { 'default': env.db(), } 以下コマンドで、必要なライブラリを requirements.txt に書き出す。 $ pip freeze > requirements.txt $ sudo apt update $ sudo apt install python3-pip $ pip install --upgrade pip $ pip install -r requirements.txt 上記までを実行したら、GitHub のリモートレポジトリに push する。 EC2 インスタンスの作成、nginx のインストールおよびセットアップ 基本的には React アプリを AWS EC2 にデプロイと同様に実行するだけなので、ここでは割愛。 DRF API の起動 GitHub に push されているアプリをクローンして起動する。まず git をインストールして、レポジトリをクローンする。 $ sudo yum -y install git $ git clone https://github.com/<your repository> Django アプリが動作する環境を作成するため、Python3 およびパッケージ管理ツールである pip をインストールする。 $ sudo apt update $ sudo apt install python3 python3-pip アプリに必要なライブラリをインストールして、起動する。 $ cd <your repository> $ pip install -r requirements.txt $ python3 manage.py runserver 以上で、Django アプリが起動できる。 おわりに 1つのサーバーに1つのアプリをデプロイすることができた。nginx について理解を深め、より複雑な設定等も扱えるようにしたい。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

motoを使ったテストで Access Denied

はじめに 個人の備忘録用です。 各種バージョン Python : 3.7 pytest : 6.2.4 boto3 : 1.17.71 moto : 2.0.6 問題点 motoを使って単体テストを実装した時に、boto3がなぜか実際のAWSに接続していた。 実際のコード 実際の処理 import boto3 class S3Service: def __init__(self): self.client = s3.client('s3', aws_access_key_id="aws_key", aws_secret_access_key="aws_secret", region_name="ap-northeast-1") def upload(self, key: str, file_path: str): with open(file_path, "rb") as file: self.client.put_object(Body=file.read(), Key=key, Bucket="my-bucket") テストコード import pytest from moto import mock_s3 import boto3 from app.services import S3Service s3_service = S3Service() class TestSample: @classmethod def setup_class(cls): cls.mock_s3 = mock_s3() cls.mock_s3.start() cls.client_s3 = boto3.client('s3', region_name="ap-northeast-1") cls.client_s3.create_bucket(Bucket="my-bucket", CreateBucketConfiguration={ 'LocationConstraint': "my-bucket" }) @classmethod def teardown_class(cls): cls.mock_s3.stop() def test_success(self): s3_service.upload("key1", "path_to_test_file") エラー内容 botocore.exceptions.ClientError: An error occurred (InvalidAccessKeyId) when calling the PutObject operation: The AWS Access Key Id you provided does not exist in our records. 解決案 原因は、mock_s3を起動する前にboto3のclientを生成していたから。 なので、テストコードを以下のように修正するだけで解決できる。 import pytest from moto import mock_s3 import boto3 from app.services import S3Service class TestSample: @classmethod def setup_class(cls): cls.mock_s3 = mock_s3() cls.mock_s3.start() cls.client_s3 = boto3.client('s3', region_name="ap-northeast-1") cls.client_s3.create_bucket(Bucket="my-bucket", CreateBucketConfiguration={ 'LocationConstraint': "my-bucket" }) clse.s3_service = S3Service() @classmethod def teardown_class(cls): cls.mock_s3.stop() def test_success(self): self.s3_service.upload("key1", "path_to_test_file") もしくは、本体のコードが Dependency Injection などの機能を使っていて、 テスト実行時にはどうしてもインスタンスが生成されている場合は、 本体のコードを以下のように変更すると対応可能。 import boto3 class S3Service: def upload(self, key: str, file_path: str): with open(file_path, "rb") as file: self._client().put_object(Body=file.read(), Key=key, Bucket="my-bucket") def _client(self): return s3.client('s3', aws_access_key_id="aws_key", aws_secret_access_key="aws_secret", region_name="ap-northeast-1") おわりに 何かありましたらコメント頂けると幸いです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

まだドメインのリダイレクトをAmazon S3でやっているの?

はじめに サブドメインをネイキッドドメインにリダイレクトする方法を探していたら、AWSが出しているある記事を見つけました。 そこには、あるドメインを別のドメインにリダイレクトするときのAWSベストプラクティスが、Amazon S3でリダイレクトするのではなくて、ALBを使ってリダイレクト設定することになっていました。 参考資料: https://aws.amazon.com/jp/premiumsupport/knowledge-center/elb-redirect-to-another-domain-with-alb/ 今まで私はAmazon S3のWebサイトホスティングでサブドメインのリダイレクトをかけてました(www.XXXX.jp → XXXX.jp へのリダイレクト)。また、S3単体ではHTTPSに対応していないため、CloudFront+S3でリダイレクトをしていた人も多いのではないでしょうか。 ですが、ALBのリダイレクト機能を使えば、CloudFrontがなくてもHTTPSのリダイレクトもできます。 前提条件 以下の前提で手順は行います。 証明書はACMで発行しており、ワイルドカードを取得している ALBはすでに構築済み Terraformのバージョンはv0.14以降であること 今回のお題 www.example.comを example.com にリダイレクトさせようと思います。 Terraformコード GUIの手順としてはAWSの資料に記載の通りなので、 ここでは、手順をTerraformのコードに落とそうと思います。 ちなみにあるALBのリスナーをこのように編集すれば特定のURLをリダイレクトしてくれます。 # このコードでは *.example.comとexample.comをACMで証明書取得していることにします # www.example.comとexample.comは同じALBに向けています。 data "aws_route53_zone" "example_com" { name = "example.com" } resource "aws_route53_record" "a_example_com" { zone_id = data.aws_route53_zone.example_com.zone_id name = "example.com." type = "A" alias { name = aws_lb.example.dns_name zone_id = aws_lb.example.zone_id evaluate_target_health = false } } resource "aws_route53_record" "a_www_example_com" { zone_id = data.aws_route53_zone.example_com.zone_id name = "www.example.com." type = "A" alias { name = aws_lb.example.dns_name zone_id = aws_lb.example.zone_id evaluate_target_health = false } } # ALBの設定 resource "aws_lb" "example" { # ... } resource "aws_lb_listener" "example" { # Other parameters } ## ALBのリスナールールでリダイレクトを記載 ## ここでwww.example.comをexample.comにリダイレクトする resource "aws_lb_listener_rule" "example" { listener_arn = aws_lb_listener.example.arn priority = 1 condition { host_header { values = ["www.example.com"] } } action { type = "redirect" redirect { host = "example.com" protocol = "HTTPS" status_code = "HTTP_301" } } }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[AWS認定] AWS デベロッパーアソシエイト(DVA)に受かるまでにやったこと

AWS-DVAに受かりました! 2021年4月に試験を受けてAWS-DVAに合格したのでその紹介です。 事前知識・スキル 業務ではこれまでAWSを1年間少し触った程度。lambdaとは?とかS3とは?とか聞かれて何となく分かるような感じでした。 AWS-SAA取得済み(2020年12月末)。AWSの試験の感じとか、業務でやらないサービスの概要がつかめたり、AWSでのインフラ設計が理論だけならちょっとわかるぞ?というレベルになれました。 どうやって勉強した? AWS認定って紙の本とか(SAA以外は)全然なくて本当に勉強しづらい!!過去問もないし。ということで困っている方が多いのではないかということで、この記事を書いています。SAAは書籍もたくさん出ているし、いろんな記事にも書かれているので比較的勉強しやすかったんですが、、、。まぁAWSのサービスは日々進歩してるし紙の書籍出してもすぐレベルアップしちゃうからいろいろ追いつかないんでしょうね。個人的には紙の本買って書き込みながら勉強する派なので、どうしようかと悩みました。。。以下にやったことをまとめようと思います。 試験ガイドを読む SAAの試験後、年が明けてから公式ページの試験ガイドを読みました。とりあえず5分くらい読んだだけ。 AWS WEB問題集で学習しよう AWS DVAでググりまくると、このサイトで随分な人が勉強していたので、自分も有料会員登録して問題集を解いてみました。とりあえず問題の感じとか、どんな問題が出るのかをつかめます。一度本とかで体系的にまとまったもので勉強したい派なのでいきなり問題集で学び始めるのがちょっと気持ち悪かったですがまぁしょうがない。。。どんな問題が出るか把握して、わからないところはBlack Beltやらで潰していこう、という気持ちでした。正直ちょっとお高いですが、SOAやプロフェッショナルでも問題集を活用できる(期限90日だけど)と考えるとまぁありなのかな・・・?という気持ちでした。 これを一通り終わらせたあとに模擬試験を受けてみました。 AWS公式模擬試験 SAA合格時の特典として、模試一回分を無料で受けられたので、ある程度(Web問題集で勉強しようが終わったくらい)勉強を進めて、なんとなく試験受けようかなってときになってから受けました。 結果は、総合スコア:55%でした。これはまずい、と思いUdemyの講座を買いました。 udemyの問題集(AWS 認定デベロッパー アソシエイト模擬試験問題集(5回分325問)) 今回は購入せずに済むかな・・・?と思いましたが結局買いました。 問題演習をひたすらしました。 Black Belt SAAのときは正直あんまり見なくてもなんとかなりそうだったので、あまり見ませんでした。今回は詳しい使い方とか問われることが多かったので、結構たくさん見ました。 Cognito X-Ray ECS API GateWay Cloudformation Elastic Beanstalk KMS CodeBuild Step Function 受験結果 904/1000でした。結構高得点でしたね! 感想 1月にAWS WEB問題集で学習しようで有料アカウント登録して、SAA受かった直後だったので1ヶ月くらいで行けるかなーと思いきや、結構のんびりやってしまったので4ヶ月ほどかかってしまいました。 特にお世話になったのが、やはりudemyの問題集です。 合格体験記とかを見てよく見るのが、本試験はudemyよりちょっと簡単というくらい、という感想ですが、まさにそのとおりでした。ちょっとどころか、結構簡単に感じました。udemyで3~4周くらいやればとりあえず受かるかな、と思います。 ただ、udemyの問題だけだと出てきた問題以外は解けないので、やはりサービスの理解としてBlack Beltを見るのはとても良いと思います。 仕事後に1時間、youtubeで各サービスについて見たりしました。 あとStep Functionについては問題集ではあまり触れられていませんが、本試験ではそこそこ出てくるのでBlack Beltは見ておいたほうが良いです。 トレノケートさんから出てるポケットスタディも良書のようです。僕は買いませんでしたが、試験対策に良さそうですね。 次はSOAか・・・?でも疲れたからしばらく資格の試験はやめようかな・・・笑
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【AWS】VPC間の接続方法

プログラミング勉強日記 2021年5月13日 VPCを分割する場合  アプリサービスや組織構成などの用途に応じてVPCを分ける。  具体的には、アプリケーションによってVPCを分ける・監査のスコープによって分ける・リスクが高いものを別のVPCにする・本番/検証/開発によって分ける・部署などの組織ごとに分ける。 VPC間の接続  VPCはVPC Peeringというやり方で2つのVPC間でのトラフィックルーティングが可能。異なるAWSアカウント間のVPC間や一部の異なるリージョン間の異なるVPC間の接続も可能。単一障害点や帯域幅のボトルネックは存在しなくて、Peeringに対してはマネーシド型でAWSが冗長性などを対応している。  VPC Peeringの仕組みは、基本的には1対1。以下の図では、左側のAZ(10.0.2.0/24)から右側にあるAZ(10.0.1.0/24)には、下のAZ(10.0.3.0/24)が介しているように見えるが直接的に左のAZから右のAZにアクセスはできない。  左のものから右のものにアクセスしたい場合は、以下のようにVPC Peeringでつなげる必要がある。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

FargateサービスをHTTPSで公開するCloudFormaitonテンプレート

はじめに 30代未経験からエンジニアを目指して勉強中のYNと申します。 今回はNginxコンテナをFargateでhttps対応させるCloudFormationスタックをご紹介します。 CloudFormationを使えばインフラの作成も削除も一瞬なので積極的に使えるようになりたいですよね。 完成像は下記となります。 前提条件 AWS-CLIを設定済み ドメインを取得済み(参照) 1) IAMロールの作成 create_IAM_roles.yml AWSTemplateFormatVersion: '2010-09-09' Description: create IAM roles for ECS usage upfront Parameters: EnvironmentName: Type: String Default: ecs-course Description: "A name that will be used for namespacing all cluster resources." Resources: AutoscalingRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Effect: Allow Principal: Service: [application-autoscaling.amazonaws.com] Action: ['sts:AssumeRole'] Path: / Policies: - PolicyName: service-autoscaling PolicyDocument: Statement: - Effect: Allow Action: - 'application-autoscaling:*' - 'cloudwatch:DescribeAlarms' - 'cloudwatch:PutMetricAlarm' - 'ecs:DescribeServices' - 'ecs:UpdateService' Resource: '*' EC2Role: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Effect: Allow Principal: Service: [ec2.amazonaws.com] Action: ['sts:AssumeRole'] Path: / Policies: - PolicyName: ecs-service PolicyDocument: Statement: - Effect: Allow Action: - 'ecs:CreateCluster' - 'ecs:DeregisterContainerInstance' - 'ecs:DiscoverPollEndpoint' - 'ecs:Poll' - 'ecs:RegisterContainerInstance' - 'ecs:StartTelemetrySession' - 'ecs:Submit*' - 'logs:CreateLogStream' - 'logs:PutLogEvents' - 'ecr:GetAuthorizationToken' - 'ecr:BatchGetImage' - 'ecr:GetDownloadUrlForLayer' Resource: '*' ECSRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Effect: Allow Principal: Service: [ecs.amazonaws.com] Action: ['sts:AssumeRole'] Path: / Policies: - PolicyName: ecs-service PolicyDocument: Statement: - Effect: Allow Action: # Rules which allow ECS to attach network interfaces to instances # on your behalf in order for awsvpc networking mode to work right - 'ec2:AttachNetworkInterface' - 'ec2:CreateNetworkInterface' - 'ec2:CreateNetworkInterfacePermission' - 'ec2:DeleteNetworkInterface' - 'ec2:DeleteNetworkInterfacePermission' - 'ec2:Describe*' - 'ec2:DetachNetworkInterface' # Rules which allow ECS to update load balancers on your behalf # with the information sabout how to send traffic to your containers - 'elasticloadbalancing:DeregisterInstancesFromLoadBalancer' - 'elasticloadbalancing:DeregisterTargets' - 'elasticloadbalancing:Describe*' - 'elasticloadbalancing:RegisterInstancesWithLoadBalancer' - 'elasticloadbalancing:RegisterTargets' Resource: '*' ECSTaskExecutionRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Effect: Allow Principal: Service: [ecs-tasks.amazonaws.com] Action: ['sts:AssumeRole'] Path: / Policies: - PolicyName: AmazonECSTaskExecutionRolePolicy PolicyDocument: Statement: - Effect: Allow Action: # Allow the ECS Tasks to download images from ECR - 'ecr:GetAuthorizationToken' - 'ecr:BatchCheckLayerAvailability' - 'ecr:GetDownloadUrlForLayer' - 'ecr:BatchGetImage' # Allow the ECS tasks to upload logs to CloudWatch - 'logs:CreateLogStream' - 'logs:PutLogEvents' Resource: '*' Outputs: AutoscalingRole: Description: The ARN of the role used for autoscaling Value: !GetAtt 'AutoscalingRole.Arn' Export: Name: !Sub ${EnvironmentName}:AutoscalingRole ECSRole: Description: The ARN of the ECS role Value: !GetAtt 'ECSRole.Arn' Export: Name: !Sub ${EnvironmentName}:ECSRole EC2Role: Description: The ARN of the EC2 role Value: !GetAtt 'EC2Role.Arn' Export: Name: !Sub ${EnvironmentName}:EC2Role ECSTaskExecutionRole: Description: The ARN of the ECS role Value: !GetAtt 'ECSTaskExecutionRole.Arn' Export: Name: !Sub ${EnvironmentName}:ECSTaskExecutionRole aws cloudformation create-stack --stack-name create_IAM_roles --capabilities CAPABILITY_IAM --template-body file://./create_IAM_roles.yml 2) VPCの設定 vpc_setup.yml AWSTemplateFormatVersion: '2010-09-09' Description: VPC and subnets as base for an ECS cluster Parameters: EnvironmentName: Type: String Default: ecs-course Mappings: SubnetConfig: VPC: CIDR: '172.16.0.0/16' PublicOne: CIDR: '172.16.0.0/24' PublicTwo: CIDR: '172.16.1.0/24' Resources: VPC: Type: AWS::EC2::VPC Properties: EnableDnsSupport: true EnableDnsHostnames: true CidrBlock: !FindInMap ['SubnetConfig', 'VPC', 'CIDR'] PublicSubnetOne: Type: AWS::EC2::Subnet Properties: AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: { Ref: 'AWS::Region' } VpcId: !Ref 'VPC' CidrBlock: !FindInMap ['SubnetConfig', 'PublicOne', 'CIDR'] MapPublicIpOnLaunch: true PublicSubnetTwo: Type: AWS::EC2::Subnet Properties: AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: { Ref: 'AWS::Region' } VpcId: !Ref 'VPC' CidrBlock: !FindInMap ['SubnetConfig', 'PublicTwo', 'CIDR'] MapPublicIpOnLaunch: true InternetGateway: Type: AWS::EC2::InternetGateway GatewayAttachement: Type: AWS::EC2::VPCGatewayAttachment Properties: VpcId: !Ref 'VPC' InternetGatewayId: !Ref 'InternetGateway' PublicRouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref 'VPC' PublicRoute: Type: AWS::EC2::Route DependsOn: GatewayAttachement Properties: RouteTableId: !Ref 'PublicRouteTable' DestinationCidrBlock: '0.0.0.0/0' GatewayId: !Ref 'InternetGateway' PublicSubnetOneRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PublicSubnetOne RouteTableId: !Ref PublicRouteTable PublicSubnetTwoRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PublicSubnetTwo RouteTableId: !Ref PublicRouteTable Outputs: DefaultRegion: Description: The default region setting on aws-cli Value: { Ref: 'AWS::Region' } Export: Name: !Sub ${EnvironmentName}:Region VpcId: Description: The ID of the VPC that this stack is deployed in Value: !Ref 'VPC' Export: Name: !Sub ${EnvironmentName}:VpcId PublicSubnetOne: Description: Public subnet one Value: !Ref 'PublicSubnetOne' Export: Name: !Sub ${EnvironmentName}:PublicSubnetOne PublicSubnetTwo: Description: Public subnet two Value: !Ref 'PublicSubnetTwo' Export: Name: !Sub ${EnvironmentName}:PublicSubnetTwo aws cloudformation create-stack --stack-name vpc_setup --capabilities CAPABILITY_IAM --template-body file://./vpc_setup.yml 3) ECSクラスターの設定 ecs_cluster_setup.yml AWSTemplateFormatVersion: '2010-09-09' Description: VPC and subnets as base for an ECS cluster Parameters: EnvironmentName: Type: String Default: ecs-course Mappings: SubnetConfig: VPC: CIDR: '172.16.0.0/16' PublicOne: CIDR: '172.16.0.0/24' PublicTwo: CIDR: '172.16.1.0/24' Resources: VPC: Type: AWS::EC2::VPC Properties: EnableDnsSupport: true EnableDnsHostnames: true CidrBlock: !FindInMap ['SubnetConfig', 'VPC', 'CIDR'] PublicSubnetOne: Type: AWS::EC2::Subnet Properties: AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: { Ref: 'AWS::Region' } VpcId: !Ref 'VPC' CidrBlock: !FindInMap ['SubnetConfig', 'PublicOne', 'CIDR'] MapPublicIpOnLaunch: true PublicSubnetTwo: Type: AWS::EC2::Subnet Properties: AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: { Ref: 'AWS::Region' } VpcId: !Ref 'VPC' CidrBlock: !FindInMap ['SubnetConfig', 'PublicTwo', 'CIDR'] MapPublicIpOnLaunch: true InternetGateway: Type: AWS::EC2::InternetGateway GatewayAttachement: Type: AWS::EC2::VPCGatewayAttachment Properties: VpcId: !Ref 'VPC' InternetGatewayId: !Ref 'InternetGateway' PublicRouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref 'VPC' PublicRoute: Type: AWS::EC2::Route DependsOn: GatewayAttachement Properties: RouteTableId: !Ref 'PublicRouteTable' DestinationCidrBlock: '0.0.0.0/0' GatewayId: !Ref 'InternetGateway' PublicSubnetOneRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PublicSubnetOne RouteTableId: !Ref PublicRouteTable PublicSubnetTwoRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PublicSubnetTwo RouteTableId: !Ref PublicRouteTable Outputs: DefaultRegion: Description: The default region setting on aws-cli Value: { Ref: 'AWS::Region' } Export: Name: !Sub ${EnvironmentName}:Region VpcId: Description: The ID of the VPC that this stack is deployed in Value: !Ref 'VPC' Export: Name: !Sub ${EnvironmentName}:VpcId PublicSubnetOne: Description: Public subnet one Value: !Ref 'PublicSubnetOne' Export: Name: !Sub ${EnvironmentName}:PublicSubnetOne PublicSubnetTwo: Description: Public subnet two Value: !Ref 'PublicSubnetTwo' Export: Name: !Sub ${EnvironmentName}:PublicSubnetTwo aws cloudformation create-stack --stack-name ecs_cluster_setup --capabilities CAPABILITY_IAM --template-body file://./ecs_cluster_setup.yml 4) Route53 + ACM + ALB + ECS(Fargate)の設定 https_nginx_setup.yml AWSTemplateFormatVersion: '2010-09-09' Description: External, public facing load balancer, for forwarding public traffic to containers Parameters: DomainName: Description: FQDN of the HostZone Type: String Default: '<your domain name>' # 自分で取得したドメイン名を指定 SubDomain: Description: FQDN of the certificate Type: String Default: '<your sub-domain name>' # サブドメイン名を指定 HostZoneId: Description: FQDN of the hosted zone Type: String Default: '<your host-zone-id>' # Route53で上記ドメインのホストゾーンIDを確認して入力 EnvironmentName: Type: String Default: ecs-course ServiceName: Type: String Default: nginx-service Description: A name for the service ImageUrl: Type: String Default: nginx:1.17.7 Description: The url of a docker image that contains the application process that will handle the traffic for this service ContainerPort: Type: Number Default: 80 Description: What port number the application inside the docker container is binding to ContainerCpu: Type: Number Default: 256 Description: How much CPU to give the container. 1024 is 1 CPU ContainerMemory: Type: Number Default: 512 Description: How much memory in megabytes to give the container Priority: Type: Number Default: 1 Description: The priority for the routing rule added to the load balancer. This only applies if your have multiple services which have been assigned to different paths on the load balancer. DesiredCount: Type: Number Default: 2 Description: How many copies of the service task to run Role: Type: String Default: '' Description: (Optional) An IAM role to give the service's containers if the code within needs to access other AWS resources like S3 buckets, DynamoDB tables, etc Conditions: HasCustomRole: !Not [!Equals [!Ref 'Role', '']] Resources: # A log group for storing the stdout logs from this service's containers LogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: !Sub ${EnvironmentName}-service-${ServiceName} # The task definition. This is a simple metadata description of what # container to run, and what resource requirements it has. TaskDefinition: Type: AWS::ECS::TaskDefinition Properties: Family: !Ref 'ServiceName' Cpu: !Ref 'ContainerCpu' Memory: !Ref 'ContainerMemory' NetworkMode: awsvpc RequiresCompatibilities: - FARGATE ExecutionRoleArn: Fn::ImportValue: !Sub ${EnvironmentName}:ECSTaskExecutionRole TaskRoleArn: Fn::If: #三項演算子。1行目がtrueなら2行目が参照され、falseなら3行目が参照される - 'HasCustomRole' - !Ref 'Role' - !Ref 'AWS::NoValue' ContainerDefinitions: - Name: !Ref 'ServiceName' Cpu: !Ref 'ContainerCpu' Memory: !Ref 'ContainerMemory' Image: !Ref 'ImageUrl' PortMappings: - ContainerPort: !Ref 'ContainerPort' LogConfiguration: LogDriver: 'awslogs' Options: awslogs-group: !Sub ${EnvironmentName}-service-${ServiceName} awslogs-region: !Ref 'AWS::Region' awslogs-stream-prefix: !Ref 'ServiceName' # The service. The service is a resource which allows you to run multiple # copies of a type of task, and gather up their logs and metrics, as well # as monitor the number of running tasks and replace any that have crashed Service: Type: AWS::ECS::Service DependsOn: HTTPSLoadBalancerListener Properties: ServiceName: !Ref 'ServiceName' Cluster: Fn::ImportValue: !Sub ${EnvironmentName}:ClusterName LaunchType: FARGATE DeploymentConfiguration: MaximumPercent: 200 MinimumHealthyPercent: 75 DesiredCount: !Ref 'DesiredCount' NetworkConfiguration: AwsvpcConfiguration: AssignPublicIp: ENABLED SecurityGroups: - Fn::ImportValue: !Sub ${EnvironmentName}:ContainerSecurityGroup Subnets: - Fn::ImportValue: !Sub ${EnvironmentName}:PublicSubnetOne - Fn::ImportValue: !Sub ${EnvironmentName}:PublicSubnetTwo TaskDefinition: !Ref 'TaskDefinition' LoadBalancers: - ContainerName: !Ref 'ServiceName' ContainerPort: !Ref 'ContainerPort' TargetGroupArn: !Ref 'TargetGroup' ApiDomain: Type: AWS::Route53::RecordSet DependsOn: PublicLoadBalancer Properties: HostedZoneId: !Sub '${HostZoneId}' Name: !Sub '${SubDomain}' Type: CNAME TTL: 60 ResourceRecords: - !GetAtt PublicLoadBalancer.DNSName ACMCertificate: Type: AWS::CertificateManager::Certificate Properties: DomainName: !Sub '${SubDomain}' DomainValidationOptions: - DomainName: !Sub '${SubDomain}' HostedZoneId: !Sub '${HostZoneId}' ValidationMethod: DNS PublicLoadBalancerSG: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Access to the public facing load balancer VpcId: Fn::ImportValue: !Sub ${EnvironmentName}:VpcId SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 0.0.0.0/0 - IpProtocol: tcp FromPort: 443 ToPort: 443 CidrIp: 0.0.0.0/0 PublicLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Scheme: internet-facing LoadBalancerAttributes: - Key: idle_timeout.timeout_seconds Value: '30' Subnets: - Fn::ImportValue: !Sub ${EnvironmentName}:PublicSubnetOne - Fn::ImportValue: !Sub ${EnvironmentName}:PublicSubnetTwo SecurityGroups: [!Ref 'PublicLoadBalancerSG'] HTTPLoadBalancerListener: # 80=>443に転送する Type: AWS::ElasticLoadBalancingV2::Listener DependsOn: - PublicLoadBalancer Properties: DefaultActions: - Type: 'redirect' RedirectConfig: Protocol: 'HTTPS' Port: 443 Host: '#{host}' Path: '/#{path}' Query: '#{query}' StatusCode: 'HTTP_301' LoadBalancerArn: !Ref 'PublicLoadBalancer' Port: 80 Protocol: HTTP HTTPSLoadBalancerListener: # SSL設定してTargetGroupに転送 Type: AWS::ElasticLoadBalancingV2::Listener DependsOn: PublicLoadBalancer Properties: LoadBalancerArn: !Ref 'PublicLoadBalancer' Port: 443 Protocol: HTTPS DefaultActions: - Type: 'forward' TargetGroupArn: !Ref 'TargetGroup' SslPolicy: 'ELBSecurityPolicy-2016-08' Certificates: - CertificateArn: !Ref 'ACMCertificate' TargetGroup: # Serviceを参照させる Type: AWS::ElasticLoadBalancingV2::TargetGroup DependsOn: PublicLoadBalancer Properties: HealthCheckIntervalSeconds: 6 HealthCheckPath: / HealthCheckProtocol: HTTP HealthCheckTimeoutSeconds: 5 HealthyThresholdCount: 2 TargetType: ip #fargateなのでVPC内のipをtargetにする。EC2であればinstanceがtargetになる Name: !Ref 'ServiceName' Port: !Ref 'ContainerPort' Protocol: HTTP UnhealthyThresholdCount: 2 VpcId: Fn::ImportValue: !Sub ${EnvironmentName}:VpcId Outputs: ExternalUrl: Description: The url of the external load balancer Value: !Sub https://${PublicLoadBalancer.DNSName} Export: Name: !Sub ${EnvironmentName}:ExternalUrl aws cloudformation create-stack --stack-name https_nginx_setup --capabilities CAPABILITY_IAM --template-body file://./https_nginx_setup.yml
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ECSサービス(Fargate)をHTTPSで公開するCloudFormaitonテンプレート

はじめに 30代未経験からエンジニアを目指して勉強中のYNと申します。 今回はNginxコンテナをFargateでhttps対応させるCloudFormationスタックをご紹介します。 CloudFormationを使えばインフラの作成も削除も一瞬なので積極的に使えるようになりたいですよね。 完成像は下記となります。 前提条件 AWS-CLIを設定済み ドメインを取得済み(参照) 1) IAMロールの作成 create_IAM_roles.yml AWSTemplateFormatVersion: '2010-09-09' Description: create IAM roles for ECS usage upfront Parameters: EnvironmentName: Type: String Default: ecs-course Description: "A name that will be used for namespacing all cluster resources." Resources: AutoscalingRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Effect: Allow Principal: Service: [application-autoscaling.amazonaws.com] Action: ['sts:AssumeRole'] Path: / Policies: - PolicyName: service-autoscaling PolicyDocument: Statement: - Effect: Allow Action: - 'application-autoscaling:*' - 'cloudwatch:DescribeAlarms' - 'cloudwatch:PutMetricAlarm' - 'ecs:DescribeServices' - 'ecs:UpdateService' Resource: '*' EC2Role: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Effect: Allow Principal: Service: [ec2.amazonaws.com] Action: ['sts:AssumeRole'] Path: / Policies: - PolicyName: ecs-service PolicyDocument: Statement: - Effect: Allow Action: - 'ecs:CreateCluster' - 'ecs:DeregisterContainerInstance' - 'ecs:DiscoverPollEndpoint' - 'ecs:Poll' - 'ecs:RegisterContainerInstance' - 'ecs:StartTelemetrySession' - 'ecs:Submit*' - 'logs:CreateLogStream' - 'logs:PutLogEvents' - 'ecr:GetAuthorizationToken' - 'ecr:BatchGetImage' - 'ecr:GetDownloadUrlForLayer' Resource: '*' ECSRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Effect: Allow Principal: Service: [ecs.amazonaws.com] Action: ['sts:AssumeRole'] Path: / Policies: - PolicyName: ecs-service PolicyDocument: Statement: - Effect: Allow Action: # Rules which allow ECS to attach network interfaces to instances # on your behalf in order for awsvpc networking mode to work right - 'ec2:AttachNetworkInterface' - 'ec2:CreateNetworkInterface' - 'ec2:CreateNetworkInterfacePermission' - 'ec2:DeleteNetworkInterface' - 'ec2:DeleteNetworkInterfacePermission' - 'ec2:Describe*' - 'ec2:DetachNetworkInterface' # Rules which allow ECS to update load balancers on your behalf # with the information sabout how to send traffic to your containers - 'elasticloadbalancing:DeregisterInstancesFromLoadBalancer' - 'elasticloadbalancing:DeregisterTargets' - 'elasticloadbalancing:Describe*' - 'elasticloadbalancing:RegisterInstancesWithLoadBalancer' - 'elasticloadbalancing:RegisterTargets' Resource: '*' ECSTaskExecutionRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Effect: Allow Principal: Service: [ecs-tasks.amazonaws.com] Action: ['sts:AssumeRole'] Path: / Policies: - PolicyName: AmazonECSTaskExecutionRolePolicy PolicyDocument: Statement: - Effect: Allow Action: # Allow the ECS Tasks to download images from ECR - 'ecr:GetAuthorizationToken' - 'ecr:BatchCheckLayerAvailability' - 'ecr:GetDownloadUrlForLayer' - 'ecr:BatchGetImage' # Allow the ECS tasks to upload logs to CloudWatch - 'logs:CreateLogStream' - 'logs:PutLogEvents' Resource: '*' Outputs: AutoscalingRole: Description: The ARN of the role used for autoscaling Value: !GetAtt 'AutoscalingRole.Arn' Export: Name: !Sub ${EnvironmentName}:AutoscalingRole ECSRole: Description: The ARN of the ECS role Value: !GetAtt 'ECSRole.Arn' Export: Name: !Sub ${EnvironmentName}:ECSRole EC2Role: Description: The ARN of the EC2 role Value: !GetAtt 'EC2Role.Arn' Export: Name: !Sub ${EnvironmentName}:EC2Role ECSTaskExecutionRole: Description: The ARN of the ECS role Value: !GetAtt 'ECSTaskExecutionRole.Arn' Export: Name: !Sub ${EnvironmentName}:ECSTaskExecutionRole aws cloudformation create-stack --stack-name create_IAM_roles --capabilities CAPABILITY_IAM --template-body file://./create_IAM_roles.yml 2) VPCの設定 vpc_setup.yml AWSTemplateFormatVersion: '2010-09-09' Description: VPC and subnets as base for an ECS cluster Parameters: EnvironmentName: Type: String Default: ecs-course Mappings: SubnetConfig: VPC: CIDR: '172.16.0.0/16' PublicOne: CIDR: '172.16.0.0/24' PublicTwo: CIDR: '172.16.1.0/24' Resources: VPC: Type: AWS::EC2::VPC Properties: EnableDnsSupport: true EnableDnsHostnames: true CidrBlock: !FindInMap ['SubnetConfig', 'VPC', 'CIDR'] PublicSubnetOne: Type: AWS::EC2::Subnet Properties: AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: { Ref: 'AWS::Region' } VpcId: !Ref 'VPC' CidrBlock: !FindInMap ['SubnetConfig', 'PublicOne', 'CIDR'] MapPublicIpOnLaunch: true PublicSubnetTwo: Type: AWS::EC2::Subnet Properties: AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: { Ref: 'AWS::Region' } VpcId: !Ref 'VPC' CidrBlock: !FindInMap ['SubnetConfig', 'PublicTwo', 'CIDR'] MapPublicIpOnLaunch: true InternetGateway: Type: AWS::EC2::InternetGateway GatewayAttachement: Type: AWS::EC2::VPCGatewayAttachment Properties: VpcId: !Ref 'VPC' InternetGatewayId: !Ref 'InternetGateway' PublicRouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref 'VPC' PublicRoute: Type: AWS::EC2::Route DependsOn: GatewayAttachement Properties: RouteTableId: !Ref 'PublicRouteTable' DestinationCidrBlock: '0.0.0.0/0' GatewayId: !Ref 'InternetGateway' PublicSubnetOneRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PublicSubnetOne RouteTableId: !Ref PublicRouteTable PublicSubnetTwoRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PublicSubnetTwo RouteTableId: !Ref PublicRouteTable Outputs: DefaultRegion: Description: The default region setting on aws-cli Value: { Ref: 'AWS::Region' } Export: Name: !Sub ${EnvironmentName}:Region VpcId: Description: The ID of the VPC that this stack is deployed in Value: !Ref 'VPC' Export: Name: !Sub ${EnvironmentName}:VpcId PublicSubnetOne: Description: Public subnet one Value: !Ref 'PublicSubnetOne' Export: Name: !Sub ${EnvironmentName}:PublicSubnetOne PublicSubnetTwo: Description: Public subnet two Value: !Ref 'PublicSubnetTwo' Export: Name: !Sub ${EnvironmentName}:PublicSubnetTwo aws cloudformation create-stack --stack-name vpc_setup --capabilities CAPABILITY_IAM --template-body file://./vpc_setup.yml 3) ECSクラスターの設定 ecs_cluster_setup.yml AWSTemplateFormatVersion: '2010-09-09' Description: VPC and subnets as base for an ECS cluster Parameters: EnvironmentName: Type: String Default: ecs-course Mappings: SubnetConfig: VPC: CIDR: '172.16.0.0/16' PublicOne: CIDR: '172.16.0.0/24' PublicTwo: CIDR: '172.16.1.0/24' Resources: VPC: Type: AWS::EC2::VPC Properties: EnableDnsSupport: true EnableDnsHostnames: true CidrBlock: !FindInMap ['SubnetConfig', 'VPC', 'CIDR'] PublicSubnetOne: Type: AWS::EC2::Subnet Properties: AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: { Ref: 'AWS::Region' } VpcId: !Ref 'VPC' CidrBlock: !FindInMap ['SubnetConfig', 'PublicOne', 'CIDR'] MapPublicIpOnLaunch: true PublicSubnetTwo: Type: AWS::EC2::Subnet Properties: AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: { Ref: 'AWS::Region' } VpcId: !Ref 'VPC' CidrBlock: !FindInMap ['SubnetConfig', 'PublicTwo', 'CIDR'] MapPublicIpOnLaunch: true InternetGateway: Type: AWS::EC2::InternetGateway GatewayAttachement: Type: AWS::EC2::VPCGatewayAttachment Properties: VpcId: !Ref 'VPC' InternetGatewayId: !Ref 'InternetGateway' PublicRouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref 'VPC' PublicRoute: Type: AWS::EC2::Route DependsOn: GatewayAttachement Properties: RouteTableId: !Ref 'PublicRouteTable' DestinationCidrBlock: '0.0.0.0/0' GatewayId: !Ref 'InternetGateway' PublicSubnetOneRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PublicSubnetOne RouteTableId: !Ref PublicRouteTable PublicSubnetTwoRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PublicSubnetTwo RouteTableId: !Ref PublicRouteTable Outputs: DefaultRegion: Description: The default region setting on aws-cli Value: { Ref: 'AWS::Region' } Export: Name: !Sub ${EnvironmentName}:Region VpcId: Description: The ID of the VPC that this stack is deployed in Value: !Ref 'VPC' Export: Name: !Sub ${EnvironmentName}:VpcId PublicSubnetOne: Description: Public subnet one Value: !Ref 'PublicSubnetOne' Export: Name: !Sub ${EnvironmentName}:PublicSubnetOne PublicSubnetTwo: Description: Public subnet two Value: !Ref 'PublicSubnetTwo' Export: Name: !Sub ${EnvironmentName}:PublicSubnetTwo aws cloudformation create-stack --stack-name ecs_cluster_setup --capabilities CAPABILITY_IAM --template-body file://./ecs_cluster_setup.yml 4) Route53 + ACM + ALB + ECS(Fargate)の設定 https_nginx_setup.yml AWSTemplateFormatVersion: '2010-09-09' Description: External, public facing load balancer, for forwarding public traffic to containers Parameters: DomainName: Description: FQDN of the HostZone Type: String Default: '<your domain name>' # 自分で取得したドメイン名を指定 SubDomain: Description: FQDN of the certificate Type: String Default: '<your sub-domain name>' # サブドメイン名を指定 HostZoneId: Description: FQDN of the hosted zone Type: String Default: '<your host-zone-id>' # Route53で上記ドメインのホストゾーンIDを確認して入力 EnvironmentName: Type: String Default: ecs-course ServiceName: Type: String Default: nginx-service Description: A name for the service ImageUrl: Type: String Default: nginx:1.17.7 Description: The url of a docker image that contains the application process that will handle the traffic for this service ContainerPort: Type: Number Default: 80 Description: What port number the application inside the docker container is binding to ContainerCpu: Type: Number Default: 256 Description: How much CPU to give the container. 1024 is 1 CPU ContainerMemory: Type: Number Default: 512 Description: How much memory in megabytes to give the container Priority: Type: Number Default: 1 Description: The priority for the routing rule added to the load balancer. This only applies if your have multiple services which have been assigned to different paths on the load balancer. DesiredCount: Type: Number Default: 2 Description: How many copies of the service task to run Role: Type: String Default: '' Description: (Optional) An IAM role to give the service's containers if the code within needs to access other AWS resources like S3 buckets, DynamoDB tables, etc Conditions: HasCustomRole: !Not [!Equals [!Ref 'Role', '']] Resources: # A log group for storing the stdout logs from this service's containers LogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: !Sub ${EnvironmentName}-service-${ServiceName} # The task definition. This is a simple metadata description of what # container to run, and what resource requirements it has. TaskDefinition: Type: AWS::ECS::TaskDefinition Properties: Family: !Ref 'ServiceName' Cpu: !Ref 'ContainerCpu' Memory: !Ref 'ContainerMemory' NetworkMode: awsvpc RequiresCompatibilities: - FARGATE ExecutionRoleArn: Fn::ImportValue: !Sub ${EnvironmentName}:ECSTaskExecutionRole TaskRoleArn: Fn::If: #三項演算子。1行目がtrueなら2行目が参照され、falseなら3行目が参照される - 'HasCustomRole' - !Ref 'Role' - !Ref 'AWS::NoValue' ContainerDefinitions: - Name: !Ref 'ServiceName' Cpu: !Ref 'ContainerCpu' Memory: !Ref 'ContainerMemory' Image: !Ref 'ImageUrl' PortMappings: - ContainerPort: !Ref 'ContainerPort' LogConfiguration: LogDriver: 'awslogs' Options: awslogs-group: !Sub ${EnvironmentName}-service-${ServiceName} awslogs-region: !Ref 'AWS::Region' awslogs-stream-prefix: !Ref 'ServiceName' # The service. The service is a resource which allows you to run multiple # copies of a type of task, and gather up their logs and metrics, as well # as monitor the number of running tasks and replace any that have crashed Service: Type: AWS::ECS::Service DependsOn: HTTPSLoadBalancerListener Properties: ServiceName: !Ref 'ServiceName' Cluster: Fn::ImportValue: !Sub ${EnvironmentName}:ClusterName LaunchType: FARGATE DeploymentConfiguration: MaximumPercent: 200 MinimumHealthyPercent: 75 DesiredCount: !Ref 'DesiredCount' NetworkConfiguration: AwsvpcConfiguration: AssignPublicIp: ENABLED SecurityGroups: - Fn::ImportValue: !Sub ${EnvironmentName}:ContainerSecurityGroup Subnets: - Fn::ImportValue: !Sub ${EnvironmentName}:PublicSubnetOne - Fn::ImportValue: !Sub ${EnvironmentName}:PublicSubnetTwo TaskDefinition: !Ref 'TaskDefinition' LoadBalancers: - ContainerName: !Ref 'ServiceName' ContainerPort: !Ref 'ContainerPort' TargetGroupArn: !Ref 'TargetGroup' ApiDomain: Type: AWS::Route53::RecordSet DependsOn: PublicLoadBalancer Properties: HostedZoneId: !Sub '${HostZoneId}' Name: !Sub '${SubDomain}' Type: CNAME TTL: 60 ResourceRecords: - !GetAtt PublicLoadBalancer.DNSName ACMCertificate: Type: AWS::CertificateManager::Certificate Properties: DomainName: !Sub '${SubDomain}' DomainValidationOptions: - DomainName: !Sub '${SubDomain}' HostedZoneId: !Sub '${HostZoneId}' ValidationMethod: DNS PublicLoadBalancerSG: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Access to the public facing load balancer VpcId: Fn::ImportValue: !Sub ${EnvironmentName}:VpcId SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 0.0.0.0/0 - IpProtocol: tcp FromPort: 443 ToPort: 443 CidrIp: 0.0.0.0/0 PublicLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Scheme: internet-facing LoadBalancerAttributes: - Key: idle_timeout.timeout_seconds Value: '30' Subnets: - Fn::ImportValue: !Sub ${EnvironmentName}:PublicSubnetOne - Fn::ImportValue: !Sub ${EnvironmentName}:PublicSubnetTwo SecurityGroups: [!Ref 'PublicLoadBalancerSG'] HTTPLoadBalancerListener: # 80=>443に転送する Type: AWS::ElasticLoadBalancingV2::Listener DependsOn: - PublicLoadBalancer Properties: DefaultActions: - Type: 'redirect' RedirectConfig: Protocol: 'HTTPS' Port: 443 Host: '#{host}' Path: '/#{path}' Query: '#{query}' StatusCode: 'HTTP_301' LoadBalancerArn: !Ref 'PublicLoadBalancer' Port: 80 Protocol: HTTP HTTPSLoadBalancerListener: # SSL設定してTargetGroupに転送 Type: AWS::ElasticLoadBalancingV2::Listener DependsOn: PublicLoadBalancer Properties: LoadBalancerArn: !Ref 'PublicLoadBalancer' Port: 443 Protocol: HTTPS DefaultActions: - Type: 'forward' TargetGroupArn: !Ref 'TargetGroup' SslPolicy: 'ELBSecurityPolicy-2016-08' Certificates: - CertificateArn: !Ref 'ACMCertificate' TargetGroup: # Serviceを参照させる Type: AWS::ElasticLoadBalancingV2::TargetGroup DependsOn: PublicLoadBalancer Properties: HealthCheckIntervalSeconds: 6 HealthCheckPath: / HealthCheckProtocol: HTTP HealthCheckTimeoutSeconds: 5 HealthyThresholdCount: 2 TargetType: ip #fargateなのでVPC内のipをtargetにする。EC2であればinstanceがtargetになる Name: !Ref 'ServiceName' Port: !Ref 'ContainerPort' Protocol: HTTP UnhealthyThresholdCount: 2 VpcId: Fn::ImportValue: !Sub ${EnvironmentName}:VpcId Outputs: ExternalUrl: Description: The url of the external load balancer Value: !Sub https://${PublicLoadBalancer.DNSName} Export: Name: !Sub ${EnvironmentName}:ExternalUrl aws cloudformation create-stack --stack-name https_nginx_setup --capabilities CAPABILITY_IAM --template-body file://./https_nginx_setup.yml
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ECSサービス(Fargate)をHTTPSで公開するCloudFormationテンプレート

はじめに 30代未経験からエンジニアを目指して勉強中のYNと申します。 今回はNginxコンテナをFargateでhttps対応させるCloudFormationスタックをご紹介します。 CloudFormationを使えばインフラの作成も削除も一瞬なので積極的に使えるようになりたいですよね。 完成像は下記となります。 前提条件 AWS-CLIを設定済み ドメインを取得済み(参照) 1) IAMロールの作成 create_IAM_roles.yml AWSTemplateFormatVersion: '2010-09-09' Description: create IAM roles for ECS usage upfront Parameters: EnvironmentName: Type: String Default: ecs-course Description: "A name that will be used for namespacing all cluster resources." Resources: AutoscalingRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Effect: Allow Principal: Service: [application-autoscaling.amazonaws.com] Action: ['sts:AssumeRole'] Path: / Policies: - PolicyName: service-autoscaling PolicyDocument: Statement: - Effect: Allow Action: - 'application-autoscaling:*' - 'cloudwatch:DescribeAlarms' - 'cloudwatch:PutMetricAlarm' - 'ecs:DescribeServices' - 'ecs:UpdateService' Resource: '*' EC2Role: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Effect: Allow Principal: Service: [ec2.amazonaws.com] Action: ['sts:AssumeRole'] Path: / Policies: - PolicyName: ecs-service PolicyDocument: Statement: - Effect: Allow Action: - 'ecs:CreateCluster' - 'ecs:DeregisterContainerInstance' - 'ecs:DiscoverPollEndpoint' - 'ecs:Poll' - 'ecs:RegisterContainerInstance' - 'ecs:StartTelemetrySession' - 'ecs:Submit*' - 'logs:CreateLogStream' - 'logs:PutLogEvents' - 'ecr:GetAuthorizationToken' - 'ecr:BatchGetImage' - 'ecr:GetDownloadUrlForLayer' Resource: '*' ECSRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Effect: Allow Principal: Service: [ecs.amazonaws.com] Action: ['sts:AssumeRole'] Path: / Policies: - PolicyName: ecs-service PolicyDocument: Statement: - Effect: Allow Action: # Rules which allow ECS to attach network interfaces to instances # on your behalf in order for awsvpc networking mode to work right - 'ec2:AttachNetworkInterface' - 'ec2:CreateNetworkInterface' - 'ec2:CreateNetworkInterfacePermission' - 'ec2:DeleteNetworkInterface' - 'ec2:DeleteNetworkInterfacePermission' - 'ec2:Describe*' - 'ec2:DetachNetworkInterface' # Rules which allow ECS to update load balancers on your behalf # with the information sabout how to send traffic to your containers - 'elasticloadbalancing:DeregisterInstancesFromLoadBalancer' - 'elasticloadbalancing:DeregisterTargets' - 'elasticloadbalancing:Describe*' - 'elasticloadbalancing:RegisterInstancesWithLoadBalancer' - 'elasticloadbalancing:RegisterTargets' Resource: '*' ECSTaskExecutionRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Effect: Allow Principal: Service: [ecs-tasks.amazonaws.com] Action: ['sts:AssumeRole'] Path: / Policies: - PolicyName: AmazonECSTaskExecutionRolePolicy PolicyDocument: Statement: - Effect: Allow Action: # Allow the ECS Tasks to download images from ECR - 'ecr:GetAuthorizationToken' - 'ecr:BatchCheckLayerAvailability' - 'ecr:GetDownloadUrlForLayer' - 'ecr:BatchGetImage' # Allow the ECS tasks to upload logs to CloudWatch - 'logs:CreateLogStream' - 'logs:PutLogEvents' Resource: '*' Outputs: AutoscalingRole: Description: The ARN of the role used for autoscaling Value: !GetAtt 'AutoscalingRole.Arn' Export: Name: !Sub ${EnvironmentName}:AutoscalingRole ECSRole: Description: The ARN of the ECS role Value: !GetAtt 'ECSRole.Arn' Export: Name: !Sub ${EnvironmentName}:ECSRole EC2Role: Description: The ARN of the EC2 role Value: !GetAtt 'EC2Role.Arn' Export: Name: !Sub ${EnvironmentName}:EC2Role ECSTaskExecutionRole: Description: The ARN of the ECS role Value: !GetAtt 'ECSTaskExecutionRole.Arn' Export: Name: !Sub ${EnvironmentName}:ECSTaskExecutionRole aws cloudformation create-stack --stack-name create_IAM_roles --capabilities CAPABILITY_IAM --template-body file://./create_IAM_roles.yml 2) VPCの設定 vpc_setup.yml AWSTemplateFormatVersion: '2010-09-09' Description: VPC and subnets as base for an ECS cluster Parameters: EnvironmentName: Type: String Default: ecs-course Mappings: SubnetConfig: VPC: CIDR: '172.16.0.0/16' PublicOne: CIDR: '172.16.0.0/24' PublicTwo: CIDR: '172.16.1.0/24' Resources: VPC: Type: AWS::EC2::VPC Properties: EnableDnsSupport: true EnableDnsHostnames: true CidrBlock: !FindInMap ['SubnetConfig', 'VPC', 'CIDR'] PublicSubnetOne: Type: AWS::EC2::Subnet Properties: AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: { Ref: 'AWS::Region' } VpcId: !Ref 'VPC' CidrBlock: !FindInMap ['SubnetConfig', 'PublicOne', 'CIDR'] MapPublicIpOnLaunch: true PublicSubnetTwo: Type: AWS::EC2::Subnet Properties: AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: { Ref: 'AWS::Region' } VpcId: !Ref 'VPC' CidrBlock: !FindInMap ['SubnetConfig', 'PublicTwo', 'CIDR'] MapPublicIpOnLaunch: true InternetGateway: Type: AWS::EC2::InternetGateway GatewayAttachement: Type: AWS::EC2::VPCGatewayAttachment Properties: VpcId: !Ref 'VPC' InternetGatewayId: !Ref 'InternetGateway' PublicRouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref 'VPC' PublicRoute: Type: AWS::EC2::Route DependsOn: GatewayAttachement Properties: RouteTableId: !Ref 'PublicRouteTable' DestinationCidrBlock: '0.0.0.0/0' GatewayId: !Ref 'InternetGateway' PublicSubnetOneRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PublicSubnetOne RouteTableId: !Ref PublicRouteTable PublicSubnetTwoRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PublicSubnetTwo RouteTableId: !Ref PublicRouteTable Outputs: DefaultRegion: Description: The default region setting on aws-cli Value: { Ref: 'AWS::Region' } Export: Name: !Sub ${EnvironmentName}:Region VpcId: Description: The ID of the VPC that this stack is deployed in Value: !Ref 'VPC' Export: Name: !Sub ${EnvironmentName}:VpcId PublicSubnetOne: Description: Public subnet one Value: !Ref 'PublicSubnetOne' Export: Name: !Sub ${EnvironmentName}:PublicSubnetOne PublicSubnetTwo: Description: Public subnet two Value: !Ref 'PublicSubnetTwo' Export: Name: !Sub ${EnvironmentName}:PublicSubnetTwo aws cloudformation create-stack --stack-name vpc_setup --capabilities CAPABILITY_IAM --template-body file://./vpc_setup.yml 3) ECSクラスターの設定 ecs_cluster_setup.yml AWSTemplateFormatVersion: '2010-09-09' Description: VPC and subnets as base for an ECS cluster Parameters: EnvironmentName: Type: String Default: ecs-course Mappings: SubnetConfig: VPC: CIDR: '172.16.0.0/16' PublicOne: CIDR: '172.16.0.0/24' PublicTwo: CIDR: '172.16.1.0/24' Resources: VPC: Type: AWS::EC2::VPC Properties: EnableDnsSupport: true EnableDnsHostnames: true CidrBlock: !FindInMap ['SubnetConfig', 'VPC', 'CIDR'] PublicSubnetOne: Type: AWS::EC2::Subnet Properties: AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: { Ref: 'AWS::Region' } VpcId: !Ref 'VPC' CidrBlock: !FindInMap ['SubnetConfig', 'PublicOne', 'CIDR'] MapPublicIpOnLaunch: true PublicSubnetTwo: Type: AWS::EC2::Subnet Properties: AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: { Ref: 'AWS::Region' } VpcId: !Ref 'VPC' CidrBlock: !FindInMap ['SubnetConfig', 'PublicTwo', 'CIDR'] MapPublicIpOnLaunch: true InternetGateway: Type: AWS::EC2::InternetGateway GatewayAttachement: Type: AWS::EC2::VPCGatewayAttachment Properties: VpcId: !Ref 'VPC' InternetGatewayId: !Ref 'InternetGateway' PublicRouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref 'VPC' PublicRoute: Type: AWS::EC2::Route DependsOn: GatewayAttachement Properties: RouteTableId: !Ref 'PublicRouteTable' DestinationCidrBlock: '0.0.0.0/0' GatewayId: !Ref 'InternetGateway' PublicSubnetOneRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PublicSubnetOne RouteTableId: !Ref PublicRouteTable PublicSubnetTwoRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PublicSubnetTwo RouteTableId: !Ref PublicRouteTable Outputs: DefaultRegion: Description: The default region setting on aws-cli Value: { Ref: 'AWS::Region' } Export: Name: !Sub ${EnvironmentName}:Region VpcId: Description: The ID of the VPC that this stack is deployed in Value: !Ref 'VPC' Export: Name: !Sub ${EnvironmentName}:VpcId PublicSubnetOne: Description: Public subnet one Value: !Ref 'PublicSubnetOne' Export: Name: !Sub ${EnvironmentName}:PublicSubnetOne PublicSubnetTwo: Description: Public subnet two Value: !Ref 'PublicSubnetTwo' Export: Name: !Sub ${EnvironmentName}:PublicSubnetTwo aws cloudformation create-stack --stack-name ecs_cluster_setup --capabilities CAPABILITY_IAM --template-body file://./ecs_cluster_setup.yml 4) Route53 + ACM + ALB + ECS(Fargate)の設定 https_nginx_setup.yml AWSTemplateFormatVersion: '2010-09-09' Description: External, public facing load balancer, for forwarding public traffic to containers Parameters: DomainName: Description: FQDN of the HostZone Type: String Default: '<your domain name>' # 自分で取得したドメイン名を指定 SubDomain: Description: FQDN of the certificate Type: String Default: '<your sub-domain name>' # サブドメイン名を指定 HostZoneId: Description: FQDN of the hosted zone Type: String Default: '<your host-zone-id>' # Route53で上記ドメインのホストゾーンIDを確認して入力 EnvironmentName: Type: String Default: ecs-course ServiceName: Type: String Default: nginx-service Description: A name for the service ImageUrl: Type: String Default: nginx:1.17.7 Description: The url of a docker image that contains the application process that will handle the traffic for this service ContainerPort: Type: Number Default: 80 Description: What port number the application inside the docker container is binding to ContainerCpu: Type: Number Default: 256 Description: How much CPU to give the container. 1024 is 1 CPU ContainerMemory: Type: Number Default: 512 Description: How much memory in megabytes to give the container Priority: Type: Number Default: 1 Description: The priority for the routing rule added to the load balancer. This only applies if your have multiple services which have been assigned to different paths on the load balancer. DesiredCount: Type: Number Default: 2 Description: How many copies of the service task to run Role: Type: String Default: '' Description: (Optional) An IAM role to give the service's containers if the code within needs to access other AWS resources like S3 buckets, DynamoDB tables, etc Conditions: HasCustomRole: !Not [!Equals [!Ref 'Role', '']] Resources: # A log group for storing the stdout logs from this service's containers LogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: !Sub ${EnvironmentName}-service-${ServiceName} # The task definition. This is a simple metadata description of what # container to run, and what resource requirements it has. TaskDefinition: Type: AWS::ECS::TaskDefinition Properties: Family: !Ref 'ServiceName' Cpu: !Ref 'ContainerCpu' Memory: !Ref 'ContainerMemory' NetworkMode: awsvpc RequiresCompatibilities: - FARGATE ExecutionRoleArn: Fn::ImportValue: !Sub ${EnvironmentName}:ECSTaskExecutionRole TaskRoleArn: Fn::If: #三項演算子。1行目がtrueなら2行目が参照され、falseなら3行目が参照される - 'HasCustomRole' - !Ref 'Role' - !Ref 'AWS::NoValue' ContainerDefinitions: - Name: !Ref 'ServiceName' Cpu: !Ref 'ContainerCpu' Memory: !Ref 'ContainerMemory' Image: !Ref 'ImageUrl' PortMappings: - ContainerPort: !Ref 'ContainerPort' LogConfiguration: LogDriver: 'awslogs' Options: awslogs-group: !Sub ${EnvironmentName}-service-${ServiceName} awslogs-region: !Ref 'AWS::Region' awslogs-stream-prefix: !Ref 'ServiceName' # The service. The service is a resource which allows you to run multiple # copies of a type of task, and gather up their logs and metrics, as well # as monitor the number of running tasks and replace any that have crashed Service: Type: AWS::ECS::Service DependsOn: HTTPSLoadBalancerListener Properties: ServiceName: !Ref 'ServiceName' Cluster: Fn::ImportValue: !Sub ${EnvironmentName}:ClusterName LaunchType: FARGATE DeploymentConfiguration: MaximumPercent: 200 MinimumHealthyPercent: 75 DesiredCount: !Ref 'DesiredCount' NetworkConfiguration: AwsvpcConfiguration: AssignPublicIp: ENABLED SecurityGroups: - Fn::ImportValue: !Sub ${EnvironmentName}:ContainerSecurityGroup Subnets: - Fn::ImportValue: !Sub ${EnvironmentName}:PublicSubnetOne - Fn::ImportValue: !Sub ${EnvironmentName}:PublicSubnetTwo TaskDefinition: !Ref 'TaskDefinition' LoadBalancers: - ContainerName: !Ref 'ServiceName' ContainerPort: !Ref 'ContainerPort' TargetGroupArn: !Ref 'TargetGroup' ApiDomain: Type: AWS::Route53::RecordSet DependsOn: PublicLoadBalancer Properties: HostedZoneId: !Sub '${HostZoneId}' Name: !Sub '${SubDomain}' Type: CNAME TTL: 60 ResourceRecords: - !GetAtt PublicLoadBalancer.DNSName ACMCertificate: Type: AWS::CertificateManager::Certificate Properties: DomainName: !Sub '${SubDomain}' DomainValidationOptions: - DomainName: !Sub '${SubDomain}' HostedZoneId: !Sub '${HostZoneId}' ValidationMethod: DNS PublicLoadBalancerSG: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Access to the public facing load balancer VpcId: Fn::ImportValue: !Sub ${EnvironmentName}:VpcId SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 0.0.0.0/0 - IpProtocol: tcp FromPort: 443 ToPort: 443 CidrIp: 0.0.0.0/0 PublicLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Scheme: internet-facing LoadBalancerAttributes: - Key: idle_timeout.timeout_seconds Value: '30' Subnets: - Fn::ImportValue: !Sub ${EnvironmentName}:PublicSubnetOne - Fn::ImportValue: !Sub ${EnvironmentName}:PublicSubnetTwo SecurityGroups: [!Ref 'PublicLoadBalancerSG'] HTTPLoadBalancerListener: # 80=>443に転送する Type: AWS::ElasticLoadBalancingV2::Listener DependsOn: - PublicLoadBalancer Properties: DefaultActions: - Type: 'redirect' RedirectConfig: Protocol: 'HTTPS' Port: 443 Host: '#{host}' Path: '/#{path}' Query: '#{query}' StatusCode: 'HTTP_301' LoadBalancerArn: !Ref 'PublicLoadBalancer' Port: 80 Protocol: HTTP HTTPSLoadBalancerListener: # SSL設定してTargetGroupに転送 Type: AWS::ElasticLoadBalancingV2::Listener DependsOn: PublicLoadBalancer Properties: LoadBalancerArn: !Ref 'PublicLoadBalancer' Port: 443 Protocol: HTTPS DefaultActions: - Type: 'forward' TargetGroupArn: !Ref 'TargetGroup' SslPolicy: 'ELBSecurityPolicy-2016-08' Certificates: - CertificateArn: !Ref 'ACMCertificate' TargetGroup: # Serviceを参照させる Type: AWS::ElasticLoadBalancingV2::TargetGroup DependsOn: PublicLoadBalancer Properties: HealthCheckIntervalSeconds: 6 HealthCheckPath: / HealthCheckProtocol: HTTP HealthCheckTimeoutSeconds: 5 HealthyThresholdCount: 2 TargetType: ip #fargateなのでVPC内のipをtargetにする。EC2であればinstanceがtargetになる Name: !Ref 'ServiceName' Port: !Ref 'ContainerPort' Protocol: HTTP UnhealthyThresholdCount: 2 VpcId: Fn::ImportValue: !Sub ${EnvironmentName}:VpcId Outputs: ExternalUrl: Description: The url of the external load balancer Value: !Sub https://${PublicLoadBalancer.DNSName} Export: Name: !Sub ${EnvironmentName}:ExternalUrl aws cloudformation create-stack --stack-name https_nginx_setup --capabilities CAPABILITY_IAM --template-body file://./https_nginx_setup.yml
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む