20210508のAWSに関する記事は17件です。

Amplify Consoleでホスティングした静的サイトの前段にCloudFrontを建ててLambda@EdgeでカスタムOGP対応する

Amplify Consoleでホスティングした静的サイトの前段にCloudFrontを建ててLambda@EdgeでカスタムOGP対応する Amplify Consoleでホスティングしている静的サイトがあります。 このサイトはOGP対応をしていますが、どのページも同じ内容で表示されてしまいます。 SPA(Single Page Application)ではなくSSG(Static Site Generation)でビルドすることにより、個別ページのOGP設定ができるそうなのですが、ビルド時に決まらない、IDでGETしたページに対してカスタムOGP画像を表示したいのです。 (1) https://yoteiasobi.w2or3w.com/ (2) https://yoteiasobi.w2or3w.com/calendars/ic019t7gn99ckp27vtjjm2d6ro@group.calendar.google.com どちらも以下のように同じOGP画像が表示されてしまうのですが、 これを、(2)の場合は以下のように独自のOGP画像が表示されるようにしたい。 (独自のOGP画像は予め作成しておくこととする。) それを実現するための記事となります。 現在の設定を確認する まず初めに、Amplify ConsoleとRoute53の設定を確認しておきます。 備考 : 独自ドメインのサブドメインをAmplify Consoleで割り当てる方法については以前、以下の記事に書きました。 お名前.comで取得した独自ドメインのサブドメインだけでなくルートドメインも割り当てる お名前.comで取得した独自ドメインのサブドメインをAmplify Consoleで割り当てる Amplify Console Amplify Console > ドメイン管理 mainブランチ に https://yoteiasobi.w2or3w.com が割り当てられています。 アクション > HTTPS証明書の表示 アクション > DNSレコードの表示 この辺りの設定も確認しておきます。 この辺の設定は、Amplify Consoleが自動的に設定してくれていたものです。後ほどドメイン割り当てを削除した上で、同じような設定をCloudFrontに対して行うことになります。 Route53 Route53 > ホストゾーン > yoteiasobi.w2or3w.com AレコードとCNAMEレコードはAmplify Consoleのドメイン割り当てにより自動的に設定されたものです。 こちらもAmplify Consoleのドメイン割り当てを削除した後に、設定しなおすことになります。 Amplify Console で独自ドメイン割り当てを削除する それでは取り掛かってゆきます。 まずは、Amplify Consoleで設定している独自ドメインの割り当てを削除します。 Amplify Console > ドメイン管理 アクション > 削除 削除されました。 この時点で、 https://yoteiasobi.w2or3w.com/ からはサイトへアクセスできなくなります。 Route53のホストゾーンも確認してみましょう。 Route53 > ホストゾーン > yoteiasobi.w2or3w.com Amplify Consoleで割り当てドメインを削除すると、Aレコードも削除されることが見て取れます。 CNAMEは残ってますが、後ほど削除して新たに登録することになります。 CloudFrontでディストリビューションを作成する 続いて、CloudFrontでディストリビューションを作成します。 CloudFrontにアクセスし、CloudFront Distributions > Create Distribution ボタンを押下。 Select a delivery method for your content. で、Get Started ボタンを押下。 Create Distributionで、以下を設定。 Origin Domain Name : Amplify Consoleの目的のブランチのドメインを設定 Minimum Origin SSL Protocol : 必要に応じて設定を変更 Allowed HTTP Methods : 必要に応じて設定を変更 Alternate Domain Names (CNAMEs) : 今は空でいいです (後で設定します) SSL Certificate : 今は Default CloudFront Certificate (*.cloudfront.net) のままでいいです (後で設定します) Create Distributionボタンを押下。 ディストリビューションが作成されました。 CloudFrontが発行したアドレスでサイトが表示されること、また、証明書の内容を確認しましょう。 CloudFrontのディストリビューションに独自ドメインと証明書を割り当てる 独自ドメインでサイトにアクセスできるようにします。また証明書も発行して割り当てます。 CloudFront Distributionsで目的のディストリビューションを選択、GeneralタブのEditボタンを押下。 Edit Distribution画面で以下を設定します。 Alternate Domain Names(CNAMEs) : 目的のドメイン 証明書が無いので Custom SSL Certificate (example.com) ラジオボタンが無効状態です。 新たに証明書をリクエストするため、Request or Import a Certificate with ACM ボタンを押下します。 証明書のリクエスト画面で、以下のように設定を進めてゆきます。 ドメイン名の追加 : 目的のドメインを追加する。 検証方法の選択 : DNSの検証 を選択する。 タグを追加 : 必要に応じてタグを設定する。 確認 : 内容を確認して「確認とリクエストボタン」を押下する。 検証 : 内容を確認して「続行」ボタンを押下する。(CNAMEの値は後で使います) 証明書が発行されました。 Route53の目的のホストゾーンへレコードを作成します。 Route53 > ホストゾーン > yoteiasobi.w2or3w.com レコードを作成ボタンを押下。 レコードを作成画面にて、AレコードとCNAMEレコードを作成します。 Aレコードの作成 レコード名 : 空 レコードタイプ : A エイリアス : ON トラフィックのルーティング先 : CloudFront ディストリビューションのエイリアス ディストリビューションを選択 : CloudFront の目的のディストリビューションのドメイン名 CNAMEレコードの作成 レコード名 : 目的のドメインに発行した証明書のCNAMEレコード名 レコードタイプ : CNAME 値 : 目的のドメインに発行した証明書のCNAMEレコード値 レコード名や値はCertificate Managerで目的のドメインを選択することで確認できます。 https://console.aws.amazon.com/acm/home もともとあったCNAMEレコードは削除してください。 それでは、CloudFront Distributionsの、目的のディストリビューション編集画面へ戻りましょう。 目的のディストリビューションに作成した証明書を割り当てます。 Custom SSL Certificate (example.com) ラジオボタンを選択し、先ほど発行したドメインの証明書を選択します。 編集を完了したら、ドメインでアクセスできること、そして証明書の内容を確認してみましょう。 LambdaをCloudFrontのEdgeに割り当てる いよいよ Lambda@Edge の設定です。 私てっきりLambda@Edgeというサービスがあると思っていたのですが、そうではないんですね。 『LambdaをCloudFrontのディストリビューションへエッジ機能として割り当てる』ことをそう呼んでいるみたいです。 なお、CloudFrontから呼び出すLambdaは、リージョンを「バージニア北部」にする必要があります。 また、CloudFrontから呼び出すLambdaがサポートしているランタイムは以下のみです。(2021年5月現在) (※最新の情報は公式のページを参照ください。) Python 3.8, 3.7 Node.js 12, 10 という事で、バージニア北部にLambdaを作成しましょう。私は Python 3.8 で作成しました。名前はyoteiasobi-ogpです。 リージョン以外にも、以下を選択した上で作成します。 デフォルトの実行ロールの変更 : AWSポリシーテンプレートから新しいロールを作成を選択。 ポリシーテンプレート : 基本的な Lambda@Edge のアクセス権限 (CloudFront トリガーの場合)を選択。 Lambdaのコードを書いたらデプロイし、さらに、新しいバージョンを発行する必要があります。 CloudFrontのディストリビューションへLambdaのARNを設定するのですが、特定のバージョンを参照する必要があります。 (そうしないとエラーとなって設定できません。) Lambdaをデプロイしてバージョンを発行したら、ARNをコピーして、それをCloudFrontのディストリビューションへエッジ機能として割り当てます。 CloudFront Distributions の目的のディストリビューションを選択。 BehaviorsタブでDefault(*)を選択しEditボタンを押下。 Edit Behavior画面のEdge Function Associationsで以下の設定をします。 Edge Function : Lambda@Edgeを選択 CloudFront Event : Viewer Requestを選択 Function ARN/Name : LambdaのARN(バージョン発行したもの)を設定 さてこれで、サイトにアクセスしたらLambdaが呼ばれるようになりました。Lambda@Edgeの完成です! Lambda@Edgeのログ参照時の注意点 Lambdaが実行されたことを確認するためにCloudWatch Logsを参照することになるわけですが、知っておくべきことがあります。 CloudWatchのロググループは/aws/lambda/function-nameではなく/aws/lambda/us-east-1.function-nameへ出力されます。 LambdaのモニタリングからCloudWatchのログを表示すると/aws/lambda/function-nameへ飛ぶので注意が必要です。 また、ログが出力されるリージョンはクライアントから最も近いロケーションとなります。 日本からWebサイトへアクセスした場合は「東京」、twitterbotからの場合は「北カルフォルニア」でした。 Lambda@Edgeで例外が発生した場合 Lambdaで例外が発生した場合、503エラーが返ってしまいます。 503 ERROR The request could not be satisfied. The Lambda function associated with the CloudFront distribution is invalid or doesn't have the required permissions. We can't connect to the server for this app or website at this time. There might be too much traffic or a configuration error. Try again later, or contact the app or website owner. If you provide content to customers through CloudFront, you can find steps to troubleshoot and help prevent this error by reviewing the CloudFront documentation. カスタムOGP対応するLambda(Python) CloudFrontのViewer Requestで呼ばれるLambdaでヘッダの内容を書き換えてOGPの画像を変更します。 サンプルコードを載せておきます。 lambda_function.py import json import logging logger = logging.getLogger() logger.setLevel(logging.INFO) BOTS = [ "twitterbot", "facebookexternalhit" ] def lambda_handler(event, context): logger.info("=== START ===") logger.info(json.dumps(event, ensure_ascii=False, indent=2)) request = event["Records"][0]["cf"]["request"] headers = request["headers"] uri = request["uri"]; if "user-agent" not in headers: return request userAgent = headers["user-agent"][0]["value"].lower() logger.info("request uri = {0}".format(uri)) logger.info("userAgent = {0}".format(userAgent)) list = [item for item in BOTS if item in userAgent] logger.info(list) isBot = len(list) > 0 logger.info("isBot = {0}".format(isBot)) if not isBot: return request else: customOgpImageAddress = "https://w2or3w.s3-ap-northeast-1.amazonaws.com/yoteiasobi/images/ic019t7gn99ckp27vtjjm2d6ro%40group.calendar.google.com.png" customOgpDescription = "YOTEIASOBIのサンプルカレンダー by w2or3w" return { "status": 200, "statusDescription": "OK", "headers": { "content-type": [{ "key": "Content-Type", "value": "text/html" }] }, "body": getContent(customOgpImageAddress, customOgpDescription) } def getContent(customOgpImageAddress, customOgpDescription): return ('' '<!doctype html>' '<html>' '<head>' '<title>YOTEIASOBI</title>' '<meta data-n-head="1" charset="utf-8">' '<meta data-n-head="1" data-hid="description" name="description" content="よてい で あそぼ!YOTEIASOBI は Googleカレンダーを ゆるっと共有 できる サーバーレスWebアプリです。">' '<meta data-n-head="1" data-hid="og:site_name" property="og:site_name" content="YOTEIASOBI">' '<meta data-n-head="1" data-hid="og:type" property="og:type" content="website">' '<meta name="twitter:card" content="summary_large_image">' '<meta property="og:url" property="og:url" content="https://yoteiasobi.w2or3w.com/calendars/ic019t7gn99ckp27vtjjm2d6ro@group.calendar.google.com">' '<meta property="og:title" property="og:title" content="YOTEIASOBI">' '<meta property="og:image" property="og:image" content="{0}">'.format(customOgpImageAddress) + '<meta property="og:description" property="og:description" content="{0}">'.format(customOgpDescription) + '</head>' '<body>' '</body>' '</html>' ) OGP画像生成をテストするツール 上記コードは、TwitterやFacebookからシェアしようとした際にカスタムOGP画像に差し替える実装をしています。 動作確認する際に毎回実際に投稿するのだと大変ですが、その代わりに以下のサイトを利用するとはかどります。 https://cards-dev.twitter.com/validator https://developers.facebook.com/tools/debug/ あとがき 5/1の「浜松ITもくもく会」でコレをやろうと思ってたのですが、諸事情で出来ませんでした。 それから1週間かけて、なんとかQiitaに記事書くところまでできたから良かったです。 (厳密にいうと、アプリがOGP画像を生成するところはまだ未着手なのですが、まぁこれはそのうちやります!)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【初心者】Amazon ElastiCache for Redis を使ってみる

1. 目的 AWSのデータベース関連サービスの復習をしている。ElastiCacheを使ったことがなかったため、AWS公式のハンズオンを実施することで少し理解を深める。 2. やったこと AWS公式ハンズオン「Amazon ElastiCache for Redis を使い、MySQL データベースのパフォーマンスを向上させる」を一通り実施する。 ハンズオンをなぞるだけでは今一つ動作が見えないため、Redis内のデータ保存状態を確認するなど、少し追加の動作確認を行う。 3. Amazon ElastiCache とは(自分の理解) インメモリDBであるMemcachedとRedisをAWSがマネージドサービスとして提供しているもの。 4. 構成図 5. 実機確認手順 AWS公式ハンズオン「Amazon ElastiCache for Redis を使い、MySQL データベースのパフォーマンスを向上させる」をそのまま実施するが、疑問に思った点を追加で確認する。 公式ハンズオン手順に記載されていない、追加作業を行った部分を中心に以下に記録する。 5.1 作業用インスタンスの準備 サブネットが2つあるVPCを用意する。(RDS、ElastiCacheのデプロイには2つサブネットが必要) 作業用EC2インスタンス(Amazon Linux 2)を起動し、ハンズオンの「前提条件」通りに必要資材をインストールする。 $ sudo yum install git -y $ sudo yum install mysql -y $ sudo yum install python3 -y $ pip3 install --user virtualenv $ git clone https://github.com/aws-samples/amazon-elasticache-samples/ $ cd amazon-elasticache-samples/database-caching $ virtualenv venv $ source ./venv/bin/activate $ pip3 install -r requirements.txt 後の動作確認にRedis接続用クライアント(redis-cli)を使いたいため、追加で入れておく。 [ec2-user@ip-10-0-1-50 ~]$ sudo amazon-linux-extras install redis4.0 5.2 ElastiCache for Redisの作成 ハンズオン手順「ステップ 1: Redis クラスターを作成する」の通りにRedisクラスターを作成する。 作成時に必要なVPC、サブネットなどはあらかじめ用意したものを利用する。 5.3 RDSデータベースの作成とデータの入力 ハンズオン手順「ステップ 2: MySQL データベースを作成する」の通りにRDSデータベースを作成する。 ハンズオン手順「ステップ 3: MySQL データベースに入力する」の通りにデータを入力する。 結果としてテーブル「planet」に以下のデータが入力される。(Plutoがないのが気になるがそのままにしておく。) MySQL [tutorial]> select * from planet; +----+---------+ | id | name | +----+---------+ | 1 | Mercury | | 2 | Venus | | 3 | Earth | | 4 | Mars | | 5 | Jupiter | | 6 | Saturn | | 7 | Uranus | | 8 | Neptune | +----+---------+ 8 rows in set (0.00 sec) 5.4 ElastiCache + RDS の動作確認 5.4.1 動作確認手順 ハンズオン手順「ステップ 4: キャッシュとベストプラクティス」に従い動作確認を行う。 ステップ4で急に少し手順が分かりづらくなるが、ハンズオンで用意されている資材「example.py」を連続して実行することで以下の動作確認が可能。 スクリプトの初回実行時、「select * from planet」などをまずElastiCache(Redis)に問い合わせする。キャッシュヒットしないので、RDS(MySQL)にアクセスしてデータを取得し、その内容をElastiCache(Redis)にも書き込む。 スクリプトの2回目の実行時、キャッシュヒットするので、ElastiCache(Redis)からそのまま結果が得られる。 「example.py」だけだと動作が分かりづらいため、少しスクリプトの内容を追加して 「myexample.py」とした。 実行時にキャッシュヒットしたのかどうかの表示(print文)を追加 実行に要した時間の計算を追加 コメントを追加 myexample.py import os import json import redis import pymysql import datetime class DB: def __init__(self, **params): params.setdefault("charset", "utf8mb4") params.setdefault("cursorclass", pymysql.cursors.DictCursor) self.mysql = pymysql.connect(**params) def query(self, sql): with self.mysql.cursor() as cursor: cursor.execute(sql) return cursor.fetchall() def record(self, sql, values): with self.mysql.cursor() as cursor: cursor.execute(sql, values) return cursor.fetchone() # Time to live for cached data ### TTLの指定は秒単位 TTL = 60 # Read the Redis credentials from the REDIS_URL environment variable. REDIS_URL = os.environ.get('REDIS_URL') # Read the DB credentials from the DB_* environment variables. DB_HOST = os.environ.get('DB_HOST') DB_USER = os.environ.get('DB_USER') DB_PASS = os.environ.get('DB_PASS') DB_NAME = os.environ.get('DB_NAME') # Initialize the database Database = DB(host=DB_HOST, user=DB_USER, password=DB_PASS, db=DB_NAME) # Initialize the cache Cache = redis.Redis.from_url(REDIS_URL) def fetch(sql): """Retrieve records from the cache, or else from the database.""" ### まずRedisにアクセスし、値があればその値を返す。なければRDSからデータを取得し、 ### RedisにTTL付きで書き込む。 res = Cache.get(sql) if res: print("Cache Hit") return json.loads(res) res = Database.query(sql) ### setexはTTL付きでデータをstring型でsetする Cache.setex(sql, TTL, json.dumps(res)) print("Cache Write") return res def planet(id): """Retrieve a record from the cache, or else from the database.""" key = f"planet:{id}" res = Cache.hgetall(key) if res: print("Cache Hit") return res sql = "SELECT `id`, `name` FROM `planet` WHERE `id`=%s" res = Database.record(sql, (id,)) if res: ### hmsetはデータをhash型でsetする Cache.hmset(key, res) Cache.expire(key, TTL) print("Cache Write") return res # Display the result of some queries dt_now = datetime.datetime.now() print("start:",dt_now) print(fetch("SELECT * FROM planet")) print(planet(1)) dt_now = datetime.datetime.now() print("end:",dt_now) 5.4.2 動作確認結果(スクリプトの実行) 上記で作成したスクリプト「myexample.py」を2回連続して実行する。 # 初回 (venv) [ec2-user@ip-10-0-1-50 database-caching]$ python3 myexample.py start: 2021-05-05 07:12:28.771716 Cache Write [{'id': 1, 'name': 'Mercury'}, {'id': 2, 'name': 'Venus'}, {'id': 3, 'name': 'Earth'}, {'id': 4, 'name': 'Mars'}, {'id': 5, 'name': 'Jupiter'}, {'id': 6, 'name': 'Saturn'}, {'id': 7, 'name': 'Uranus'}, {'id': 8, 'name': 'Neptune'}] Cache Write {'id': 1, 'name': 'Mercury'} end: 2021-05-05 07:12:28.792133 # 2回目 (venv) [ec2-user@ip-10-0-1-50 database-caching]$ python3 myexample.py start: 2021-05-05 07:12:46.273983 Cache Hit [{'id': 1, 'name': 'Mercury'}, {'id': 2, 'name': 'Venus'}, {'id': 3, 'name': 'Earth'}, {'id': 4, 'name': 'Mars'}, {'id': 5, 'name': 'Jupiter'}, {'id': 6, 'name': 'Saturn'}, {'id': 7, 'name': 'Uranus'}, {'id': 8, 'name': 'Neptune'}] Cache Hit {b'id': b'1', b'name': b'Mercury'} end: 2021-05-05 07:12:46.284483 実行内容は以下の通り。 fetch("SELECT * FROM planet") は、「select * from planet」 を実行し、キャッシュヒットすればその値を取得、キャッシュミスした場合はRDSでSELECT文を実行し、結果をSTRING型でElastiCache(Redis)に保存する。 planet(1)は、ID=1のレコードを検索する。キャッシュヒットすればその値を取得し、キャッシュミスした場合はRDS(MySQL)にSELECT文を実行し、結果をhash型でElastiCache(Redis)に保存する。 これらの2つの命令の実行の前後に日時を取得し、2つの命令の所要時間を取得する。 結果は以下の通り。 初回実行時は、ElastiCache(Redis)にデータが存在しないため、キャッシュミスとなり、RDS(MySQL)へのクエリ及びElastiCache(Redis)への書き込みが発生する。 2回目実行時には、ElastiCache(Redis)にキャッシュが存在するため、そのまま結果が得られる。 1回目の実行時間(キャッシュミス)が0.02秒、2回目の実行時間(キャッシュヒット)が0.01秒となり、キャッシュがあったほうが速くはなっている。 5.4.3 動作確認結果(ElastiCache(Redis)側の確認) 上記のスクリプトの実行時、ElastiCache(Redis)側はどうなっているのかを併せて確認する。 ElastiCache(Redis)には、EC2インスタンスにインストールした redis-cli を用いて接続する。 [ec2-user@ip-10-0-1-50 ~]$ redis-cli -h [Redisエンドポイント]:6379 スクリプト初回実行前の、データが載っていない時は以下の状態となる。 mksamba-qiita-redis-001.xxxxx.xxxx.xxxxx.cache.amazonaws.com:6379> keys * (empty list or set) mksamba-qiita-redis-001.xxxxx.xxxx.xxxxx.cache.amazonaws.com:6379> type "SELECT * FROM planet" none mksamba-qiita-redis-001.xxxxx.xxxx.xxxxx.cache.amazonaws.com:6379> type "planet:1" none スクリプト初回実行後の、データが載っている時は以下の状態となる。 mksamba-qiita-redis-001.xxxxx.xxxx.xxxxx.cache.amazonaws.com:6379> keys * 1) "planet:1" 2) "SELECT * FROM planet" mksamba-qiita-redis-001.xxxxx.xxxx.xxxxx.cache.amazonaws.com:6379> type "SELECT * FROM planet" string mksamba-qiita-redis-001.xxxxx.xxxx.xxxxx.cache.amazonaws.com:6379> type "planet:1" hash mksamba-qiita-redis-001.xxxxx.xxxx.xxxxx.cache.amazonaws.com:6379> get "SELECT * FROM planet" "[{\"id\": 1, \"name\": \"Mercury\"}, {\"id\": 2, \"name\": \"Venus\"}, {\"id\": 3, \"name\": \"Earth\"}, {\"id\": 4, \"name\": \"Mars\"}, {\"id\": 5, \"name\": \"Jupiter\"}, {\"id\": 6, \"name\": \"Saturn\"}, {\"id\": 7, \"name\": \"Uranus\"}, {\"id\": 8, \"name\": \"Neptune\"}]" mksamba-qiita-redis-001.xxxxx.xxxx.xxxxx.cache.amazonaws.com:6379> hgetall "planet:1" 1) "id" 2) "1" 3) "name" 4) "Mercury" スクリプトによって実行された2つの命令(fetch("SELECT * FROM planet"), planet(1))の結果がそれぞれstring型とhash型で保存されていることが確認できる。なお、今回はTTL=60にしているので、60秒間でこれらのデータは自動消去される。 「keys *」は登録されているKey一覧を取得する。「type」は、Keyの種別を取得する。「get」はstring型の値の取得、「hgetall」はhash型の値の取得を行う。 5. 参考サイト 「Redis に保存されてる値を見ようと思った時に覚えておきたい redis コマンド」 Redisのデータの中身を見たくて操作方法を探していたが、このサイトがコマンドの一覧として使いやすかった。 「あと2時間でElastiCacheのメモリが枯渇!そのときあなたは何をしますか?」 ElastiCache+RDSのユースケースを探していたら出てきた、Akatsuki社のゲームインフラのトラブルシューティングの記事。これくらいのことができるように頑張っていきたい。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS CloudFormationでS3にSPA(React)を構築しよう

はじめに AWS CloudFormationを利用してS3静的ホスティング・SPA(React)構築のテンプレートのサンプルです。 テンプレートの概要が分からない場合は、はじめてのAWS CloudFormationテンプレートを理解するを参考にしてください。 コードはGitHubにもあります。 今回は、akane というシステムの dev 環境を想定しています。 同じ構成で違う環境を作成する場合は、{環境名}-parameters.jsonを別途作成します。 ディレクトリ構成 akane (システム) ├── app (Reactアプリ) └── s3 (スタック) ├─ s3.yml (CFnテンプレート) └─ dev-parameters.json (dev 環境のパラメータ) AWS リソース構築内容 s3スタック s3バケット (akane-dev-s3-reacts) バケットポリシー (s3:GetObject) 実行環境の準備 AWS CloudFormationを動かすためのAWS CLIの設定を参考にしてください。 Reactアプリ ビルド手順 予め node.js yarn をインストールする。 下記を実行してアプリをビルドする cd akane/app yarn install yarn build AWS リソース構築手順 下記を実行してスタックを作成 ./create_stacks.sh 下記を実行してスタックを削除 ./delete_stacks.sh 構築テンプレート 1. s3スタック s3.yml AWSTemplateFormatVersion: 2010-09-09 Description: S3 For Akane # Metadata: Parameters: SystemName: Type: String AllowedPattern: '[a-zA-Z0-9-]*' EnvType: Description: Environment type. Type: String AllowedValues: [all, dev, stg, prod] ConstraintDescription: must specify all, dev, stg, or prod. AppS3Bucket: Type: String AppIndexDocument: Type: String # Mappings # Conditions # Transform Resources: # S3 Bucket作成 akaneS3Bucket: Type: AWS::S3::Bucket Properties: AccessControl: Private BucketName: !Ref AppS3Bucket Tags: - Key: Name Value: !Ref AppS3Bucket - Key: SystemName Value: !Ref SystemName - Key: EnvType Value: !Ref EnvType WebsiteConfiguration: IndexDocument: !Ref AppIndexDocument # S3 BucketPolicy作成 akaneS3BucketPolicy: Type: AWS::S3::BucketPolicy DependsOn: akaneS3Bucket Properties: Bucket: !Ref akaneS3Bucket PolicyDocument: Statement: - Action: - s3:GetObject Effect: Allow Resource: !Join - '' - - 'arn:aws:s3:::' - !Ref akaneS3Bucket - /* Principal: AWS: '*' Outputs: akaneS3Bucket: Value: !Ref akaneS3Bucket Export: Name: !Ref AppS3Bucket all-parameters.json { "Parameters": [ { "ParameterKey": "SystemName", "ParameterValue": "akane" }, { "ParameterKey": "EnvType", "ParameterValue": "dev" }, { "ParameterKey": "AppS3Bucket", "ParameterValue": "akane-dev-s3-react" }, { "ParameterKey": "AppIndexDocument", "ParameterValue": "index.html" } ] } 3. 実行ファイル create_stacks.sh #!/bin/sh cd `dirname $0` SYSTEM_NAME=akane create_stack () { ENV_TYPE=$1 STACK_NAME=$2 aws cloudformation create-stack \ --stack-name ${SYSTEM_NAME}-${ENV_TYPE}-${STACK_NAME} \ --template-body file://./${SYSTEM_NAME}/${STACK_NAME}/${STACK_NAME}.yml \ --cli-input-json file://./${SYSTEM_NAME}/${STACK_NAME}/${ENV_TYPE}-parameters.json aws cloudformation wait stack-create-complete \ --stack-name ${SYSTEM_NAME}-${ENV_TYPE}-${STACK_NAME} } create_stack dev s3 ./akane/deploy_app.dev.sh exit 0 delete_stacks.sh #!/bin/sh cd `dirname $0` SYSTEM_NAME=akane delete_stack () { ENV_TYPE=$1 STACK_NAME=$2 aws cloudformation delete-stack \ --stack-name ${SYSTEM_NAME}-${ENV_TYPE}-${STACK_NAME} aws cloudformation wait stack-delete-complete \ --stack-name ${SYSTEM_NAME}-${ENV_TYPE}-${STACK_NAME} } ./akane/delete_app.dev.sh delete_stack dev s3 exit 0 4. デプロイファイル deploy_app.dev.sh #!/bin/sh cd `dirname $0` BASENAME=$(basename $0) FILENAME=${BASENAME%.*} ENV_TYPE=${FILENAME##*.} APP_DIR=app/build S3_DIR=s3/ BUCKET_NAME=$(cat ${S3_DIR}${ENV_TYPE}-parameters.json | jq -r '.Parameters[] | select(.ParameterKey == "AppS3Bucket").ParameterValue') aws s3 cp ${APP_DIR} s3://${BUCKET_NAME} --recursive exit 0 delete_app.dev.sh #!/bin/sh cd `dirname $0` BASENAME=$(basename $0) FILENAME=${BASENAME%.*} ENV_TYPE=${FILENAME##*.} S3_DIR=s3/ BUCKET_NAME=$(cat ${S3_DIR}${ENV_TYPE}-parameters.json | jq -r '.Parameters[] | select(.ParameterKey == "AppS3Bucket").ParameterValue') aws s3 rm s3://${BUCKET_NAME} --recursive exit 0
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【AWS】デベロッパーアソシエイトに合格したのでその道のりをまとめてみた

はじめに 2021/04/30に、AWS 認定 デベロッパー – アソシエイト (DVA)に合格しました。 アウトプットすると色々いいことがあるよと耳にしたので、記事にしてみようと思います。 暖かい目で読んでください。 先に述べておきますが、具体的なサービス名はこの記事には登場しません。 勉強方法を説明していきます。 これまでの受験履歴 試験名 取得日 AWS 認定 クラウドプラクティショナー 2021/02/24 AWS 認定 ソリューションアーキテクト – アソシエイト 2021/03/22 AWS 認定 デベロッパー – アソシエイト  2021/04/30 こんな感じです。 AWSについて勉強し始めたのが、2020/12/26です。 今まで業務で使ったことは無いです。 使用教材 使用した教材は主に以下の3つです。 次の項で、それぞれ詳細を説明します。 ポケットスタディ AWS認定 デベロッパーアソシエイト (アソシエイト試験ポケットスタディ) AWS 認定デベロッパー アソシエイト模擬試験問題集(5回分325問) AWS Black Belt Online Seminar 学習フロー ポケットスタディ AWS認定 デベロッパーアソシエイト (アソシエイト試験ポケットスタディ) まずはこの本でインプットをします。 わかりやすいですし、試験内容とほとんど乖離が無かったと思います。 試験本番で、「2択に絞れたけど、どっちが正解なんだ...?」みたいな時、 ほとんどの場合、この本に書いてあるアーキテクチャ構成になっている選択肢が正解だと思います。 乱暴な説明をしてしまいますが、 この本さえ読んでおけば合格できてしまうかもしれません。 絶望的に時間が無い方には、この本だけ読むことをお勧めします。 AWS 認定デベロッパー アソシエイト模擬試験問題集(5回分325問) Udemyで公開されている非公式の模擬試験です。 1.でインプットが完了したら、次にアウトプットをします。 体系的な知識の上に、更に細かい知識を身に着けることが目的です。 また、自分の理解が足りないサービスを洗い出すことも目的としています。 試験本番より難易度が高いので、点数が低くても諦める必要はありません。 AWS Black Belt Online Seminar AWS公式資料です。 2.で洗い出した、自分の理解が足りないサービスを重点的に学習します。 理解の補助を目的としているので、頑張って覚える必要はありません。 動画派とPDF派に分かれると思いますが、個人的には1.5倍速の動画で見るのが一番学習しやすかったです。 試験結果 試験本番のスコアレポートです。 969点でした。なかなか良い点数だと思います。 おそらく2問間違いとかではないでしょうか。 今まで受けたAWSの試験で一番スコアが高かったです。 その要因は、ポケットスタディ AWS認定 デベロッパーアソシエイト (アソシエイト試験ポケットスタディ) により、学習すべき範囲が明確になったからだと考えています。 試験対策としては、今のところこの本が最も優れた教材だと思います。 ちなみに、公式の模擬試験のスコアレポートが以下です。 試験本番の一週間前に受けましたが、65%でした。 AWSの試験は基本的に模擬試験の方が難しい傾向にあると思います。 最後に 以上、私の初めての記事でした。 最後まで読んでいただきありがとうございます。 これが誰かの成長のきっかけになれたら、この上ない幸いです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS CodeDeployが失敗するときにとりあえず見るログ

tail -f /var/log/aws/codedeploy-agent/codedeploy-agent.log
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS CloudFormationでS3アーティファクトを使用したLambdaを構築しよう

はじめに AWS CloudFormationを利用してS3アーティファクトを使用したLambda構築のテンプレートのサンプルです。 テンプレートの概要が分からない場合は、はじめてのAWS CloudFormationテンプレートを理解するを参考にしてください。 コードはGitHubにもあります。 今回は、akane というシステムの dev 環境を想定しています。 同じ構成で違う環境を作成する場合は、{環境名}-parameters.jsonを別途作成します。 ディレクトリ構成 akane (システム) ├── lambda (スタック) │ ├── code │ │ └── getTiAmo.py (S3アーティファクトソース) │ ├── code-lambda-getTiAmo.zip (S3アーティファクト) │ ├── delete_artifact.dev.sh (S3アーティファクト削除シェル) │ ├── dev-parameters.json (dev 環境のパラメータ) │ ├── lambda.yml (CFnテンプレート) │ ├── mkzip.sh (S3アーティファクト作成シェル) │ └── upload_artifact.dev.sh (S3アーティファクト削除シェル) └─ s3 (スタック) ├─ s3.yml (CFnテンプレート) └─ all-parameters.json (all 環境のパラメータ) AWS リソース構築内容 lambdaスタック Lambdaロール Lambda s3スタック s3バケット (akane-all-s3-artifacts) バケットポリシー (s3:GetObject) 実行環境の準備 AWS CloudFormationを動かすためのAWS CLIの設定を参考にしてください。 AWS リソース構築手順 下記を実行してスタックを作成 ./create_stacks.sh 下記を実行してLambdaの動作を確認 ./test_lambda.sh 下記を実行してスタックを削除 ./delete_stacks.sh 構築テンプレート 1. s3スタック s3.yml AWSTemplateFormatVersion: 2010-09-09 Description: S3 For Akane # Metadata: Parameters: SystemName: Type: String AllowedPattern: '[a-zA-Z0-9-]*' EnvType: Description: Environment type. Type: String AllowedValues: [all, dev, stg, prod] ConstraintDescription: must specify all, dev, stg, or prod. # Mappings # Conditions # Transform Resources: # S3 Bucket作成 akaneS3Bucket: Type: AWS::S3::Bucket Properties: AccessControl: Private BucketName: !Sub - ${SystemName}-${EnvType}-s3-artifacts - {SystemName: !Ref SystemName, EnvType: !Ref EnvType} Tags: - Key: Name Value: !Sub - ${SystemName}-${EnvType}-s3-artifacts - {SystemName: !Ref SystemName, EnvType: !Ref EnvType} - Key: SystemName Value: !Ref SystemName - Key: EnvType Value: !Ref EnvType # S3 BucketPolicy作成 akaneS3BucketPolicy: Type: AWS::S3::BucketPolicy DependsOn: akaneS3Bucket Properties: Bucket: !Ref akaneS3Bucket PolicyDocument: Statement: - Action: - s3:GetObject Effect: Allow Resource: !Join - '' - - 'arn:aws:s3:::' - !Ref akaneS3Bucket - /* Principal: AWS: '*' Outputs: akaneS3Bucket: Value: !Ref akaneS3Bucket Export: Name: !Sub - ${SystemName}-${EnvType}-s3-artifacts - {SystemName: !Ref SystemName, EnvType: !Ref EnvType} all-parameters.json { "Parameters": [ { "ParameterKey": "SystemName", "ParameterValue": "akane" }, { "ParameterKey": "EnvType", "ParameterValue": "all" } ] } 2. lambdaスタック lambda.yml AWSTemplateFormatVersion: 2010-09-09 Description: Lambda For Akane # Metadata: Parameters: SystemName: Type: String AllowedPattern: '[a-zA-Z0-9-]*' EnvType: Description: Environment type. Type: String AllowedValues: [all, dev, stg, prod] ConstraintDescription: must specify all, dev, stg, or prod. ArtifactS3Bucket: Type: String LambdaName: Type: String LambdaMemorySize: Type: Number LambdaRuntime: Type: String GirlName: Type: String # Mappings # Conditions # Transform Resources: # ロール作成 akaneRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: - lambda.amazonaws.com Action: - sts:AssumeRole Description: !Sub - ${SystemName}-${EnvType}-role-lambda-${AWS::Region} - {SystemName: !Ref SystemName, EnvType: !Ref EnvType} ManagedPolicyArns: - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole Path: / RoleName: !Sub - ${SystemName}-${EnvType}-role-lambda-${AWS::Region} - {SystemName: !Ref SystemName, EnvType: !Ref EnvType} Tags: - Key: Name Value: !Sub - ${SystemName}-${EnvType}-role-lambda-${AWS::Region} - {SystemName: !Ref SystemName, EnvType: !Ref EnvType} - Key: SystemName Value: !Ref SystemName - Key: EnvType Value: !Ref EnvType # Lambda作成 akaneLambdaGetTiAmo: Type: AWS::Lambda::Function Properties: Code: S3Bucket: !Ref ArtifactS3Bucket S3Key: !Sub - code-lambda-${LambdaName}.zip - {LambdaName: !Ref LambdaName} Description: !Sub - ${SystemName}-${EnvType}-lambda-${LambdaName} - {SystemName: !Ref SystemName, EnvType: !Ref EnvType, LambdaName: !Ref LambdaName} Environment: Variables: GIRL_NAME: !Ref GirlName FunctionName: !Sub - ${SystemName}-${EnvType}-lambda-${LambdaName} - {SystemName: !Ref SystemName, EnvType: !Ref EnvType, LambdaName: !Ref LambdaName} Handler: !Sub - ${LambdaName}.handler - {LambdaName: !Ref LambdaName} MemorySize: !Ref LambdaMemorySize Role: !GetAtt akaneRole.Arn Runtime: !Ref LambdaRuntime Tags: - Key: Name Value: !Sub - ${SystemName}-${EnvType}-lambda-${LambdaName} - {SystemName: !Ref SystemName, EnvType: !Ref EnvType} - Key: SystemName Value: !Ref SystemName - Key: EnvType Value: !Ref EnvType Timeout: 900 TracingConfig: Mode: PassThrough Outputs: akaneLambdaGetTiAmoArn: Value: !GetAtt akaneLambdaGetTiAmo.Arn Export: Name: !Sub - ${SystemName}-${EnvType}-lambda-arn - {SystemName: !Ref SystemName, EnvType: !Ref EnvType} dev-parameters.json { "Parameters": [ { "ParameterKey": "SystemName", "ParameterValue": "akane" }, { "ParameterKey": "EnvType", "ParameterValue": "dev" }, { "ParameterKey": "ArtifactS3Bucket", "ParameterValue": "akane-all-s3-artifacts" }, { "ParameterKey": "LambdaName", "ParameterValue": "getTiAmo" }, { "ParameterKey": "LambdaMemorySize", "ParameterValue": "128" }, { "ParameterKey": "LambdaRuntime", "ParameterValue": "python3.8" }, { "ParameterKey": "GirlName", "ParameterValue": "akane" } ], "Capabilities": [ "CAPABILITY_NAMED_IAM" ] } 3. 実行ファイル create_stacks.sh #!/bin/sh cd `dirname $0` SYSTEM_NAME=akane create_stack () { ENV_TYPE=$1 STACK_NAME=$2 aws cloudformation create-stack \ --stack-name ${SYSTEM_NAME}-${ENV_TYPE}-${STACK_NAME} \ --template-body file://./${SYSTEM_NAME}/${STACK_NAME}/${STACK_NAME}.yml \ --cli-input-json file://./${SYSTEM_NAME}/${STACK_NAME}/${ENV_TYPE}-parameters.json aws cloudformation wait stack-create-complete \ --stack-name ${SYSTEM_NAME}-${ENV_TYPE}-${STACK_NAME} } create_stack all s3 ./akane/lambda/mkzip.sh ./akane/lambda/upload_artifact.dev.sh create_stack dev lambda exit 0 test_lambda.sh #!/bin/sh cd `dirname $0` LAMBDA_NAME=akane-dev-lambda-getTiAmo OUTPUT_FILE=response.json aws lambda invoke --function-name ${LAMBDA_NAME} --log-type Tail ${OUTPUT_FILE} --query 'LogResult' --output text | base64 -D cat ${OUTPUT_FILE} exit 0 delete_stacks.sh #!/bin/sh cd `dirname $0` SYSTEM_NAME=akane delete_stack () { ENV_TYPE=$1 STACK_NAME=$2 aws cloudformation delete-stack \ --stack-name ${SYSTEM_NAME}-${ENV_TYPE}-${STACK_NAME} aws cloudformation wait stack-delete-complete \ --stack-name ${SYSTEM_NAME}-${ENV_TYPE}-${STACK_NAME} } delete_stack dev lambda ./akane/lambda/delete_artifact.dev.sh delete_stack all s3 exit 0 4. アーティファクト関連ファイル mkzip.sh #!/bin/sh cd `dirname $0` ENV_TYPE=dev LAMBDA_NAME=$(cat ${ENV_TYPE}-parameters.json | jq -r '.Parameters[] | select(.ParameterKey == "LambdaName").ParameterValue') FILE=../code-lambda-${LAMBDA_NAME}.zip cd ./code ls . | grep -v -E ".gitignore|${LAMBDA_NAME}.py" | xargs rm -rf rm -f ${FILE} zip -r ${FILE} ./* exit 0 upload_artifact.dev.sh #!/bin/sh cd `dirname $0` BASENAME=$(basename $0) FILENAME=${BASENAME%.*} ENV_TYPE=${FILENAME##*.} BUCKET_NAME=$(cat ${ENV_TYPE}-parameters.json | jq -r '.Parameters[] | select(.ParameterKey == "ArtifactS3Bucket").ParameterValue') ARTIFACT_NAME=code-lambda-$(cat ${ENV_TYPE}-parameters.json | jq -r '.Parameters[] | select(.ParameterKey == "LambdaName").ParameterValue') aws s3 cp ${ARTIFACT_NAME}.zip s3://${BUCKET_NAME}/${ARTIFACT_NAME}.zip exit 0 delete_artifact.dev.sh #!/bin/sh cd `dirname $0` BASENAME=$(basename $0) FILENAME=${BASENAME%.*} ENV_TYPE=${FILENAME##*.} BUCKET_NAME=$(cat ${ENV_TYPE}-parameters.json | jq -r '.Parameters[] | select(.ParameterKey == "ArtifactS3Bucket").ParameterValue') ARTIFACT_NAME=code-lambda-$(cat ${ENV_TYPE}-parameters.json | jq -r '.Parameters[] | select(.ParameterKey == "LambdaName").ParameterValue') aws s3 rm s3://${BUCKET_NAME}/${ARTIFACT_NAME}.zip exit 0
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Rails6]AWS本番環境でActionCableの使用ができるようにする

はじめに Rails6を使用して、AWSにデプロイするもActionCableで実装したチャットが一切機能しなくて困ったので、その時の解決方法を以下に記述します! 結論 3点の設定が必要です。 1.cable.yml 2.production.rb 3.rails.conf(もしくはアプリケーション名.conf) cable.ymlの設定 cable.ymlとはActionCableを使用する際の設定を記述するファイルです。 ここでは、本番環境の仕様設定に編集を加えます。 adapter(前提知識) ActionCableは、サーバーから送信された情報をクライアントへ提供する仕組みになります。その仕組みと連携するためのものをadapterと言います。 使用できるadapterの種類には、以下表の3通りがあります。 種類 内容 Asyncアダプタ 無料で導入が可能だが、パフォーマンスの面から本番環境での利用は非推奨。ただしポートフォリオ程度なら問題ない Redisアダプタ 本番環境での利用が推奨されている。、EC2を用いたデプロイを行う際に、幾らか料金がかかる PostgreSQLアダプタ 本番環境での利用が推奨されている。PostgreSQLを使用していることが条件 以上を踏まえ、以下のように編集しましょう cable.yml development: adapter: async test: adapter: test production: adapter: async # 追記 # adapter: redis 削除 url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %> channel_prefix: mini_talk_app_production production.rbの設定 ActionCableは、指定されていないオリジンからのリクエストを受け付けない設定になっているはずです。 これでは使い物にならないので編集しましょう! config/environments/production.rb Rails.application.configure do # 省略 #どっかに記述してOK ActionCable.server.config.disable_request_forgery_protection = true config.action_cable.url = "ws://【Elastic IP】/cable" config.action_cable.allowed_request_origins = ['http://【Elastic IP】'] # 省略 end rails.confの編集 Nginxの設定ファイルにあたるrails.confを編集しましょう。 ActionCableを用いる場合、サーバーサイドへのリクエストを受け取る役目のあるWebサーバーにて、websocketの仕組みを用いるための設定をする必要があります。 /etc/nginx/conf.d/rails.conf upstream app_server { server unix:/var/www/アプリケーション名/shared/tmp/sockets/unicorn.sock; } server { #省略 # -------------------ここから------------------- # /cableのパスに対してwebsocketの仕組みを用いるための設定 location /cable { proxy_pass http://app_server/cable; proxy_http_version 1.1; proxy_set_header Upgrade websocket; proxy_set_header Connection Upgrade; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # -------------------ここまでを追記------------------- #省略 } ここで僕がはまったのは、一行目の〇〇_serverとproxy_pass http://〇〇_server/cable;は一致させてください。訳もわからずコピるとエラーになります! 再起動 あとはターミナルでお馴染みの再起動!!! # 読み込み直し sudo systemctl reload nginx # 再起動 sudo systemctl restart nginx これで使えるようになりました!! おわりに 今は細かいところは分からなくても、「とりあえず知っている」ってとても大切なことなので、是非記事の方熟読してみてください!!!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Amazon Athena「No output location provided」エラーの対処法

エラー発生 Athenaでパーティション設定時に下記のエラーが発生した。 Your query has the following error(s): No output location provided. An output location is required either through the Workgroup result configuration setting or as an API input. (Service: AmazonAthena; Status Code: 400; Error Code: InvalidRequestException; Request ID: XXXXXXXXXXXXXXXXXXX) 解決方法 クラスメソッドのAthena でクエリ実行時に”No output location provided ……”というエラーが表示された時の対処方法の記事によると、クエリ結果の出力場所を指定する必要があるということ。 おそらく記事作成時とUIが変わり、現在のUIでは「Settings」から設定が可能。 S3パスがわからなくても、「Select」から選択が可能。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS Lambdaのログのタイムゾーンをいい感じにしたい

背景 Lambda Powertoolsを使ってログ出力していたが、タイムゾーンがUTCになっていたのでこれをどうにかしたい、という要望が出た。 どうにかしたい、という微妙な言い回しになっているのは、 タイムゾーンをJSTに変更する UTCのままでタイムゾーン情報を追加で出力する という2パターンが選択肢として存在したため。最終的には後者で終えた。理由は後段で述べる。 Lambda Powertools の簡単な使い方 前提知識としてざっくり書いておく。以下の様にデコレータをつけると詳細なログを出してくれる。 from aws_lambda_powertools import Logger logger = Logger() @logger.inject_lambda_context def handler(event, context): logger.info("This is an information") ... logger.error("This is an error") 出力される情報は、関数名、メモリサイズ、コールドスタートかどうか、などなど。 詳しくはドキュメント参照。 タイムゾーン情報を付加して出力する方法 前述したようにタイムゾーンはUTCのまま、タイムゾーン情報を付加する形で落ち着いた。 実装方法は、loggerの初期化部分で以下のようにするだけ。 logger = Logger(datefmt="%Y-%m-%d %H:%M:%S %z") こうすることで、出力の形式は以下のようになる。 "2021-05-08 15:50:22 +0000" 一応タイムゾーンを変更する方法もあったのだが(後述)、内部変数をいじるような形になってしまったため今回は不採用。 とりあえず、プロジェクトに関わる人の中で合意が取れるところに落とし込んだ。 Timezoneを変更する方法 以下のようにすれば変更できる。pytzはインストール済みの想定。 from datetime import datetime from aws_lambda_powertools import Logger from pytz import timzeon def custome_time(*arg): return datetime.now(timezone("Asia/Tokyo")).timetuple() logger = Logger() logger._handler.formatter.converter = custome_time 前述の通り内部変数をいじる形になってしまう。 (他にいい方法あるのだろうか...?) Lambda Powertoolsを使わない場合 単純にloggingライブラリを使う場合は以下のようにできる。 今回はLambda Powertoolsの詳細なログを捨ててまでタイムゾーン変更をする強い要望はなかったのでこちらの方法は採用していない。 from datetime import datetime import logging import pytz def custome_time(*arg): return datetime.now(timzeone("Asia/Tokyo")).timetuple() logger = logging.getLogger(__name__) handler = logging.StreamHandler() formatter = logging.Formatter() formatter.converter = custome_time handler.setFormatter(formatter) logger.addhandler(handler) 前述したLambda Powertoolsでタイムゾーン変更はこの手順を無理矢理やっているだけ。 ちなみに環境変数TZをいじるという方法もあるが... この記事によるとTZを変更するのは非推奨らしい。 参考リンク
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSのVPCフローログをCloudWatchLosgでフィルタする方法

コピペ用 [version, account, eni, source, destination, srcport, destport, protocol, packets, bytes, windowstart, windowend, action, flowlogstatus] 例 特定のEC2インスタンス発信のHTTPS通信をフィルタ [version, account, eni="eni-046f27b580f4a9495", source, destination, srcport, destport="443", protocol, packets, bytes, windowstart, windowend, action, flowlogstatus]
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

マインドマップでAWSのデータ分析サービスを勉強【データ処理編】第�1回 − Glue

AWSのデータ分析系のサービスを体系的に勉強シリーズです。 一般的なデータ分析流れに含まれる、データ収集、データ保存、データ処理、データ分析、データ可視化、といったステップにそれぞれが利用するサービスを学び、マインドマップに整理しました。 今回はデータ処理編のGlueです。 ※ こちらの記事は、AWSのホワイトペーパー、クラウドサービス活用資料集とUdemyにあるAWS Certified Data Analytics Specialty 2021 - Hands onコースを参照しております。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【AWS未経験から】AWS認定クラウドプラクティショナー合格までにしたこと

はじめに AWSをほとんど触ったことがない状態から、 AWS認定クラウドプラクティショナー試験に合格することができました。 学習に使った教材や記事などを自分用にまとめました。 これから受験を検討している方の参考になれば幸いです。 試験概要はこちらの公式サイトからどうぞ。 合格までにしたこと & 学習時間 学習期間 2021年3月11日 ~ 2021年4月16日 学習時間 1日 1~3時間 学習内容 試験テキスト1周 Udemy講座 2周(1.5-2倍速) Udemy模試 4周 AWSチュートリアル AWS Black Belt Online Seminar その他 試験テキスト こちらの「AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー」を使用しました。 最初はとっつきにくいカタカナ語もつまづかないように丁寧に解説してあるので、サクサク読めます。 Amazon購入ページ Udemy講座 こちらの講座を購入しました。 実際に手を動かしながら、楽しく学ぶことができます。 講座を購入すると、講座で使用しているスライドをすべてPDFでダウンロードすることができるため、空き時間の学習にも困りません。 これだけでOK! AWS認定クラウドプラクティショナー試験突破講座(豊富な試験問題290問付き) Udemy模試 こちらの模試を購入しました。 学習時間の半分はただひたすらに模試の問題を解き続けました。 「試験問題に慣れる」 これに尽きます。 この問題だけで合格可能!AWS 認定クラウドプラクティショナー 模擬試験問題集(7回分455問) AWSチュートリアル AWS公式サイトのチュートリアルではAWSの簡単なサービスをチュートリアルという形で簡単に実行できます。実際に触って構築してみると学習の定着が一気に早まります。 AWSチュートリアル AWS Black Belt Online Seminar AWSが公式に主催しているオンラインセミナーです。苦手な分野や、理解を深めたいサービスで検索して視聴するようにしました。(YouTube:Amazon Web Services Japan 公式チャンネル) YouTubeで「Black Belt サービス名」などで検索してもいいですし、 AWS サービス別資料から検索して、PDFやSlideShareで学習するのもアリです。 動画は長いため、 倍速で再生する サービスの概要を説明している最初だけ聞く 先にPDFやSlideShareをさらっと見て気になった部分だけ聞く など学習の仕方はさまざまです。 その他 こちらのYouTubeチャンネルや記事も学習の参考にさせていただきました。 YouTubeチャンネル AWSチャンネル サーバーワークス チャンネル 記事 AWS全サービスまとめ 【AWS初心者向け】AWS学習方法まとめ【15時間で達成できる】 おわりに コツコツ学習して合格することができましたが、問題の不正解の選択肢の理由も説明できるくらいにはサービスを理解しておく必要があると感じました。 受験を控えている方、応援しております!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【AWS】プライベートサブネットの作成方法

プログラミング勉強日記 2021年5月8日 はじめに  プライベートサブネットで通信を可能にするためには、NATゲートウェイを使う。NATゲートウェイを理解するためにはグローバルIPアドレスとプライベートIPアドレスのやりとりをする機能やソフトウェアの理解が必要になる。 グローバルIPアドレスとは  世界中でのやり取りが可能なのがグローバルIPアドレス。世界中で重複のない一意のアドレスで、インターネット上でのやりとりに使用される。ICANNという非営利団体が管理してる。そのため、グローバルに割り当てられたIPアドレスをもらう必要がある。 プライベートIPアドレスとは  限定的なエリア内でのみで利用可能なのがプライベートIPアドレス。オフィス内や家庭内などの特定の範囲だけで利用されるアドレスで、そのエリア内では重複はできないが、グローバルでは重複が可能。設定できるIPアドレスの範囲は10.0.0.0 ~ 10.255.255.255, 172.16.0.0 ~ 152.32.255.255, 192.168.0.0 ~ 192.168.255.255。ローカルエリアの管理者が自分でIPアドレスを与えられる。 DHCPサーバーとは  IPアドレスを付与するためのサーバーがDHCPサーバーで、DHCPサーバーを置くことでプライベートなIPアドレスの付与を(基本的には)自動で行う。   NATとは  グローバルIPアドレスとプライベートIPアドレスを対応付けるのがNATという機能・ソフトウェア。プライベートIPアドレスはアドレスが重複してしまうため、インターネットに接続するIPアドレスとしては使えない。インターネットに接続するためには、グローバルIPアドレスが必要になるので、インターネットに接続するときにはNATがグローバルIPアドレスに変換してくれる。この仕組みがNATという仕組み。 IPマスカレードとは  NATは1対1で変換するが、IPマスカレードは複数のプライベートIPアドレスをグローバルIPアドレスに変換する。複数のプライベートIPアドレスを1つのグローバルIPアドレスに関連付けて共有する。IPマスカレードの方が効率的に使うことができる。 プライベートサブネットの構成  プライベートサブネットではインターネットからのアクセスができないので、そのために踏み台サーバーを使う。パブリックサブネット側に踏み台サーバーを設置してそこにアクセスしてから、(踏み台サーバーから)プライベートサブネットにあるEC2インスタンスにアクセスする。  アクセスは踏み台サーバーからできるが、返信のトラフィックを受け取るにはNATゲートウェイが必要になる。NATゲートウェイはアドレス変換してパブリック側でやり取りできるようにしてインターネットゲートウェイに返信トラフィックを送り渡す。それによってインターネット側のクライアント端末でプライベートサブネット上のEC2インスタンスからの返信トラフィックを受け取れるようになる。  
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Basic認証付きの静的サイトを物凄く簡単にサーバレスで公開する【AWS Amplify Console】

Basic認証付きの静的サイトを物凄く簡単にサーバレス(AWS)で公開出来る事を知ったので、やってみた形式で紹介したいと思います。 具体的にはAWSのAmplifyConsoleを使います。 一般的にAWSで静的サイトにBasic認証をかけたい場合、S3 + CloudFront + Lambda@edgeで実現するかな、と思いますが、それより100倍くらい楽です。 ざっくりしたイメージで下図のような感じでサイトを公開出来ます。 【前提】 GitHubのアカウントを持っている。基本的な操作が出来る AWSアカウントを持っている 独自ドメインを購入済みである 記事中ではお名前.comで購入したドメインを使用します AmplifyConsoleなどの単語を初めて聞いた人でも大丈夫です この記事でやる事 静的サイトのHTMLをGitHubにpushする GitHubとAWS Amplify Consoleを紐づける(これだけでサイトが公開されます) Basic認証をかける ソースを変更してGitHubにpush。自動でサイトが更新される様子を確認する 独自ドメインとHTTPS化の設定をする 作業時間自体は15分ぐらい、設定の反映の待ち時間含めて30分ぐらいとなります。 ※「5. 独自ドメインを設定する」の作業で、待たされる時間が発生します。 1. 静的サイトのHTMLをGitHubにpushする ここからは、index.htmlのみの簡素なサイトを例に、Basic認証付きで公開する作業をして行きます。 【作業】 1-1. ローカル環境に静的サイトを準備する 1-2. GitHubにリポジトリを作成しコードをpushする 1-1. ローカル環境に静的サイトを準備する ローカル環境にstatic-siteフォルダを作り、index.htmlを下記内容で作成します(説明を容易にするため簡素なHTMLを使用しています)。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <h1>Hello,world!</h1> </body> </html> 1-2. GitHubにリポジトリを作成しコードをpushする GitHub上にstatic-siteと言う名前でリポジトリを作成したら上記のコードをpushします。 2. GitHubとAWS Amplify Consoleを紐づける AWSのマネジメントコンソールにログインします。 サービスの検索窓に「Amplify」と入力します。「AWS Amplify」へと移動します。 下記画面に遷移したら、右上のオレンジの「New App」ボタンをクリックします。更にボタンが現れるので「Host web app」をクリックします。 ※初めてこの画面に来た人は、「すべてのアプリ」が空の状態になっているかと思います。 下記画面にしたらGitHubを選択して右下の「Continue」をクリックします。 ここでGitHubのアカウントとの紐付けを行います。紐付けの作業は初回のみです。画面の指示に従って頂くと紐付け作業を完了出来るかな、と思います。 紐付け完了後は下記画面となります。 「リポジトリ」のセレクトボックスをクリックします。GitHub上のリポジトリの一覧が現れるので、先ほど作成したリポジトリを選択します。 更にブランチを選びます。 作業したブランチを選択して下さい。 私の場合はブランチ名をリネームしたのでmainブランチですが、masterのまま作業をしている方はmasterが表示されるかと思います。その場合は、masterを選択して下さい。 選択出来たら「次へ」をクリックします。 下記画面に遷移します。何も変更を加えずに「次へ」をクリックします。 ※画面上の「ビルドの設定」の項目に警告のマークがついているのが気になるかと思いますが、無視して大丈夫です。VueやReactなどのビルドを伴うサイトを扱う際には、編集を行います。今回は不要です。 下記画面に遷移したら「保存してデプロイ」をクリックします。 サイトの公開設定は以上です。 下記画面のようにプロビジョン、ビルド、デプロイ、検証に全てチェックが入るのを待ちます(2〜3分ぐらい)。 サイトのURLが発行されます。 URLをクリックしてサイトを確認します。 GitHubにpushしたHTMLが表示されている事を確認出来ます。 3. Basic認証をかける 左のメニューより「アクセスコントロール」を選択し、遷移した画面で右上にある「アクセス管理」をクリックします。 下記画面に遷移します。ここでBasic認証のユーザー名とパスワードを設定出来ます。ユーザー名とパスワードを入力したら「Save」をクリックします。 公開したサイトをもう一度開くと(もしくはリロードすると)Basic認証のダイアログが現れます。 設定したユーザー名とパスワードを入力すると、サイトが表示されます。 4. ソースを変更してGitHubにpush。自動でサイトが更新される様子を確認する サイトの更新は「ローカルで更新作業をする」 → 「GitHubにpushする」 → 「Amplify Consoleがpushを検知して自動で更新してくれる」と言う流れになります。 実際に見て行きます。 ローカルにあるstatic-site/index.htmlをエディタで開き下記のように変更します。 (pタグを適当な内容で追加しただけです。) <h1>Hello,world!</h1> <p>hellohellohellohellohellohellohello</p> 変更を保存したら、GitHubに変更をpushします。 マネジメントコンソールに戻ると、再びプロビジョニングが始まっている事を確認出来ます。 全てチェックが入ると更新完了です。 更新内容が反映された事を確認します。 HTMLファイルを手動であげる作業は発生しません。 それっぽい言葉を使うとCICDのCDを実現している状態です。 (参考)CIとCDの違い 5. 独自ドメインとHTTPS化の設定をする Basic認証同様に簡単に独自ドメインの設定も出来ます。 例として予めお名前ドットコムで購入した「staticsite.work」と言うドメインを公開したサイトにくっつけて行きます。 【作業】 5-1. Route53でホストゾーンの登録 5-2. お名前.comでネームサーバーの設定 5-3. Amplifyコンソールでカスタムドメインの追加 5-1. Route53でホストゾーンの登録 Route53に移動して「ホストゾーンの作成」をクリックします。 ドメイン名に取得したドメインを入力して「ホストゾーンの作成」をクリックします。繰り返しになりますが、例では「staticsite.work」と言うドメインの設定をしています。 5-2. お名前.comでネームサーバーの設定 作成したホストゾーン(staticsite.work)クリックします。 下記画像で網掛けしている4つのURLを、お名前.comに登録して行きます。 別タブでお名前.comの管理画面を開き、ログインします。 「TOP」に移動して「ネームサーバーの設定をする」をクリックします。 下図のように購入したドメインにチェックを入れます。 更に「2.ネームサーバーの選択」項目で「その他」タブをクリックします。 ネームサーバー1~4までを先ほどの画像で網掛けした部分に対応するように1行ずつコピペして行きます。1~4まで埋め終わったら「確認」を押します。 5-3. Amplifyコンソールでカスタムドメインの追加 Amplifyの画面に戻ります。 お名前.comとRoute53での作業は終了です。 左メニューの「ドメイン管理」を選択して現れた画面の右上にある「カスタムドメインの追加」をクリックします。 ドメインの検索ボックスをクリックすると、Route53に登録したドメインの一覧が現れるので、先ほど登録したドメインを選択します。 更に「ドメインの検索」をクリックします。下記のようにサブドメインの項目が現れます。画像中の「main」の部分は紐付けているGitHubのブランチ名となります。なので、「master」ブランチを使っている方は「master」が表示されているはずです。 またサブドメインも自由に設定出来ます。デフォルトでは「www」となっていますが、お好きなものに変更する事可能です(後から変更出来るので一旦wwwのまま作ってみるのが良いかな、と思います)。 「保存」をクリックします。 下記画面に遷移します。 設定が反映されるのを待ちます(15分ぐらい)。 ドメインの設定だけではなくHTTPS化も自動でしてくれます。 設定が終わると下記のような画面に変わります。 ブラウザのアドレスバーに登録したドメイン(www.staticsite.work)を入力するとサイトが表示されます。 以上です。 終わりに 下記記事をめちゃくちゃ参考にしました。Nuxt.jsでの実装となっています。下記記事のフレームワークを使わない静的サイト版と言う位置付けを意識して、パクリでは無いと言い聞かせて書きました。どなたかのお役に立つ事が出来たら幸いです。 Amplify Consoleで楽々ホスティング - Basic認証からドメイン設定まで解説します
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Basic認証付きの静的サイトを物凄く簡単にサーバレス(AWS)で公開する

Basic認証付きの静的サイトを物凄く簡単にサーバレス(AWS)で公開出来る事を知ったので、やってみた形式で紹介したいと思います。 具体的にはAWSのAmplifyConsoleを使います。 一般的にAWSで静的サイトにBasic認証をかけたい場合、S3 + CloudFront + Lambda@edgeで実現するかな、と思いますが、それより100倍くらい楽です。 【前提】 GitHubのアカウントを持っている。基本的な操作が出来る AWSアカウントを持っている 独自ドメインを購入済みである 記事中ではお名前.comで購入したドメインを使用します AmplifyConsoleなどの単語を初めて聞いた人でも大丈夫です この記事でやる事 静的サイトのHTMLをGitHubにpushする GitHubとAWS Amplify Consoleを紐づける(これだけでサイトが公開されます) Basic認証をかける ソースを変更してGitHubにpush。自動でサイトが更新される様子を確認する 独自ドメインとHTTPS化の設定をする 作業時間自体は15分ぐらい、設定の反映の待ち時間含めて30分ぐらいとなります。 ※「5. 独自ドメインを設定する」の作業で、待たされる時間が発生します。 1. 静的サイトのHTMLをGitHubにpushする ここからは、index.htmlのみの簡素なサイトを例に、Basic認証付きで公開する作業をして行きます。 【作業】 1-1. ローカル環境に静的サイトを準備する 1-2. GitHubにリポジトリを作成しコードをpushする 1-1. ローカル環境に静的サイトを準備する ローカル環境にstatic-siteフォルダを作り、index.htmlを下記内容で作成します(説明を容易にするため簡素なHTMLを使用しています)。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <h1>Hello,world!</h1> </body> </html> 1-2. GitHubにリポジトリを作成しコードをpushする GitHub上にstatic-siteと言う名前でリポジトリを作成したら上記のコードをpushします。 2. GitHubとAWS Amplify Consoleを紐づける AWSのマネジメントコンソールにログインします。 サービスの検索窓に「Amplify」と入力します。「AWS Amplify」へと移動します。 下記画面に遷移したら、右上のオレンジの「New App」ボタンをクリックします。更にボタンが現れるので「Host web app」をクリックします。 ※初めてこの画面に来た人は、「すべてのアプリ」が空の状態になっているかと思います。 下記画面にしたらGitHubを選択して右下の「Continue」をクリックします。 ここでGitHubのアカウントとの紐付けを行います。紐付けの作業は初回のみです。画面の指示に従って頂くと紐付け作業を完了出来るかな、と思います。 紐付け完了後は下記画面となります。 「リポジトリ」のセレクトボックスをクリックします。GitHub上のリポジトリの一覧が現れるので、先ほど作成したリポジトリを選択します。 更にブランチを選びます。 作業したブランチを選択して下さい。 私の場合はブランチ名をリネームしたのでmainブランチですが、masterのまま作業をしている方はmasterが表示されるかと思います。その場合は、masterを選択して下さい。 選択出来たら「次へ」をクリックします。 下記画面に遷移します。何も変更を加えずに「次へ」をクリックします。 ※画面上の「ビルドの設定」の項目に警告のマークがついているのが気になるかと思いますが、無視して大丈夫です。VueやReactなどのビルドを伴うサイトを扱う際には、編集を行います。今回は不要です。 下記画面に遷移したら「保存してデプロイ」をクリックします。 サイトの公開設定は以上です。 下記画面のようにプロビジョン、ビルド、デプロイ、検証に全てチェックが入るのを待ちます(2〜3分ぐらい)。 サイトのURLが発行されます。 URLをクリックしてサイトを確認します。 GitHubにpushしたHTMLが表示されている事を確認出来ます。 3. Basic認証をかける 左のメニューより「アクセスコントロール」を選択し、遷移した画面で右上にある「アクセス管理」をクリックします。 下記画面に遷移します。ここでBasic認証のユーザー名とパスワードを設定出来ます。ユーザー名とパスワードを入力したら「Save」をクリックします。 公開したサイトをもう一度開くと(もしくはリロードすると)Basic認証のダイアログが現れます。 設定したユーザー名とパスワードを入力すると、サイトが表示されます。 4. ソースを変更してGitHubにpush。自動でサイトが更新される様子を確認する サイトの更新は「ローカルで更新作業をする」 → 「GitHubにpushする」 → 「Amplify Consoleがpushを検知して自動で更新してくれる」と言う流れになります。 実際に見て行きます。 ローカルにあるstatic-site/index.htmlをエディタで開き下記のように変更します。 (pタグを適当な内容で追加しただけです。) <h1>Hello,world!</h1> <p>hellohellohellohellohellohellohello</p> 変更を保存したら、GitHubに変更をpushします。 マネジメントコンソールに戻ると、再びプロビジョニングが始まっている事を確認出来ます。 全てチェックが入ると更新完了です。 更新内容が反映された事を確認します。 HTMLファイルを手動であげる作業は発生しません。 それっぽい言葉を使うとCICDのCDを実現している状態です。 (参考)CIとCDの違い 5. 独自ドメインとHTTPS化の設定をする Basic認証同様に簡単に独自ドメインの設定も出来ます。 例として予めお名前ドットコムで購入した「staticsite.work」と言うドメインを公開したサイトにくっつけて行きます。 【作業】 5-1. Route53でホストゾーンの登録 5-2. お名前.comでネームサーバーの設定 5-3. Amplifyコンソールでカスタムドメインの追加 5-1. Route53でホストゾーンの登録 Route53に移動して「ホストゾーンの作成」をクリックします。 ドメイン名に取得したドメインを入力して「ホストゾーンの作成」をクリックします。繰り返しになりますが、例では「staticsite.work」と言うドメインの設定をしています。 5-2. お名前.comでネームサーバーの設定 作成したホストゾーン(staticsite.work)クリックします。 下記画像で網掛けしている4つのURLを、お名前.comに登録して行きます。 別タブでお名前.comの管理画面を開き、ログインします。 「TOP」に移動して「ネームサーバーの設定をする」をクリックします。 下図のように購入したドメインにチェックを入れます。 更に「2.ネームサーバーの選択」項目で「その他」タブをクリックします。 ネームサーバー1~4までを先ほどの画像で網掛けした部分に対応するように1行ずつコピペして行きます。1~4まで埋め終わったら「確認」を押します。 5-3. Amplifyコンソールでカスタムドメインの追加 Amplifyの画面に戻ります。 お名前.comとRoute53での作業は終了です。 左メニューの「ドメイン管理」を選択して現れた画面の右上にある「カスタムドメインの追加」をクリックします。 ドメインの検索ボックスをクリックすると、Route53に登録したドメインの一覧が現れるので、先ほど登録したドメインを選択します。 更に「ドメインの検索」をクリックします。下記のようにサブドメインの項目が現れます。画像中の「main」の部分は紐付けているGitHubのブランチ名となります。なので、「master」ブランチを使っている方は「master」が表示されているはずです。 またサブドメインも自由に設定出来ます。デフォルトでは「www」となっていますが、お好きなものに変更する事可能です(後から変更出来るので一旦wwwのまま作ってみるのが良いかな、と思います)。 「保存」をクリックします。 下記画面に遷移します。 設定が反映されるのを待ちます(15分ぐらい)。 ドメインの設定だけではなくHTTPS化も自動でしてくれます。 設定が終わると下記のような画面に変わります。 ブラウザのアドレスバーに登録したドメイン(www.staticsite.work)を入力するとサイトが表示されます。 以上です。 終わりに 下記記事をめちゃくちゃ参考にしました。Nuxt.jsでの実装となっています。下記記事のフレームワークを使わない静的サイト版と言う位置付けを意識して、パクリでは無いと言い聞かせて書きました。どなたかのお役に立つ事が出来たら幸いです。 Amplify Consoleで楽々ホスティング - Basic認証からドメイン設定まで解説します
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Athenaのパーティションでは大文字禁止!

「Athenaのパーティションでは大文字禁止!」 これを知らずに、ハマりまくりました。(厳密には禁止というか、使えないよ、ということです) みなさん、同じ溝にハマらないでください。という思いで記載します。 Athenaではパーティションに、大文字(キャメルケースなども)が使えないらしいです。 詳細: https://docs.aws.amazon.com/ja_jp/athena/latest/ug/msck-repair-table.html Amazon S3 パスを小文字に変更する Amazon S3 パスは小文字にする必要があります。S3 パスがキャメルケースの場合、MSCK REPAIR TABLEは、パーティションを AWS Glue データカタログに追加しません。たとえば、S3 パスがuserIdのパーティションは AWS Glue データカタログに追加されません。 つまり、HIVE形式にして userId=123 といったパーティションは使えないので userid=123 とフラットケースにしなければなりません。 テーブル作成中にもエラーが出ないし、特にメッセージもなかった(はず)。 MSCK REPAIR TABLEしても、ALTER TABLE ADD PARTITIONをしても、 クエリが0件でヒットする形に、、、なります。 データの形式がおかしいのか、色々回り回った挙句、 ふと、パーティションを小文字にしてみたらデータがロードされた。 他にも、パーセントエンコーディングが必要な文字などは注意が必要だったりします。 基本英数字小文字でs3パスを構成するのが無難のようです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSとWordPressを使ってWebサイトを構築しよう⑩

■DNS名(ドメイン名)を割り当てる 今回はインスタンスにDNS名を割り当てていきます。 DNS名はドメイン名とも言い換えられますが、そもそもDNS名とは何でしょうか? 目次 1.DNSとは 2.DNSを有効化しよう 3.【おまけ】(nslookupコマンドで名前解決を確認する) 1. DNSとは まずドメインとはインターネットの世界で言う住所のようなもので下記のようなものです。 https://www.google.com/ 普段私たちはこのようなドメイン名を検索バーへ入力して目的のWebサイトを閲覧しますが、実はインターネットの中でこのドメイン名をIPアドレスに変換して目的のWebサイトを表示してくれています。 この変換してくれる仕組みをDNS(Domain Name System)と言い、DNSサーバーが仕組みを提供します。 またドメイン名をIPアドレスに変換することを名前解決と言います。 2. DNSを有効化しよう 前回はWebブラウザからパブリックIPを使用してWebサーバーへアクセスしました。 今回はWebサーバーにドメイン名を付与してパブリックIPからではなく、ドメイン名でアクセスできるようにしていきます。 まず検索バーに「VPC」と入力して、表示された「VPC」をクリックしてください。 左メニューから「VPC」をクリックし、以前作成した「VPC」を選択してください。 そして右上にある「アクション」をクリックし、「DNSホスト名を編集」をクリックしてください。 「DNSホスト名」の下に「有効化」と書かれたチェックボックスにチェックを入れて、「変更を保存」をクリックしてください。 これでインスタンスにDNS名が付与されたので確認してみましょう。 検索バーに「EC2」と入力し、「EC2」をクリックしてください。 左メニューから「インスタンス」をクリックし、作成したインスタンスを選択してください。 すると画像下2つの赤枠内に「パブリック IPv4 DNS」と「プライベート IPv4 DNS」という項目があり、下記のようにDNS名が設定されたのが分かります。 ・パブリック IPv4 DNS:ec2-3-112-29-31.ap-northeast-1.compute.amazonaws.com ・プライベート IPv4 DNS:ip-10-0-1-10.ap-northeast-1.compute.internal パブリックDNS名はインターネットからアクセスできるDNS名で、プライベートDNS名はVPC内でアクセスできるDNS名です。 ではパブリックDNS名を使ってWebブラウザからアクセスできるか確認しましょう。 Webブラウザの検索バーにパブリックDNS名を入力してアクセスしてください。 すると下記のようにApacheのデフォルト画面が表示されて、無事パブリックDNS名からもアクセス出来たことが分かります。 3. 【おまけ】(nslookupコマンドで名前解決を確認する) 最初にドメイン名をIPアドレスに変換することを名前解決と言いました。 今回DNS名を付与させて名前解決ができているので、実際にコマンドプロンプト上で名前解決ができているか確認しましょう。 ここではMacのターミナルを使用した方法を紹介します。(Windowsでも同じコマンドは使用できます) ターミナルを開き下記コマンドを入力します。 ※パブリックDNS名はご自身のを入力してください。 nslookup ec2-3-112-29-31.ap-northeast-1.compute.amazonaws.com すると下記のように「Name:ec2-3-112-29-31.ap-northeast-1.compute.amazonaws.com」に対して「Address: 3.112.29.31」が返ってきています。 これはパブリックDNS名が名前解決されて、WebサーバーのパブリックIP「3.112.29.31」が表示されたということになります。 Server: 192.168.10.1 Address: 192.168.10.1#53 Non-authoritative answer: Name: ec2-3-112-29-31.ap-northeast-1.compute.amazonaws.com Address: 3.112.29.31 今回はここまで。 次回はプライベートサブネットを作成していきます。 次の記事はこちらから AWSとWordPressを使ってWebサイトを構築しよう⑪
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む