20210213のAWSに関する記事は23件です。

【AWS】未経験からAWS認定6冠達成までのまとめ

SIer2年目、オンプレインフラ設計(パブクラ未経験)者が、半年でAWS認定6冠できるまでの道のりをつらつらと書いていきます。

過去合格記は以下をご覧ください。
【AWS】クラウドプラクティショナー(CLF)合格記
【AWS】ソリューションアーキテクト-アソシエイト(SAA)合格記
【AWS】SysOpsアドミニストレーター-アソシエイト(SOA)合格記
【AWS】Developer-アソシエイト(DVA)合格記
【AWS】ソリューションアーキテクト – プロフェッショナル(SAP)合格記
【AWS】DevOps エンジニア – プロフェッショナル(DOP)合格記

取得資格

まずは、各試験について取得日と点数をまとめます。
こう見るとほとんどギリギリで取ってましたね。。。ほんと、よく取れました(笑)

日付 資格 点数
2020-06-27 AWS Certified Cloud Practitioner(CLF-C01) 755
2020-07-26 AWS Certified Solutions Architect - Associate(SAA-C02) 725
2020-08-10 AWS Certified SysOps Administrator - Associate(SOA-C01) 731
2020-08-29 AWS Certified Developer - Associate(DVA-C01) 829
2020-09-11 AWS Certified Solutions Architect - Professional(SAP-C01) 819
2020-09-26 AWS Certified DevOps Engineer - Professional(DOP-C01) 762

全体的な感想をまず述べておくと、全体を通して同じ範囲が深さが変わって出題されるので、SAPやDOPを目指すのであれば、連続して学習することをおススメします。
あとは、各試験で主に意識するべきポイントが変わるので、その部分を押さえておけば問題ないと思います。
基本的にベストプラクティスがあり、その次にコスト効率なのか耐障害性なのかといった要件が入ってきます。まずは、ベストプラクティスを理解するところから始めましょう。

勉強方法

勉強方法については、いろいろな方法があると思います。ご自身に合った方法で続けられるものを選んでください。
基本的には以下の9つの組み合わせかなと思います。

  1. AWS公式のホワイトペーパーを読み込む。
  2. AWS公式のBlackBeltを読み込む。
  3. 模擬問題集を解く。
  4. Udemyで問題集を解く。
  5. Web問題集で問題を解く。
  6. 無料ハンズオンを受講する。(サービスには課金されるので注意)
  7. 公式研修を受講する。(高額ですので余裕があればぜひ)
  8. AWS認定公式動画を見る。
  9. 先人の知恵を授かる。

1と2はAWSが公式に出しているベストプラクティス集のようなものです。これだけで合格したという方もいらっしゃいます。(私には無理でした。。。)

3はAWS公式模擬試験です。問題数は少ないですが、実際の試験のレベル感や内容を把握するのには十分です。回答が表示されませんので、各問題をスクショしてあとから見直しができるようしておきましょう。

4と5は問題を実際に解いて理解していけるので、試験の練習も兼ねてできるので良いです。
4のUdemyは試験1回分通して問題を解く必要があり、私のように一問ずつ確認して進めたい人には合わないかもしれません。
5は過去記事でも紹介している、AWS WEB問題集で学習しようを利用しました。こちらは1問ごとに解説を確認でき、1セット7問なので隙間時間に気軽に勉強できました。(こちらのサイト関係者ではありませんので、ご安心ください笑)

あとは実際にサービスに触れるという点で、6と7を活用してみてください。特に6はかなり優秀で受講自体は無料です。ただし、構築したサービスには課金されますので、ご注意ください。受講が終わり次第サービスを止めることを忘れないでください、結構高額になったりします。。。

8の動画もおススメです。各動画に数問ずつ問題もありますので、これだけでも対策としてはかなりのレベルまで上げられると思います。

最後に数多の先人が受験記録をアップしていますので、その方々の記事を読むこともどんな点につまずいたのかなどがわかるので良いです。

様々な方法がありますので、ご自身に合った方法で頑張ってください!

最後に

AWSは頻繁にサービスが新しくなり、試験のベストプラクティスと今のベストプラクティスが異なることがありますので、試験がいつのものなのかを把握しておくことも大事です。
試験自体は問題文から要件を汲み取って、選択肢の中で満たすものを選択するので、今と違うということでパニックならないように注意してください。

ためになるようなならないような内容になってしまいました。。。ここまで読んでいただきありがとうございます。
12冠目指して頑張ろうと思います。無事取得出来次第、アップしていきたいと思います。

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

AWS 認定クラウドプラクティショナーに合格したお話

はじめに

私が試験を受ける際に使用した教材や試験のポイントを簡潔にまとめてみました。

主な対象者

・クラウドプラクティショナーを受験する方
・一度受験したが合格できなかった方

使用した教材

・AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー
https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC-%E5%B1%B1%E4%B8%8B-%E5%85%89%E6%B4%8B/dp/4797397403/ref=sr_1_1?adgrpid=112883073061&dchild=1&hvadid=492569283323&hvdev=c&hvqmt=b&hvtargid=kwd-574411356434&hydadcr=26606_10279519&jp-ad-ap=0&keywords=aws+%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC&qid=1613221735&sr=8-1&tag=yahhyd-22
・この問題だけで合格可能!AWS認定クラウドプラクテショナー模擬試験問題集(Udemy)

やったこと

・まずは上記の教材を一読して全体の概要を掴み、サービスの名前やアーキテクチャの概要を理解していきました。
・次にUdemyの模擬試験問題集を正答率80%を超えるまで繰り返し解きました。(平均して3回ずつくらい)
・模擬試験を解き終わったあともう一度教材を読み直し試験に望みました。

試験で意識するべきポイント!!!

ここからが重要なのですが試験を受ける上で抑えておいたほうが良いポイントを下記に示します。

  1. AWSの責任範囲とユーザーの責任範囲の違いについて(OSのアップデートは誰がやるのかなど)
  2. EC2インスタンスの特徴(リザーブド・オンデマンド)
  3. RDSの利点(→結構でますしっかり抑えましょう!)
  4. CloudWatchとCloudTrailとCloudFrontは出ると思います。
  5. ベーシックプラン、開発者、エンタープライズプランの違いを理解する。(ベーシックではできなくて開発者ではできることなど)
  6. クラウドアーキテクチャの設計原理
  7. Well-Architectedフレームワーク(信頼性の柱とは何かなど)
  8. IAMの理解
  9. クラウドのメリット(迅速に対応できるなど)
  10. アベイラビリティゾーンとエッジロケーションの違いについて
  11. コスト見積もりの違いについて
  12. アジリティとは何かについて
  13. シングルサインオンのサービスについて

などなどざっとポイントを列挙してみました。
他にも教材に出てくるサービスの概要は理解しておきましょう。
このサービスは〇〇をすると言えるまで覚えましょう。

以上、クラウドプラクティショナー試験を受験する上でのポイントをまとめてみました。ご参考までに。

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

【AWS】DevOps エンジニア – プロフェッショナル(DOP)合格記

はじめに

AWS 認定DevOps エンジニア – プロフェッショナル(DOP)に合格した(2020-09-26)ので、合格までの道のりを残しておこうと思います。

CLF合格記は以下をご覧ください。
【AWS】クラウドプラクティショナー(CLF)合格記
SAA合格記は以下をご覧ください。
【AWS】ソリューションアーキテクト-アソシエイト(SAA)合格記
SOA合格記は以下をご覧ください。
【AWS】SysOpsアドミニストレーター-アソシエイト(SOA)合格記
DVA合格記は以下をご覧ください。
【AWS】Developer-アソシエイト(DVA)合格記
SAP合格記は以下をご覧ください。
【AWS】ソリューションアーキテクト – プロフェッショナル(SAP)合格記

DOPはSAPの合格後すぐに勉強を始めました。
AWS認定試験は範囲が被る部分が多いので、複数資格取得を目指すなら、継続して勉強することをおススメします。

DOPは試験の名の通りDevOpsがメインになります。
DevOpsとは、「Development」と「Operations」つまり、「開発」と「運用」をより協調性をもって、迅速にビジネスの価値を高めながらエンドユーザーへシステムを提供するという概念です。
なので、開発や運用の自動化や効率化といった部分が多く出題されます。

What's SAP?

まずは、DOP試験について
AWS 認定 DevOps エンジニア – プロフェッショナル

上記サイトによると、認定によって検証される能力は以下のようです。

  • AWS で継続的デリバリーのシステムと手法を実装して管理する
  • セキュリティコントロール、ガバナンスプロセス、コンプライアンス検証を実装し、自動化する
  • AWS でのモニタリング、メトリクス、ログ記録システムを定義し、デプロイする
  • 高可用性、スケーラビリティ、自己修復機能を備えたシステムを AWS プラットフォームで実装する
  • 運用プロセスを自動化するためのツールの設計、管理、維持を行う

開発経験やIaC経験などが推奨されていますが、私は何も経験していません。
AWSとして推奨しているDevOpsに関する各サービスのベストプラクティスとパターンに合った選択が理解できるようにしましょう。

試験に向けて

基本的にはSAAと同じ手法をとっていきました。(研修への参加はしていません。)
問題⇒解説⇒BlackBelt⇒問題⇒・・・の流れは変わりません。
ただし、今まで以上に開発・運用までの効率化や自動化の手法(構成)を意識して学習しました。

公式サンプル問題

これはCLFと変わらず事前に受けて現状のレベルの確認をします。
他の試験を通して勉強してきたので、私は80%ほどの出来でした。

ホワイトペーパーを読む

CLFと同じくホワイトペーパーを読みました。

Black Beltを読む

こちらもCLFと同じくBlack Beltを読みました。

問題を解く

AWS WEB問題集で学習しよう

こちらのサイトは一問ごとに解説が表示され、都度確認ができ、BlackBeltやホワイトペーパーへのリンクもあるので、勉強しやすかったです。

個人のハンズオンでは実践できる範囲が限られているので、机上での学習がメインになります。
問題文の構成図を素早くイメージして、最適解を導く訓練をしましょう。
DOPはさらに自動化ツールや運用効率化をメインに出題されるので、CodeシリーズやElasticSerchなどをメインに学習することをお勧めします。
というか、ほとんどこのあたりの出題ですので、ここを完璧にすると、安心して試験に向かえます。

試験当日

上記対策を計2週間(延べ20時間程度)行い、試験に臨みました。

結果は、762点(720点以上で合格)で合格でした。

感想

SAPを受けた後なので、問題分の長さには困りませんでしたが、インシデントへの対応やセキュリティなどの管理ポリシーが難しかった印象です。
やはり、CodeシリーズやElasticシリーズが多かったです。デプロイ方法の最適解も聞かれたりしましたので、そのあたりは詳しく勉強しておいた方が良いです。(BeanstalkとCodeDeploy、OpsWorksの違いや、All at onceとRolling with an additional batch等々)

最後まで読んでいただきありがとうございます。

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

【AWS】認定ソリューションアーキテクト-アソシエイト-受験記録

【AWS】認定クラウドプラクティショナー受験記録

前回クラウドプラクティショナーを受験してから、
次なる目標としたのはみんな大好きソリューションアーキテクト-アソシエイト-です。

受験の際に同意した受験者行動規範により、試験内容の開示、共有は禁止されていますので、今回もあくまで試験に向けて行った準備とか感想とかを記していこうと思います。

本題

今回の試験も無事に一発合格しております。
スコアは753でしたので、余裕を持っての合格と言う感じではなかったですが。

スクリーンショット 2021-02-13 20.53.02.png

準備期間はちょうど4週間、学習ペースは土日は3~5時間、平日は仕事が終わった後に1時間くらい。教材も前回と変わらず、安定の問題集をゴリゴリ解きまくるスタイルで。

書籍
AWS認定資格試験テキスト AWS認定ソリューションアーキテクト - アソシエイト 改訂第2版
Udemy
これだけでOK! AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座(SAA-C02試験対応版)
その他
AWS WEB問題集で学習しよう

書籍はお馴染みAWS認定資格試験テキストですが、改訂第2版がちょうど発売されるタイミングだったので購入しました。SAA-C02に対応した内容も含んでいるようではありますが、これだけで完結と言う事ではなく、概要を掴んで各サービスの理解を深めるのは自分でやってねと言う書き方だったかなと思います。書籍ではあっさり書かれているサービスでも公式資料などを見て、深く理解しておく必要があると思います。

Udemyは模試を1、2周だけ。気になるサービスのハンズオンは少しやりましたが、サービスを起動して試運転する程度の内容なので、効率的に試験対策したいなら全部をやる必要はないかなと思います。動かすなら、実際にサービス組んでみるくらいやらないと意味ないなあと個人的には思います。

一番世話になったのはWEB問題集ですね。
SAAは問題文が長い傾向にあるので、数をこなすにはかなりの忍耐力が必要になりますが、腐らずガンガン解いて、正解も不正解も解説をしっかり読み、サービスの理解を深めるのが重要です。

数をこなせば、サービス毎の長所短所が把握出来て、ユースケースのパターンもある程度想像出来るようになりますので、このサービスならこう言う問題が作れるな、みたいな感じで自分で問題を考えられるくらいになると自身がつくかなと。

まあ、出題範囲が広いんで、網羅するのはなかなか難しいんですけどね。
今回あまり点が伸びなかったのは、問題集を過信し過ぎたのが要因かなと思います。新しく試験範囲になった新サービスの理解が明らかに足りなかったです。

試験は今回もピアソンVUEですが、近所のテストセンターで予約が取れなかったので、
自宅からはちょっと遠目のテストセンターで受験しました。運営企業は前回とは異なるようでしたが、段取りはほとんど変わりませんでした。

まとめ

ビッグデータを扱うようなサービスは実際に使ってみるという事はないかもしれないですが、
ストレージ系やサーバレスなコンピューティング系のサービスは個人アプリとかで使ってみながらこれからも理解を深めて行こうかなと思いました。AWSは奥が深い・・・。

一先ず合格出来て一安心ですが、アソシエイト資格は是非網羅したいので、
次に受けるSysOpsアドミニストレーターの勉強を早速始めたいと思います。

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

CloudWatchEventsからECS on Fargateのタスクを定期的に実行しつつ環境変数を上書きする方法

バージョン情報

$ terraform version
Terraform v0.14.6
+ provider registry.terraform.io/hashicorp/aws v3.27.0

結果はこちら

resource "aws_cloudwatch_event_rule" "cwevent_rule" {
  name                = ${好きな名前}
  schedule_expression = "cron(%d 21 * * ? *), # JST cron(%d 6 * * ? *)"
  # schedule_expression = "rate(1 minute)"
  is_enabled          = true
}
resource "aws_cloudwatch_event_target" "cwevent_target" {
  arn      = ${ECSクラスターのARN}
  rule     = aws_cloudwatch_event_rule.cwevent_rule.name
  role_arn = aws_iam_role.event_bridge.arn
  input = <<EOL
{
    "containerOverrides": [
      {
        "name": "${上書きしたいコンテナのname}",
        "environment": [
          { "name": "HOGEFUGE", "value": "hogefuge" }
        ]
      }
    ]
  }
EOL
  ecs_target {
    launch_type         = "FARGATE"
    platform_version    = "1.4.0"
    task_count          = 1
    task_definition_arn = ${起動したいtask_definitionARN}   # リビジョン指定部分をsubstr()とかで削れば常にlatestで動く

    network_configuration {
      assign_public_ip = false
      subnets          = ${タスクを動かしたいサブネットID}
      security_groups  = [${タスクにアタッチしたいSGID}]
    }
  }
}

data "aws_iam_policy_document" "event_bridge" {
  statement {
    effect = "Allow"
    principals {
      identifiers = ["events.amazonaws.com"]
      type        = "Service"
    }
    actions = ["sts:AssumeRole"]
  }
}
data "aws_iam_policy_document" "event_bridge" {
  statement {
    effect  = "Allow"
    actions = ["ecs:RunTask"]
    resources = ["*"]
  }
  statement {
    effect    = "Allow"
    actions   = ["iam:PassRole"]
    resources = ["*"]
    condition {
      test     = "StringLike"
      variable = "iam:PassedToService"
      values   = ["ecs-tasks.amazonaws.com"]
    }
  }
}
resource "aws_iam_role_policy" "event_bridge" {
  policy = data.aws_iam_policy_document.event_bridge.json
  role   = aws_iam_role.event_bridge.name
}
resource "aws_iam_role" "event_bridge" {
  name               = ${好きな名前}
  assume_role_policy = data.aws_iam_policy_document.event_bridge.json
}

なんでこんなことをしたか

  • embulkをECSを利用し定期的に実行したかった
    • ただし、すべてのテーブルを全部同時に動かすと負荷が怖いのでテーブル単位で動かしたかった
  • でもテーブルごとにdockerイメージやECSタスクを作るのはめんどくさい
  • ECSでコンテナ起動する時に環境変数を注入するがそのときの環境変数をCW Events側で上書きできればECSサービス、ECSタスク、Dockerイメージ、それぞれ1つだけ用意すれば動かせることに気がついた

「CloudWatch Events」?「Amazon EventBridge」?

  • CW Eventsは名前が変わるっぽいのでドキュメント探すときは注意が必要かも?
  • Terraform側はどう対応するのか気になる

https://aws.amazon.com/jp/eventbridge/faqs/

Q: Amazon EventBridge は CloudWatch Events とどのように関連していますか?

Amazon EventBridge は、CloudWatch Events をベースに構築された、CloudWatch Events を拡張するサービスです。Amazon EventBridge では、CloudWatch Events と同じサービス API とエンドポイント、同じ基盤となるサービスインフラストラクチャを使用します。これまで CloudWatch Events を使用しているお客様にとっては、何も変わることはありません。これまでと同じ API、CloudFormation テンプレート、コンソールを引き続き使用できます。お客様からの報告によれば、CloudWatch Events はイベント駆動型アーキテクチャを構築するための理想的なサービスです。そのため、AWS ではお客様が独自のアプリケーションとサードパーティーの SaaS アプリケーションからデータを接続できるようにする新しい機能を構築しました。AWS は、この機能を CloudWatch サービス内にとどめておくのではなく、Amazon EventBridge という新しい名前でリリースしました。この機能が、CloudWatch Events が開発された目的であるモニタリングユースケースを超えた拡張であることを示すためです。

参考資料

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

AWS Client VPNをAWS SSOで認証できるようにする途中で詰まったところを書く

各種ログファイルの出力先

MacOS のトラブルシューティング - AWS Client VPN :
https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-user/macos-troubleshooting.html

/Users/username/.config/AWSVPNClient/logs

アプリケーションログ: アプリケーションに関する情報が含まれます。これらのログには「aws_vpn_client_」が前に付けられます。
OpenVPN ログ: OpenVPN プロセスに関する情報が含まれます。これらのログには「ovpn_aws_vpn_client_」が前に付けられます。

/tmp/AcvcHelperErrLog.txt
/tmp/AcvcHelperOutLog.txt

TunnelBlickなどのOpenVPNクライアントで読み込めない。もしくは接続エラーになる

現象

  • TunnelBlickで出てきたエラー
"Unrecognized option or missing or extra parameter(s)".
このエラーは OpenVPN サーバから送られた OpenVPN 設定に以下の問題が含まれていることを示しています:
     • スペルが間違っている
     • パラメータが不足している、余計なパラメータが指定されている
     •このバージョンの OpenVPN では実装されていないオプションです(おそらく新しいオプションでまだサポートされていないか、古いオプションで既に削除されているもの)。"VPN の詳細" ウインドウの "設定" タブにある "OpenVPN バージョン" で、この設定で使用する OpenVPN のバージョンを選択できます。
詳細は "VPN の詳細" ウインドウの "ログ" タブに出力されているログを確認してください。

解決策

クライアント VPN エンドポイントが SAML ベースのフェデレーション認証を使用するように設定されている場合は、AWS が提供するクライアントを使用して接続する必要があります。
- ユーザーガイド > AWS Client VPN > MacOS
- https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-user/macos.html

発生した環境

Tunnelblick 3.8.3 (build 5520)

原因

  • SAMLベースのフェデレーション認証を使用するクライアント VPN エンドポイントからクライアント設定をダウンロードしたovpnファイルには以下のようなオプション指定が入っている
〜大体110行目あたり〜
〜前略〜
auth-user-pass
auth-federate      ←問題の部分
auth-retry interact
auth-nocache
reneg-sec 0
  • OpenVPN2.4時点では「auth-federate」と言うオプションは存在しないのでエラーとなる

ダウンロードしたプロファイルをAWS Client VPNで読み込み接続をしても、ログイン画面が開かず、ぐるぐる回ったまま動かなくなってしまう。

原因

Amazonから提供された クライアントVPN設定ファイルに認証機関 (CA) チェーン情報がないため、検証に失敗します。
- Windows のトラブルシューティング - AWS Client VPN :
- https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-user/windows-troubleshooting.html
- ※Windows向け記事だがMacOSでも当てはまる

解決策

反省

  • 全部ドキュメントに書いてあることでした。。。。
  • サポートの人ごめんなさい。。。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

laravel6でS3に画像アップロード&削除

前提

参考記事のコード = PostsController.php
実装コード = exampleController.php

S3に画像をアップロードする方法

LaravelでAWS S3へ画像をアップロードする
こちらの記事を参考にして無事S3に画像を保存できました

S3の画像の削除

削除ボタンを押すと、このコントローラが走るようにルーティング

exampleController.php
public function delete(Request $request) {
        $image = $request->image_path;
        $s3_delete = Storage::disk('s3')->delete($image);
        $db_delete = Post::where('image',$image)->delete();
        return redirect('hogehoge');
    }

これでDBとS3から画像を削除!
とおもいきや、Dbからは削除されるのにS3からは削除できていない

S3から削除できない原因

PostsController.php
$post->image_path = Storage::disk('s3')->url($path);

参考記事ではこのように、パスにURL関数を使いそれをDBに保存しているので、DBにはURLを含んだパスが保存されています。

S3はvi3kAwK0z0X19XU3LWcz63101t0rYilRHiWG9MmC.jpg

DBはhttps://example.s3-ap-northeast-1.amazonaws.com/myprefix/vi3kAwK0z0X19XU3LWcz63101t0rYilRHiWG9MmC.jpg
のように保存されているため、
exampleController.php$imageはこうなっています。

exampleController.php
$image = https://example.s3-ap-northeast-1.amazonaws.com/myprefix/vi3kAwK0z0X19XU3LWcz63101t0rYilRHiWG9MmC.jpg;

なのでS3に「そんなものないよ!」と言われているので削除ができないということでした。

解決策

参考記事をこのように変更します。

PostsController.php
public function create(Request $request)
  {
      $post = new Post;
      $form = $request->all();

      //s3アップロード開始
      $image = $request->file('image');
      // バケットの`myprefix`フォルダへアップロード
      $path = Storage::disk('s3')->putFile('myprefix', $image, 'public');
      // アップロードした画像のフルパスを取得
+     $post->image_path = $path; //追加
-     $post->image_path = Storage::disk('s3')->url($path); //削除

      $post->save();

      return redirect('posts/create');
  }

こうすることで、S3とDBに保存される名前を一致できたのでexampleController.phpを内容は変更せず削除ができるようになりました。

View

srcにhttps://example.s3-ap-northeast-1.amazonaws.com/を追加すると表示することができました!

<img src="https://example.s3-ap-northeast-1.amazonaws.com/{{ $my_image['image'] }}" >

参考

LaravelでAWS S3へ画像をアップロードする
LaravelでS3のファイル操作をする方法まとめ

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

CloudWatchを仮想マシンに導入してみる

環境

OS:CentOS7
仮想マシン:Virtual Box

方法

CloudWatchを利用するには、オンプレの場合はEC2インスタンスの場合と違ってCloudWatchエージェントをインストールする必要があります。
しかし、エージェントをインストールするだけでは不十分で、専用のIAMユーザーを作成し、サーバーに情報を設定しなければなりません。

手順

CentOSにrootユーザーでログインする。

CloudWatch エージェントパッケージをダウンロード

CloudWatch エージェントパッケージをダウンロードします。

wget https://s3.amazonaws.com/amazoncloudwatch-agent/centos/amd64/latest/amazon-cloudwatch-agent.rpm

パッケージの署名を確認します。

#公開鍵のダウンロード
wget https://s3.amazonaws.com/amazoncloudwatch-agent/assets/amazon-cloudwatch-agent.gpg

#公開鍵をインポート
gpg --import amazon-cloudwatch-agent.gpg
#結果
gpg: 鍵3B789C72: 公開鍵"Amazon CloudWatch Agent"をインポートしました
gpg:         処理数の合計: 1
gpg:           インポート: 1  (RSA: 1)
#この場合キー値は3B789C72


#フィンガープリントの確認
#引数にキー値をとる
gpg --fingerprint 3B789C72
#結果
pub   2048R/3B789C72 2017-11-14
   フィンガー・プリント = 9376 16F3 450B 7D80 6CBD  9725 D581 6730 3B78 9C72
uid                  Amazon CloudWatch Agent


#パッケージ署名ファイルのダウンロード
wget https://s3.amazonaws.com/amazoncloudwatch-agent/centos/amd64/latest/amazon-cloudwatch-agent.rpm.sig

#署名の確認
gpg --verify amazon-cloudwatch-agent.rpm.sig amazon-cloudwatch-agent.rpm
#結果
gpg: 2021年01月14日 07時00分29秒 JSTにRSA鍵ID 3B789C72で施された署名
gpg: "Amazon CloudWatch Agent"からの正しい署名
gpg: *警告*: この鍵は信用できる署名で証明されていません!
gpg:       この署名が所有者のものかどうかの検証手段がありません。
主鍵のフィンガー・プリント: 9376 16F3 450B 7D80 6CBD  9725 D581 6730 3B78 9C72
#このフィンガープリントと先のフィンガープリントが一致しているのでOKです

インストール

rpm -Uvh ./amazon-cloudwatch-agent.rpm

IAMユーザーの作成

次にIAMユーザーを作成します。
IAMコンソールを開きます。
ユーザーを追加をクリックします。
IAM1.png

今回ユーザー名は「VBox_CloudWatch」とします。
プログラムによるアクセス次のステップ:アクセス権限 の順に選択します。
IAM2.png

既存のポリシーを直接アタッチを選択します。
CloudWatchAgentServerPolicyを選択します。
IAM3.png

タグはそのままで次へ
IAM4.png

適切なポリシーがリストされていることを確認し、ユーザーの作成を選択します。
IAM5.png

csvファイルをダウンロードし、閉じます。
IAM6.png

AWS CLIのインストール

IAM情報をコマンドラインで入力するために、まずはAWS CLIをインストールする必要があります。

#AWS CLIのインストールファイルをダウンロード
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64-2.0.30.zip" -o "awscliv2.zip"

#インストーラを解凍
unzip awscliv2.zip

#インストールプログラムの実行
./aws/install

#インストールの確認
aws --version
#結果
aws-cli/2.0.30 Python/3.7.3 Linux/3.10.0-1160.15.2.el7.x86_64 botocore/2.0.0dev34

IAM認証情報とAWSリージョンの指定

#認証情報の設定
aws configure --profile AmazonCloudWatchAgent
#対話形式で設定
AWS Access Key ID [None]:  #ダウンロードしたcsvファイルを参照し入力
AWS Secret Access Key [None]: # 同上
Default region name [None]: ap-northeast-1
Default output format [None]: json

CloudWatch エージェントを起動

ウィザードを使用して CloudWatch エージェント設定ファイルを作成します。

/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
#対話形式で入力
=============================================================
= Welcome to the AWS CloudWatch Agent Configuration Manager =
=============================================================
On which OS are you planning to use the agent?
1. linux
2. windows
3. darwin
default choice: [1]:

Trying to fetch the default region based on ec2 metadata...
Are you using EC2 or On-Premises hosts?
1. EC2
2. On-Premises
default choice: [2]:
2
Please make sure the credentials and region set correctly on your hosts.
Refer to http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html
Which user are you planning to run the agent?
1. root
2. cwagent
3. others
default choice: [1]:
1
Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:
2
Do you want to monitor metrics from CollectD?
1. yes
2. no
default choice: [1]:
2
Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:
1
Do you want to monitor cpu metrics per core? Additional CloudWatch charges may apply.
1. yes
2. no
default choice: [1]:
1
Would you like to collect your metrics at high resolution (sub-minute resolution)? This enables sub-minute resolution for all metrics, but you can customize for specific metrics in the output json file.
1. 1s
2. 10s
3. 30s
4. 60s
default choice: [4]:
4
Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
default choice: [1]:
1
Current config as follows:
{
    "agent": {
        "metrics_collection_interval": 60,
        "run_as_user": "root"
    },
    "metrics": {
        "metrics_collected": {
            "cpu": {
                "measurement": [
                    "cpu_usage_idle"
                ],
                "metrics_collection_interval": 60,
                "resources": [
                    "*"
                ],
                "totalcpu": true
            },
            "disk": {
                "measurement": [
                    "used_percent"
                ],
                "metrics_collection_interval": 60,
                "resources": [
                    "*"
                ]
            },
            "diskio": {
                "measurement": [
                    "write_bytes",
                    "read_bytes",
                    "writes",
                    "reads"
                ],
                "metrics_collection_interval": 60,
                "resources": [
                    "*"
                ]
            },
            "mem": {
                "measurement": [
                    "mem_used_percent"
                ],
                "metrics_collection_interval": 60
            },
            "net": {
                "measurement": [
                    "bytes_sent",
                    "bytes_recv",
                    "packets_sent",
                    "packets_recv"
                ],
                "metrics_collection_interval": 60,
                "resources": [
                    "*"
                ]
            },
            "swap": {
                "measurement": [
                    "swap_used_percent"
                ],
                "metrics_collection_interval": 60
            }
        }
    }
}
Are you satisfied with the above config? Note: it can be manually customized after the wizard completes to add additional items.
1. yes
2. no
default choice: [1]:
1
Do you have any existing CloudWatch Log Agent (http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html) configuration file to import for migration?
1. yes
2. no
default choice: [2]:
2
Do you want to monitor any log files?
1. yes
2. no
default choice: [1]:
1
Log file path:
/var/log/messages
Log group name:
default choice: [messages]
/var/log/messages
Log stream name:
default choice: [{hostname}]

Do you want to specify any additional log files to monitor?
1. yes
2. no
default choice: [1]:
2
Saved config file to /opt/aws/amazon-cloudwatch-agent/bin/config.json successfully.
Current config as follows:
{
    "agent": {
        "metrics_collection_interval": 60,
        "run_as_user": "root"
    },
    "logs": {
        "logs_collected": {
            "files": {
                "collect_list": [
                    {
                        "file_path": "/var/log/messages",
                        "log_group_name": "/var/log/messages",
                        "log_stream_name": "{hostname}"
                    }
                ]
            }
        }
    },
    "metrics": {
        "metrics_collected": {
            "cpu": {
                "measurement": [
                    "cpu_usage_idle"
                ],
                "metrics_collection_interval": 60,
                "resources": [
                    "*"
                ],
                "totalcpu": true
            },
            "disk": {
                "measurement": [
                    "used_percent"
                ],
                "metrics_collection_interval": 60,
                "resources": [
                    "*"
                ]
            },
            "diskio": {
                "measurement": [
                    "write_bytes",
                    "read_bytes",
                    "writes",
                    "reads"
                ],
                "metrics_collection_interval": 60,
                "resources": [
                    "*"
                ]
            },
            "mem": {
                "measurement": [
                    "mem_used_percent"
                ],
                "metrics_collection_interval": 60
            },
            "net": {
                "measurement": [
                    "bytes_sent",
                    "bytes_recv",
                    "packets_sent",
                    "packets_recv"
                ],
                "metrics_collection_interval": 60,
                "resources": [
                    "*"
                ]
            },
            "swap": {
                "measurement": [
                    "swap_used_percent"
                ],
                "metrics_collection_interval": 60
            }
        }
    }
}
Please check the above content of the config.
The config file is also located at /opt/aws/amazon-cloudwatch-agent/bin/config.json.
Edit it manually if needed.
Do you want to store the config in the SSM parameter store?
1. yes
2. no
default choice: [1]:
2
Program exits now.

/opt/aws/amazon-cloudwatch-agent/bin/config.jsonに設定ファイルが保存されます。
確認します。

ls -l /opt/aws/amazon-cloudwatch-agent/bin/config.json
#結果
-rwxr-xr-x. 1 root root 1258  2月 13 16:19 /opt/aws/amazon-cloudwatch-agent/bin/config.json

エージェントの起動

#エージェントの起動
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m onPremise -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json

#確認
systemctl status amazon-cloudwatch-agent.service -l
#結果
● amazon-cloudwatch-agent.service - Amazon CloudWatch Agent
   Loaded: loaded (/etc/systemd/system/amazon-cloudwatch-agent.service; enabled; vendor preset: disabled)
   Active: active (running) since 土 2021-02-13 16:22:47 JST; 3min 25s ago
 Main PID: 4406 (amazon-cloudwat)
    Tasks: 7
   CGroup: /system.slice/amazon-cloudwatch-agent.service
           └─4406 /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent -config /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml -envconfig /opt/aws/amazon-cloudwatch-agent/etc/env-config.json -pidfile /opt/aws/amazon-cloudwatch-agent/var/amazon-cloudwatch-agent.pid

CloudWatchエージェントが無事に起動されたことが確認されました。

アラームの作成

ではCloudWatchコンソールを開いてアラームを作成します。
CloudWatch1.png
メトリクスの選択を選択します。
CloudWatch2.png
「CWAgent」が今回導入した名前空間です。
CloudWatch3.png
「cpu,host」を選択します。
CloudWatch4.png
「cpu-total」を選択します。
CloudWatch5.png
CPUのアイドル率の監視をするメトリクスなので、アイドル率があるパーセンテージを下回った時にアラームが発せられるように設定します。
というか、CPU使用率そのものを監視するメトリクスがなかったのですが、どう設定したらできるようになるんですかね?詳しい人教えてください。
CloudWatch6.png
今回は通知の設定はしません。
CloudWatch7.png
アラーム名は「VBox_CPU_Idle」とします。
CloudWatch8.png
問題がなければアラームの作成を選択します。
CloudWatch9.png
これでアラームが作成されました。

CPUに負荷をかける

CPUに負荷をかけてアラームが発生するか確認しましょう。
以下のコマンドを4回くらい打ってCPUに負荷をかけます。

yes >> /dev/null &

しばらくするとアラーム状態になっていました。
CloudWatch10.png

このままだとCPUに負荷がかかったままなのでバックグラウンドで実行されているyesコマンド停止させるのを忘れずに。

killall yes

感想

慣れないうちはオンプレ環境にCloudWatchを導入するのは大変ですが、クラウドとオンプレを併用した環境でも一緒にCloudWatchで監視することができるのは便利ですね。

参考

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/installing-cloudwatch-agent-commandline.html
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-on-premise.html
https://dev.classmethod.jp/articles/cloudwatch-agent-on-premise-windows/
https://qiita.com/murata-tomohide/items/3e66d63b21c08d6481a2
https://qiita.com/TK1989/items/0d1903846c6c54956132


この記事はAWS初学者を導く体系的な動画学習サービス
「AWS CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.com

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

AWS未経験から1.5ヶ月でSAA-C02に合格する方法 結論:ハンズオンと公式模試は必要ない

はじめに

2020年9月にAWS認定ソリューションアーキテクトアソシエイト(SAA-C02)試験に合格しました。

勉強を開始した時点でAWS知識はゼロ、また、業務関連の知識習得も必要で試験勉強のみに集中するのは難しい状況でしたが、余裕をもって合格することができました。

効率も再現性も高い勉強ができたという自負があるので、みなさまに共有したいと思った次第です。

結論をいうと、試験合格のためだけならハンズオンも公式模試も必要ありません。

学習開始時の私のスペック

  • 営業からエンジニアに転職して2週間
  • 業務はモバイルアプリ開発(TypeScript, React Native)とバックエンド開発(PHP, Laravel)
  • AWS知識はゼロ(いーしーつー?なんやそれ...?レベル)

受験の動機

  • 錯覚資産を得るため
  • AWS業務に関わる足がかりにするため
  • 社内でAWS知ってるキャラのポジションを確立するため

未経験からエンジニアに転職した人ならわかると思うのですが、入社直後は自分だけにできる仕事はなく自己肯定感が下がりがちです。業務をしっかりこなすことでまわりからの信頼を徐々に得ていく、というのが定石なのですが、前職から年収が250万以上下がって生活が苦しかった私には、周りからの信頼を得ることと同時に、エンジニアとしての市場価値を早く上げて給料アップしたいという気持ちがありました。

社内にはAWSをバリバリ使える方よりも勉強中の方のほうが多く、「SAA-C02合格」を目標に掲げている方々も数人いらっしゃったので、この人達よりも先に試験に合格してしまえば、マネージャへのアピールになりインフラ業務に携われるだろうと思いました。

勉強の詳細

使った教材と勉強の流れをまとめました。

教材

勉強の流れ(6週間)

0週目

勉強を開始する前に試験に申込みます。

どんな試験にも言えることですが、試験日が決まっているだけで勉強のモチベーションがめちゃくちゃ変わってきます。
また、仕事しながらの試験勉強は長期戦になるほど辛くなってきます。1-2ヶ月くらいの短期決戦でいきましょう。

1週目

まずは知識のインプットから始めます。

インプットには「aws WEB問題集で学習しよう」を活用します。問題集というよりAWSサービスに関するクイズのようなイメージが強く、本番試験のような問題はあまりでません。しかし、問題を解いて解説を読んでいくだけでサービスに関する知識を確実に身につけることができます。約7問で1セットとなっており、これが140セットほど(1000問以上)あります。全問解くためにはゴールドプランに入る必要があります。

最初の1週間で問題集を1周することを目指します。
全く解けなくても問題ありません。とりあえず最後まで解ききって、「1000問解いたぞ!」という自信をつけることが大事です。

私の場合は、出社前と昼休みの間(あわせて約2時間)に毎日約20セットの問題をスマホで解いてました。

2週目

問題集2周目を解きます。

2周目に入るとわかる問題が増えて1周目より解くのが楽になっていると思います。
全部解けた問題のセットがあれば番号をメモします。3週目はこれらを解く必要はありません。

20~30セット(200問)くらい解けるようになっていれば順調に知識が身についていると思います。

3週目

ここから知識補強フェーズに入ります。

1~2周目は問題を解ききるだけで精一杯だったと思うのですが、3周目はそんなに時間はかからないと思います。
問題の理解に時間をかけるため、わからない問題があったら、解説と合わせて「AWS サービス別資料のPDF」を読みます。

こちらはAWSの中の人が公式で出している資料なので、そこらの参考書よりも正確で詳細な内容が書いてあります。
Kinesis, ECS, WAFなどは問題集の解説だけだとよくわからないので、こちらの資料を呼んでおくと理解が深まります。

4-5週目

だいぶ知識が身についてきたと思うので、ここからはひたすら実践問題を解きます。

おすすめは【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集というUdemyの問題集です。模擬試験が6回分収録されており、力試しにもってこいの教材です。

本番試験と問題の傾向が非常に近く、ほぼ同じ問題が本番で5問くらい出ました。
ただ、難易度は本番よりも高いので、解けなくても落ち込む必要はありません(試験前日に解いて40%くらいでした...)。

1~5回分の試験を1日1回ずつ解き、わからなかった問題があれば、サービス別資料を片手に見直します。2週間で3周を目指してください。

また、問題集は頻繁に行われているUdemyのセール中に買いましょう。だいたい1500円くらいです。

6週目

最後の週は、WEB問題集とUdemy問題集で解けなかった問題をひたすら解き、苦手の穴を潰します。

そして試験前日になったら、Udemy問題集の残りの1回分を受けます。これが40%以上取れていれば、本番試験にはおそらく受かります。

合格してよかったこと

  • マネージャだけではなく、その他同僚の方々にも「こいつすげーな」という目でみられるようになった(錯覚資産のゲット)
  • インフラ周りの話に混ぜてもらえるようになった
  • AWSサービスを苦手意識なくアプリの機能に組み込めるようになった(SQS, Lambda, API Gatewayなど)

錯覚資産を得られただけでなく、様々なAWSサービスの用途を知ったことで、自分が関わっているサービスの問題解決の手段として使えるようになったのが一番大きかったです。
また、業務と両立して試験に合格したことで、「ちゃんと努力ができる奴」という印象が付き、いろんな仕事をまかせてもらえるようになりました。

おわりに

資格試験の勉強をすることは短期間で知識を身につけるのに有効な手段だと思います。また、SAA-C02は錯覚資産を得るには非常にコスパがよいので、みなさんにおすすめです。

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

AWS未経験から6週間でSAA-C02に合格する方法 結論:ハンズオンと公式模試は必要ない

はじめに

2020年9月にAWS認定ソリューションアーキテクトアソシエイト(SAA-C02)試験に合格しました。

勉強を開始した時点でAWS知識はゼロ、また、業務関連の知識習得も必要で試験勉強のみに集中するのは難しい状況でしたが、6週間のスキマ時間の勉强で余裕をもって合格することができました。

効率も再現性も高い勉強ができたので、今後受験される方の参考になればと思い記事にしました。

結論をいうと、試験合格のためだけならハンズオンも公式模試も必要ありません。

学習開始時の私のスペック

  • 営業からエンジニアに転職して2週間
  • 業務はモバイルアプリ開発(TypeScript, React Native)とバックエンド開発(PHP, Laravel)
  • AWS知識はゼロ(いーしーつー?なんやそれ...?レベル)

受験の動機

  • 錯覚資産を得るため
  • AWS業務に関わる足がかりにするため
  • 社内でAWS知ってるキャラのポジションを確立するため

未経験からエンジニアに転職した人ならわかると思うのですが、入社直後は自分だけにできる仕事はなく自己肯定感が下がりがちです。業務をしっかりこなすことでまわりからの信頼を徐々に得ていく、というのが定石なのですが、前職から年収が250万以上下がって生活が苦しかった私には、周りからの信頼を得ることと同時に、エンジニアとしての市場価値を早く上げて給料アップしたいという気持ちがありました。

社内にはAWSをバリバリ使える方よりも勉強中の方のほうが多く、「SAA-C02合格」を目標に掲げている方々も数人いらっしゃったので、この人達よりも先に試験に合格してしまえば、マネージャへのアピールになりインフラ業務に携われるだろうと思いました。

勉強の詳細

使った教材と勉強の流れをまとめました。

教材

勉強の流れ(6週間)

0週目

勉強を開始する前に試験に申込みます。

どんな試験にも言えることですが、試験日が決まっているだけで勉強のモチベーションがめちゃくちゃ変わってきます。
また、仕事しながらの試験勉強は長期戦になるほど辛くなってきます。1-2ヶ月くらいの短期決戦でいきましょう。

1週目

まずは知識のインプットから始めます。

インプットには「aws WEB問題集で学習しよう」を活用します。問題集というよりAWSサービスに関するクイズのようなイメージが強く、本番試験のような問題はあまりでません。しかし、問題を解いて解説を読んでいくだけでサービスに関する知識を確実に身につけることができます。約7問で1セットとなっており、これが140セットほど(1000問以上)あります。全問解くためにはゴールドプランに入る必要があります。

最初の1週間で問題集を1周することを目指します。
全く解けなくても問題ありません。とりあえず最後まで解ききって、「1000問解いたぞ!」という自信をつけることが大事です。

私の場合は、出社前と昼休みの間(あわせて約2時間)に毎日約20セットの問題をスマホで解いてました。

2週目

問題集2周目を解きます。

2周目に入るとわかる問題が増えて1周目より解くのが楽になっていると思います。
全部解けた問題のセットがあれば番号をメモします。3週目はこれらを解く必要はありません。

20~30セット(200問)くらい解けるようになっていれば順調に知識が身についていると思います。

3週目

ここから知識補強フェーズに入ります。

1~2周目は問題を解ききるだけで精一杯だったと思うのですが、3周目はそんなに時間はかからないと思います。
問題の理解に時間をかけるため、わからない問題があったら、解説と合わせて「AWS サービス別資料のPDF」を読みます。

こちらはAWSの中の人が公式で出している資料なので、そこらの参考書よりも正確で詳細な内容が書いてあります。
Kinesis, ECS, WAFなどは問題集の解説だけだとよくわからないので、こちらの資料を呼んでおくと理解が深まります。

4-5週目

だいぶ知識が身についてきたと思うので、ここからはひたすら実践問題を解きます。

おすすめは【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集というUdemyの問題集です。模擬試験が6回分収録されており、力試しにもってこいの教材です。

本番試験と問題の傾向が非常に近く、ほぼ同じ問題が本番で5問くらい出ました。
ただ、難易度は本番よりも高いので、解けなくても落ち込む必要はありません(試験前日に解いて40%くらいでした...)。

1~5回分の試験を1日1回ずつ解き、わからなかった問題があれば、サービス別資料を片手に見直します。2週間で3周を目指してください。

また、問題集は頻繁に行われているUdemyのセール中に買いましょう。だいたい1500円くらいです。

6週目

最後の週は、WEB問題集とUdemy問題集で解けなかった問題をひたすら解き、苦手の穴を潰します。

そして試験前日になったら、Udemy問題集の残りの1回分を受けます。これが40%以上取れていれば、本番試験にはおそらく受かります。

合格してよかったこと

  • マネージャだけではなく、その他同僚の方々にも「こいつすげーな」という目でみられるようになった(錯覚資産のゲット)
  • インフラ周りの話に混ぜてもらえるようになった
  • AWSサービスを苦手意識なくアプリの機能に組み込めるようになった(SQS, Lambda, API Gatewayなど)

錯覚資産を得られただけでなく、様々なAWSサービスの用途を知ったことで、自分が関わっているサービスの問題解決の手段として使えるようになったのが一番大きかったです。
また、業務と両立して試験に合格したことで、「ちゃんと努力ができる奴」という印象が付き、いろんな仕事をまかせてもらえるようになりました。

おわりに

資格試験の勉強をすることは短期間で知識を身につけるのに有効な手段だと思います。また、SAA-C02は錯覚資産を得るには非常にコスパがよいので、みなさんにおすすめです。

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

「S3とは」

S3とは

前回に「EBS、S3、EFS三者の違い」でAWSのストレージサービスを紹介しました。
今回はそのS3について、詳しく紹介させていただきます。

S3:Simple Storage Service (頭文字は三つのSなので、S3を名前にしています。)
ユーザーがデータを容量制限なく保存可能なマネージド型で提供されるオブジェクト型ストレージ。


?特徴:
・耐久性:99.999999999%。(11個9)
・データを暗号化可能

?データ保存形式
・バケット
 オブジェクトの保存場所。
 (命名ルール:全regionで使うため、名前がユニークな必要がある。)

・オブジェクト
 S3に格納されるファイルはURLが付与される。

・データサイズ
 OKB~5TBまで保存可能。


S3のデータ構造
s3_bucket.png

S3のストレージタイプとその特徴

S3 ストレージクラスのパフォーマンス.jpg

参照先:Amazon AWS Document↓


ストレージクラスのパフォーマンス

S3の暗号化


S3の暗号化は二つの方法があります。
・サーバーサイト暗号化(暗号化タイプ:SSE-S3,SSE-KMS,SSE-C)
・クライアントサイト暗号化(暗号化タイプ:AWS-KMS)

S3のその他の機能


・ライフサイクル管理
・バージョン管理
・バックアップ&復元

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

AWS覚書 - boto3を使ってIoT coreのエンドポイントを取得する -

IoT coreを使用するのに、クライアントからカスタムエンドポイントを取得する必要があるので、取得できるようになるまでの手順を覚書しておく。

必要なもののインストール

pythonへboto3と、AWSクライアント

boto3

pip3 install boto3

AWSクライアント

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-mac.html

キーセットの取得

まずはアクセスキーとシークレットーキーが必要

アカウントの IAM → アクセス管理 → ユーザー → アクセスキー と進む。
スクリーンショット 2021-02-13 12.21.02.png
アクセスキーを作成してシークレットキーを取得する(一度しか取得できないので紛失に注意する)。

AWSクライアントへのキーセットの登録

> aws configure --profile <プロファイル名(自由な名前でOK)>
AWS Access Key ID [None]: <取得したアクセスキー>
AWS Secret Access Key [None]: <取得したシークレットキー>
Default region name [None]: <デフォルトで使用したいリージョン、東京ならば「ap-northeast-1」>
Default output format [None]: json

プロファイルを作成したらプロファイルをデフォルト設定する

> set AWS_DEFAULT_PROFILE= <先ほど作成したプロファイル名>

ちゃんとキーセットが設定されているか確認する。

> aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************3LHQ shared-credentials-file    
secret_key     ****************vexf shared-credentials-file    
    region                us-east-2      config-file    ~/.aws/config

以下のファイルに、それっぽいのがあるか確認できる。

> cat ~/.aws/credentials

IoT coreのエンドポイントを確認

Iot core → 設定 と進むとみれる。
スクリーンショット 2021-02-13 12.40.04.png

クライアントからエンドポイントの取得

pythonから取得する。

> python
Python 3.8.2 (default, Apr 27 2020, 13:03:04) 
[Clang 10.0.0 (clang-1000.10.44.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import boto3
>>> client = boto3.client('iot', region_name='ap-northeast-1')
>>> endpoint_response = client.describe_endpoint(endpointType='iot:Data-ATS')
>>> print(endpoint_response)
{'ResponseMetadata': {'RequestId': '**************', 'HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Sat, 13 Feb 2021 03:42:30 GMT', 'content-type': 'application/json', 'content-length': '74', 'connection': 'keep-alive', 'x-amzn-requestid': '****************', 'access-control-allow-origin': '*', 'x-amz-apigw-id': '********', 'x-amzn-trace-id': 'Root=****************'}, 'RetryAttempts': 0}, 'endpointAddress': '<ここが実際に取得したいエンドポイントになる>'}

整形

{
    "ResponseMetadata": {
        "RequestId": "**************",
        "HTTPStatusCode": 200,
        "HTTPHeaders": {
            "date": "Sat, 13 Feb 2021 03:42:30 GMT",
            "content-type": "application/json",
            "content-length": "74",
            "connection": "keep-alive",
            "x-amzn-requestid": "****************",
            "access-control-allow-origin": "*",
            "x-amz-apigw-id": "********",
            "x-amzn-trace-id": "Root=****************"
        },
        "RetryAttempts": 0
    },
    "endpointAddress": "<ここが実際に取得したいエンドポイントになる>"
}

画面でみたエンドポイントと同じであるか確認する。

boto3.client の部分は、キーセット直接指定でも問題ない。

>>> client = boto3.client('iot', region_name='ap-northeast-1', aws_access_key_id='***', aws_secret_access_key='***')
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【SAA試験対策】S3のコストについて

S3のコストについて纏めました。
ポイントは以下の3つだけ。

ストレージ容量

 ・どのくらいの容量を保存しているか。
 ・データの利用頻度に応じて適切なストレージクラスを選択することでコストを抑えることができる。

  S3標準とGlacierって5倍も価格が違うようです。。
  アクセス頻度が少なくなったデータはライフサイクル管理でストレージクラスを変更するのが良い^^

データ転送量

 ・S3→インターネット外にデータを転送する時のみ有料。
 ・S3へのデータ転送インは無料。
 ・AWS同一リージョン内のサービス同士のデータ転送イン・アウトも無料。(※別リージョンの場合は有料)

リクエストとデータ取り出し

 ・GET/PUT/POST/LIST/COPYなどのリクエスト数に応じてコストが発生する。

 ・GET は安い
 ・PUT/POST/LIST/COPY はGETよりも高い
 ・DELETE は無料

補足

 AWS無料利用枠内であれば、S3 標準で 5 GB の Amazon S3 ストレージ、20,000 GET リクエスト、2,000 PUT、COPY、POST、あるいは LIST リクエスト、データ送信 15 GB を毎月、1 年間利用できるようです。

参考

 公式サイト Amazon S3 の料金

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

【初心者】AWS AutoScalingについて(ハンズオン③:オートスケーリングポリシーの作成)

はじめに

AWS AutoScaling・・EC2を処理負荷に合わせて、増やしたり減らしたりすることができる便利なサービス
公式サイト

こちらは前回の記事の続きとなっています。
【初心者】AWS AutoScalingについて(ハンズオン①:起動テンプレートの作成)
【初心者】AWS AutoScalingについて(ハンズオン②:オートスケーリンググループの作成)

オートスケーリングポリシーの種類

2021/02時点で3つのポリシーがあります。公式サイト
どのようにスケーリングさせたいかでポリシーを選択します。

■ターゲットポリシー
 特定のメトリクスのターゲット値に基づいて、グループの現在の容量を増減させる
 例:「CPU使用率60%と指定」(※数の調整はオートスケーリングが自動で実施)

■ステップポリシー
 複数段階でのインスタンスの追加、削除を設定し、
 例:「平均CPU使用率60%超えたら1台追加、80%超えたらもう1台追加」

■シンプルポリシー
 1 つのスケーリング調整値に基づいて、グループの現在の容量を増減させる
 例:「平均CPU使用率が80%超えたら、2台追加」

ハンズオン③:オートスケーリングポリシーの作成

前回作成したオートスケーリンググループにオートスケーリングポリシーを追加します。
今回はオートスケーリンググループで作成されたEC2のCPU使用率が70%超えたらEC2を1台追加、30%より小さくなったらEC2を1台削除するアラームを作成し、それに基づいてインスタンスの数を増減させるシンプルポリシーを実践したいと思います。

1.png

CloudWatchサービスより「アラーム」、「アラームの作成」を選択
2.png

「メトリクスの選択」を選択

3.png
4.png
5.png
今回対象とするメトリクスをAutoScalingグループのCPU使用率とするため、「EC2」「AutoScalingグループ別」「CPUUtilization」を選択し、「メトリクスの選択」を選択
6.png
まず、CPU使用率が70%超えた場合のアラームを作成します。

・条件:より大きい
・しきい値:70
・欠落データの処理:欠落データを不正(しきい値を超えている)として処理
※CPU使用率がいきなり上昇した場合、データが欠落する可能性があるため上記を選択しています。

7.png
アラーム状態になった場合に通知するSNSトピックの選択
「既存のSNSトピック」もしくは「新しいトピックの作成」を選択し、通知するメールアドレスを決定

8.png
アラーム名と説明(任意)を指定

・アラーム名:CPU-High

これでアラームが1つ作成されました。
同様の手順でCPU使用率が30%以下になったときのアラーム「CPU-Low」も作成します。

11.png
ここから作成したアラームをオートスケーリングポリシーに追加します。

事前に作成したAutoScalingグループを選択し、「自動スケーリング」より「ポリシーの追加」を選択
12.PNG

「CPU_high」アラームが発生した場合に、EC2を1台追加したいので、以下のように設定を行います。

・ポリシータイプ:シンプルなスケーリング
・スケーリングポリシー名:CPU_add
・CloudWatchアラーム:CPU_high
・アクションを実行:追加 1 キャパシティユニット

13.PNG「CPU_Low」アラームが発生した場合に、EC2を1台追削除したいので、以下のように設定を行います。

・ポリシータイプ:シンプルなスケーリング
・スケーリングポリシー名:CPU_delete
・CloudWatchアラーム:CPU_Low
・アクションを実行:削除 1 キャパシティユニット

以上で、オートスケーリングポリシーの設定は完了です。
実際に負荷をかけて、EC2の数が増減するのを確認したいと思います。

オートスケーリンググループで起動されたEC2に接続し、以下のコマンドでCPUに負荷をかけます。

yes >> /dev/null &

そのまま5分ほど待ちます…
※1プロセスだと負荷がかかりにくいので、同じコマンドを実行し、5プロセスぐらい起動させると早く負荷がかかります。

14.PNG

CPU_Highがアラーム状態となりました。
この時AutoScalingグループの「アクティビティ履歴」を確認すると...

15.PNG
EC2インスタンスが2→3台に増加したことが確認できます。
そのまま更に5分ほど待つと…

16.PNG
EC2インスタンスが3→4台に増加したことが確認できます。
そのまま5分ほど待っても上限で決めた4台以上になることはありませんでした。

次にEC2インスタンスが削除されるのを確認するために、負荷コマンドを実行したプロセスを停止します。
以下のコマンドでプロセスを停止することができます。

top 
(CPUに負荷をかけているプロセスIDを確認)
kill [プロセスID] 

そのまま5分、10分と待つと…
17.PNG
CPU_Lowがアラーム状態となりました。
この時AutoScalingグループの「アクティビティ履歴」を確認すると...

18.PNG
EC2インスタンスが4→3→2台に減少したことが確認できました。

ハンズオンは以上となります。

最後に

今回は3つの記事にわたって、「起動テンプレートの作成」「オートスケーリンググループの作成」「オートスケーリングポリシーの作成」を行いました。
慣れるまで設定するのが大変でしたが、一度作成すれば要領を掴むことができるので、実際に手を動かしてやってみることが大事ですね:hugging:

この記事はAWS初学者を導く体系的な動画学習サービス「AWS CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.com

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

【AWS】S3ストレージクラスまとめ

AWSのS3にはいくつか種類(クラス)があるので、

・何があるのか
・どんな特徴があるのか
・代表的な用途

をまとめてみます。

S3とは

そもそも、S3って何なんでしょうか。

Amazon Simple Storage Service は、インターネット用のストレージです。また、ウェブスケールのコンピューティングを開発者が簡単に利用できるよう設計されています。
Amazon S3 とは

AWS上のストレージサービスで、頭文字をとってS3と呼ばれているんですね。

そんなS3の特徴は以下の4つです。
・耐久性:99.999999999%(イレブンナイン)
・安価:月額1GB/約3円
・安定性:データは冗長化されて保存
・安全性:データを暗号化可能

ちなみに、アップロード可能な容量は1つのデータにつき5TBまでです。(デカすぎ)

補足
1オブジェクトのサイズが最大5TBで、1回のPUTオペレーションでアップ出来るオブジェクトのサイズが5GBとなります。
5GBを超える場合には、マルチパートアップロード(分割送信)を用いて並列してアップロードを行います。

S3のストレージクラス

S3には以下のストレージクラスが存在します。

・Standard(標準)
・Standard-IA(低頻度アクセス)
・One Zone-IA(1ゾーン低頻度アクセス)
・Glacier(アーカイブ)
・Glacier Deep Archive(アーカイブ)

それぞれの特徴をみていきます。

Standard

標準的なストレージクラスです。

複数のAZにまたがってデータを複製するため、耐久性が高い(99.999999999%)です。
遅延も少なく、スループットが高いので、幅広い用途に使用できます。

代表的な用途
・クラウドアプリケーション
・動的なウェブサイト
・コンテンツ配信
・モバイルやゲームのアプリケーション
・ビッグデータ分析

Standard-IA

アクセス頻度は低いけど、必要な時にすぐに取り出したいという用途で使用するストレージクラスです。

Standardとスペックは同様なのに安価です。
しかし、こちらはデータを取り出す際に料金がかかります。

代表的な用途
・長期保存
・バックアップ
・災害対策ファイルのデータストア

One Zone-IA

Standard-IAのAZが1つになったバージョンです。

Standard-IAは複数のAZにまたがってデータを保存しますが、
こちらは1つのAZ内にのみデータを保存するため、Standard-IAよりも20%ほど安価になります。

冗長性を気にしないようなデータの保存に向いています。

代表的な用途
・セカンダリバックアップのコピー

Glacier

セキュア・高耐久性・低価格の三拍子が揃ったストレージクラスです。
オンプレのストレージと同等か、それより低いコストでデータの保存が可能です。

しかし、データの読み出しには数分〜数時間かかるため、長期間のデータアーカイブ用途がメインとなります。

代表的な用途
・メディア資産の保存
・ヘルスケア情報のアーカイブ
・規制及びコンプライアンスのアーカイブ
・科学的データのストレージ
・デジタル保存

Glacier Deep Archive

S3で最安のストレージクラスです。

1年で1回か2回しかアクセスされないようなデータの長期保存に向いています。

Glacierに保存するものよりも、よりアクセス頻度が低いものを保存するイメージです。
その分、データの読み出しにはより長い時間(12時間以内)がかかります。

代表的な用途
・磁気テープの代替
・会計データ
・学籍情報

ストレージクラスの比較

それぞれの特徴をざっくり比較してみます。

Standard Standard-IA One Zone-IA Glacier Glacier Deep Archive
冗長性
読み出し料金 なし あり あり あり あり
読み出し時間

もっと詳しく知りたい方は、公式を参照してくださいな。
Amazon S3 ストレージクラス

Intelligent-Tiering

アクセス頻度ごとに自分でストレージクラス変えないといけないの!?めんどくさ!
と思った方もいるかと思います。

そんなことはありません。ちゃんといい感じのものが用意されています。

Intelligent Tieringは、それぞれのファイルへのアクセス頻度を計測して
OneZone-IAを除く上記4つのストレージクラスへ自動的にデータを振り分けてくれます。
(手動で振り分けを設定するライフサイクルポリシーというものもありますが、今回は割愛します。)

こちらを使用することで、コスト効率を最低化することができます。

デフォルトでは、以下のようにデータを振り分けます。(アーカイブアクセス有効化時)

・データをStandardへ保存
・30日連続でアクセスされなかったものはStandard-IAへ移動
・90日連続でアクセスされなかったものはGlacierへ移動
・上記+180日連続でアクセスされなかったものはGlacier Deep Archiveへ移動

また、下層のストレージクラスへ振り分けられたデータに再度アクセスがあった際には、
自動的に高頻度のアクセス階層へ移動してくれます。

例えば、Glacierに保存されているデータにアクセスがあった場合、
GlacierからStandardへ移動してくれるなど。

データをどのぐらいの頻度で使用するかわからない場合、Intelligent-Tieringを使用するのが良いでしょう。

代表的な用途
・ストレージアクセスパターンが不明なデータセットの保存
・データレイクのように予測できないアクセスパターンを持つデータセットの保存

まとめ

S3を使用する際は、データの使用頻度に応じて適切なストレージクラスを選択しましょう。

参考

Amazon S3 とは
Amazon S3 ストレージクラス

この記事はAWS初学者を導く体系的な動画学習サービス
「AWS CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.com

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

【初心者】AWS AutoScalingについて(ハンズオン②:オートスケーリンググループの作成)

はじめに

AWS AutoScaling・・EC2を処理負荷に合わせて、増やしたり減らしたりすることができる便利なサービス
公式サイト

こちらは前回の記事の続きとなっています。
【初心者】AWS AutoScalingについて(ハンズオン①:起動テンプレートの作成)

ハンズオン②:オートスケーリンググループの作成

前回作成した起動テンプレートをもとにオートスケーリンググループを作成します。
1.png
EC2より「オートスケーリンググループ」を選択し、「AutoScalingグループの作成」を選択。

2.png
 ・Auto Scaling グループ名:任意のグループ名
 ・起動テンプレート:前回作成したテンプレート
 ・バージョン:バージョン管理している場合はここでバージョンを指定

3.png
 ・インスタンスの購入オプション:費用を抑えたい場合はここでスポットインスタンスを選択することもできますが、今回は「起動テンプレートに準拠する」を選択
 ・ネットワーク VPC:インスタンスを起動するVPC
 ・ネットワーク サブネット:インスタンスを起動するサブネット

4.png
 ・ロードバランシング:アタッチするロードバランサを選択
 ・ヘルスチェック:EC2もしくはELBが使用可能な状態になっていることチェックするかどうかを選択※実際ユーザはEC2ではなく、ELBに接続をしに行きます。そのため、ここではELBを選択
 ・その他の設定:AutoScalingのメトリクスを有効にしたい場合は選択

5.png
 ・グループサイズ:インスタンスをどのくらい増やすか減らすかを決める
 ・スケーリンググポリシー:グループサイズの変更に合わせて、ルールを決める(例:インスタンスのCPU使用率が80%になったら、EC2 1台増加する)
  ここがスケーリングをするうえで、1番重要!ポリシーは後から追加することができるため、ここではなしを選択
 ・インスタンスのスケールイン保護:追加で作成されたインスタンスを削除したくない場合はチェック

6.png
 ・通知を追加:インスタンスの増減があった場合に、SNSトピックを使用してメール通知が必要な場合は追加

7.PNG
 ・タグを追加:必要に応じて、タグを追加

  最後に確認画面で値の設定を確認し、「AutoScalingグループを作成」を選択

8.PNG
 新しくAutoScalingグループが作成。
 と同時に...

9.PNG
 新しいEC2インスタンスが起動されたことも確認できます。
 ここで1台インスタンスを停止してみると...

11.png
 AutoScalingグループの「アクティビティ履歴」より1台インスタンスが停止されたこと、新しく1台インスタンスを立ち上げたことが確認できます。
 実際にインスタンスを確認すると...

12.PNG
 また新しいインスタンスが起動されていることを確認できます。
 このように事前に設定したインスタンスの数をAutoScalingが検知し、自動で調整を行ってくれます。

 オートスケーリンググループの作成はここまでになります。

最後に

次回の記事では、ハンズオン③:オートスケーリングポリシーの作成を行いたいと思います。

この記事はAWS初学者を導く体系的な動画学習サービス「AWS CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.com

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

【Laravel初心者】一覧表示の実装

Laravel初学者です。
オリジナルアプリを作成しているのでその過程を記事にしています。

理解が曖昧なところも多いため、ご指摘等ありましたらご連絡いただければ幸いです。

今回は一覧表示の実装について備忘録のため記録として残します。

環境

Version
PHP 7.4.14
Laravel 8.24.0
mysql 8.0.23
docker 20.10.2
docker-compose 1.27.4

ルーティング

routes/web.php
Route::get('/', [GameController::class, 'index']);

私の場合は/(ルート)を一覧表示として実装したかったので上記のようなルーティングになります。
/(ルート)にアクセスがあった時にGameControllerのindexアクションが動きますという意味です。

モデル

Models/Game.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Game extends Model
{
    use HasFactory;

    protected $table = "games";
    protected $fillable = [
        "id",
        "user_id",
        "name",
        "describe",
        "play_time",
        "players_minimum",
        "players_max",
        "image_path",
        "updated_at",
        "created_at",
    ];

    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

こちらは今回の一覧表示機能にだけ必要というものではないですが。
$fillableで指定して保存を許可します。
$fillableについてはこちらの記事が分かりやすかったです。
ありがとうございます。

コントローラー

app/Http/Controllers/GameController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Game;
use Illuminate\Support\Facades\Auth;
use Storage;

class GameController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */

    //下記がindexアクション
    public function index()
    {
        $games = Game::all();
        return view('game.index', compact('games'));
    }
}

$gamesGame::all();でGameモデルから全てのデータを取ってきて代入しています。全てとるので複数形の$gamesになってます。

プログラミング学び始めのとき、複数形なのか単数形なのか分からなかったんですよね。
allで全てとる=複数のデータ=つまり複数形なので普通に考えれば簡単ですよね。

その後return viewindexのviewを返す動きになってます。
compact('games')と記述することでview側で$gamesという変数が使えます。
逆にcompact書かないとエラーになりますので注意です。

compactについてはこちらの記事が分かりやすかったです。
ありがとうございます。

ビュー

resources/views/game/index.blade.php
<section class="page-section bg-light" id="portfolio">
            <div class="container">
                <div class="text-center">
                    <h2 class="section-heading text-uppercase">新着ボードゲーム</h2>
                    <h3 class="section-subheading text-muted">Lorem ipsum dolor sit amet consectetur.</h3>
                </div>

                <div class="row">
                    @foreach($games as $game)
                    @if($game->image_path)
                    <div class="col-lg-4 col-sm-6 mb-4">
                        <div class="portfolio-item" style="text-align:center">
                            <a class="portfolio-link" href="{{ route('game.show', $game->id) }}">
                                <img src="{{ $game->image_path }}" height="200" width="200">
                            </a>
                            <div class="portfolio-caption" style="margin-top:10px">
                                <div class="portfolio-caption-heading">{{ $game->name }}</div>
                                <div class="portfolio-caption-subheading text-muted">プレイ時間:{{ $game->play_time }}分</div>
                                <div class="portfolio-caption-subheading text-muted">人数:{{ $game->players_minimum }}~{{ $game->players_max }}人</div>
                            </div>
                        </div>
                    </div>
                    @endif
                    @endforeach
                </div>

            </div>
        </section>
resources/views/game/index.blade.php
@foreach($games as $game)
    //この中に処理を書く
@endforeach

上記のようにforeachで繰り返し処理をしています。
コントローラーがデータを$gamesに入れてviewに渡してくれているのでそれをforeachの中では$gameとして一つずつ取り出します。

つまり一つずつ呼び出すためには

resources/views/game/index.blade.php
{{ $game->name }}

上記のように$gamenameというように記述します。

こちらで一覧表示の実装は完了です。

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

MacでM5stack Core2 for AWS

0. はじめに

なんとなーく、スイッチサイエンスを徘徊していたら、
M5Stack Core2 for AWS - ESP32 IoT開発キットとかいう面白そうなデバイスを発見!
AWSを使ってIoTのお勉強ができるっぽい。
〜ポチ!〜2日後に着〜

そこそこハマりどころがあるので、メモがてら投稿

例によって初心者なので間違っていたらゴメンナサイ?
環境はMacOS Catalina 10.15.7

1. はじめはサラサラと

スイッチサイエンスの商品ページには詳細が英語しかないように書かれていますが、
日本語ページもあります! やったね

というわけで、上のページを見ながら進めていきました。
※ドキュメントはよくできているので、以降ハマったところを書いています

1-1. ドライバのインストール

macOS 10.9+を開くとMavericks以降はすでに組み込み済みとのこと。
念のために確認!

% kextstat | grep usb.serial
  186    1 0xffffff7f8470d000 0x6000     0x6000     com.apple.driver.usb.serial (6.0.0) 8D86815D-64E8-39C5-A879-263C5052B11B <61 21 6 5 3 1>

なんか出たから大丈夫っぽい。

1-2. Visual Studio Codeのインストール

ここから

1-3. PlatformIO のインストール

1.Visual Studio Codeを起動したら、Extensionsを開く
(左側の□が4つあるアイコンをクリックするかcommand+shift+x)
2.platformio ideを検索
3.青いinstallをクリック
スクリーンショット 2021-02-11 17.25.28.png

1-4. あとは

あとはドキュメント通り、
・スマホにESP RainMakerをインストール
・Githubからソースを持ってくる
・MacとM5StackをUSB接続
ここまでは迷うとこはないですな

2. ESP RainMaker Agent の実行

2-1. 第1のつまずき

ドキュメント通りに進めていって、
RainMaker Agent ファームウェアのビルドとアップロード
buildまでは普通に進みましたが、Upload & Monitorでエラー発生!
スクショ取り忘れましたが
/dev/cu.SLAB_USBtoUARTなんてないよ
みたいなエラーだったと。。。
というわけでterminalで

% ls /dev/cu.SLAB_USBtoUART
ls: /dev/cu.SLAB_USBtoUART: No such file or directory

たしかにない。。。
じゃあコレは?

% ls /dev/cu.*
/dev/cu.Bluetooth-Incoming-Port /dev/cu.usbserial-0225F023

どうも/dev/cu.usbserial-0225F023が正解っぽい
というわけで、platformio.iniファイルのupload_portを変更

platformio.ini
; PlatformIO Project Configuration File
;
;   Build options: build flags, source filter, extra scripting
;   Upload options: custom port, speed and extra flags
;   Library options: dependencies, extra library storages
;
; Please visit documentation for the other options and examples
; http://docs.platformio.org/page/projectconf.html

[env:core2foraws]
platform = espressif32@2.1.0
framework = espidf
board = esp32dev
;upload_port = /dev/cu.SLAB_USBtoUART
upload_port = /dev/cu.usbserial-0225F023

monitor_speed = 115200
board_build.partitions = partitions_4MB_sec.csv

board_build.embed_txtfiles = 
  components/esp_rainmaker/server_certs/mqtt_server.crt
  components/esp_rainmaker/server_certs/claim_service_server.crt
  components/esp_rainmaker/server_certs/ota_server.crt

もう一回buildしてからUpload & Monitor!

> Executing task: pio run --target upload --target monitor --environment core2foraws <

Processing core2foraws (platform: espressif32@2.1.0; framework: espidf; board: esp32dev)
-----------------------------------------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/esp32dev.html
PLATFORM: Espressif 32 (2.1.0) > Espressif ESP32 Dev Module
HARDWARE: ESP32 240MHz, 320KB RAM, 4MB Flash
DEBUG: Current (esp-prog) External (esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa)
PACKAGES: 
 - framework-espidf 3.40100.200827 (4.1.0) 
 - tool-cmake 3.16.4 
 - tool-esptoolpy 1.30000.201119 (3.0.0) 
 - tool-mkspiffs 2.230.0 (2.30) 
 - tool-ninja 1.9.0 
 - toolchain-esp32ulp 1.22851.191205 (2.28.51) 
 - toolchain-xtensa32 2.80200.200827 (8.2.0)
Reading CMake configuration...
LDF: Library Dependency Finder -> http://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 0 compatible libraries
Scanning dependencies...
No dependencies
Building in release mode
Retrieving maximum program size .pio/build/core2foraws/firmware.elf
Checking size .pio/build/core2foraws/firmware.elf
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM:   [===       ]  26.8% (used 87864 bytes from 327680 bytes)
Flash: [========= ]  95.0% (used 1555753 bytes from 1638400 bytes)
Configuring upload protocol...
AVAILABLE: esp-prog, espota, esptool, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa
CURRENT: upload_protocol = esptool
Looking for upload port...
Use manually specified: /dev/cu.usbserial-0225F023
Uploading .pio/build/core2foraws/firmware.bin
esptool.py v3.0
Serial port /dev/cu.usbserial-0225F023
Connecting.....
Chip is ESP32-D0WDQ6-V3 (revision 3)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 24:0a:c4:f9:9f:ac
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Auto-detected Flash size: 16MB
Flash params set to 0x0240
Compressed 26912 bytes to 16214...
Writing at 0x00001000... (100 %)
Wrote 26912 bytes (16214 compressed) at 0x00001000 in 0.4 seconds (effective 538.6 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 159...
Writing at 0x00008000... (100 %)
Wrote 3072 bytes (159 compressed) at 0x00008000 in 0.0 seconds (effective 1370.5 kbit/s)...
Hash of data verified.
Compressed 8192 bytes to 31...
Writing at 0x00016000... (100 %)
Wrote 8192 bytes (31 compressed) at 0x00016000 in 0.0 seconds (effective 4094.4 kbit/s)...
Hash of data verified.
Compressed 1555872 bytes to 889938...
Writing at 0x00020000... (1 %)
Writing at 0x00024000... (3 %)
Writing at 0x00028000... (5 %)
Writing at 0x0002c000... (7 %)
Writing at 0x00030000... (9 %)
Writing at 0x00034000... (10 %)
Writing at 0x00038000... (12 %)
Writing at 0x0003c000... (14 %)
Writing at 0x00040000... (16 %)
Writing at 0x00044000... (18 %)
Writing at 0x00048000... (20 %)
Writing at 0x0004c000... (21 %)
Writing at 0x00050000... (23 %)
Writing at 0x00054000... (25 %)
Writing at 0x00058000... (27 %)
Writing at 0x0005c000... (29 %)
Writing at 0x00060000... (30 %)
Writing at 0x00064000... (32 %)
Writing at 0x00068000... (34 %)
Writing at 0x0006c000... (36 %)
Writing at 0x00070000... (38 %)
Writing at 0x00074000... (40 %)
Writing at 0x00078000... (41 %)
Writing at 0x0007c000... (43 %)
Writing at 0x00080000... (45 %)
Writing at 0x00084000... (47 %)
Writing at 0x00088000... (49 %)
Writing at 0x0008c000... (50 %)
Writing at 0x00090000... (52 %)
Writing at 0x00094000... (54 %)
Writing at 0x00098000... (56 %)
Writing at 0x0009c000... (58 %)
Writing at 0x000a0000... (60 %)
Writing at 0x000a4000... (61 %)
Writing at 0x000a8000... (63 %)
Writing at 0x000ac000... (65 %)
Writing at 0x000b0000... (67 %)
Writing at 0x000b4000... (69 %)
Writing at 0x000b8000... (70 %)
Writing at 0x000bc000... (72 %)
Writing at 0x000c0000... (74 %)
Writing at 0x000c4000... (76 %)
Writing at 0x000c8000... (78 %)
Writing at 0x000cc000... (80 %)
Writing at 0x000d0000... (81 %)
Writing at 0x000d4000... (83 %)
Writing at 0x000d8000... (85 %)
Writing at 0x000dc000... (87 %)
Writing at 0x000e0000... (89 %)
Writing at 0x000e4000... (90 %)
Writing at 0x000e8000... (92 %)
Writing at 0x000ec000... (94 %)
Writing at 0x000f0000... (96 %)
Writing at 0x000f4000... (98 %)
Writing at 0x000f8000... (100 %)
Wrote 1555872 bytes (889938 compressed) at 0x00020000 in 22.2 seconds (effective 561.3 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
=============================================== [SUCCESS] Took 40.56 seconds ===============================================
--- Available filters and text transformations: colorize, debug, default, direct, esp32_exception_decoder, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at http://bit.ly/pio-monitor-filters
--- Miniterm on /dev/cu.usbserial-0225F023  115200,8,N,1 ---
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
␛[0;32mI (719) esp_image: segment 5: paddr=0x00185710 vaddr=0x40087fa4 size=0x16664 ( 91748) load␛[0m
␛[0;32mI (777) boot: Loaded app from partition at offset 0x20000␛[0m
␛[0;32mI (832) boot: Set actual ota_seq=1 in otadata[0]␛[0m
␛[0;32mI (832) boot: Disabling RNG early entropy source...␛[0m
␛[0;32mI (833) psram: This chip is ESP32-D0WD␛[0m
␛[0;32mI (837) spiram: Found 64MBit SPI RAM device␛[0m
␛[0;32mI (841) spiram: SPI RAM mode: flash 80m sram 80m␛[0m
␛[0;32mI (846) spiram: PSRAM initialized, cache is in low/high (2-core) mode.␛[0m
␛[0;32mI (854) cpu_start: Pro cpu up.␛[0m
␛[0;32mI (857) cpu_start: Application information:␛[0m
␛[0;32mI (862) cpu_start: Project name:     AWS_IoT_EduKit-Getting_Started␛[0m
␛[0;32mI (869) cpu_start: App version:      3c5aa62-dirty␛[0m
␛[0;32mI (875) cpu_start: Compile time:     Feb 12 2021 23:41:21␛[0m
␛[0;32mI (881) cpu_start: ELF file SHA256:  9747349fbca1eb77...␛[0m
␛[0;32mI (887) cpu_start: ESP-IDF:          3.40100.200827␛[0m
␛[0;32mI (892) cpu_start: Starting app cpu, entry point is 0x400830b0␛[0m
␛[0;32mI (0) cpu_start: App cpu up.␛[0m
␛[0;32mI (1396) spiram: SPI SRAM memory test OK␛[0m
␛[0;32mI (1396) heap_init: Initializing. RAM available for dynamic allocation:␛[0m
␛[0;32mI (1396) heap_init: At 3FFAFF10 len 000000F0 (0 KiB): DRAM␛[0m
␛[0;32mI (1402) heap_init: At 3FFB6388 len 00001C78 (7 KiB): DRAM␛[0m
␛[0;32mI (1408) heap_init: At 3FFB9A20 len 00004108 (16 KiB): DRAM␛[0m
␛[0;32mI (1415) heap_init: At 3FFBDB5C len 00000004 (0 KiB): DRAM␛[0m
␛[0;32mI (1421) heap_init: At 3FFD3298 len 0000CD68 (51 KiB): DRAM␛[0m
␛[0;32mI (1427) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM␛[0m
␛[0;32mI (1434) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM␛[0m
␛[0;32mI (1440) heap_init: At 4009E608 len 000019F8 (6 KiB): IRAM␛[0m
␛[0;32mI (1446) cpu_start: Pro cpu start user code␛[0m
␛[0;32mI (1451) spiram: Adding pool of 4096K of external SPI memory to heap allocator␛[0m
␛[0;32mI (1471) spi_flash: detected chip: generic␛[0m
␛[0;32mI (1472) spi_flash: flash io: qio␛[0m
␛[0;32mI (1472) cpu_start: Starting scheduler on PRO CPU.␛[0m
␛[0;32mI (0) cpu_start: Starting scheduler on APP CPU.␛[0m
␛[0;32mI (1481) spiram: Reserving pool of 32K of internal memory for DMA/internal allocations␛[0m
␛[0;32mI (1511) gpio: GPIO[39]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 1| Intr:3 ␛[0m
␛[0;32mI (1711) ILI9341: Initialization.␛[0m
␛[0;32mI (1911) ILI9341: Display orientation: LANDSCAPE␛[0m
␛[0;32mI (1911) ILI9341: 0x36 command value: 0x08␛[0m
I (2011) wifi:wifi driver task: 3ffd6044, prio:23, stack:6656, core=0
␛[0;32mI (2011) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE␛[0m
␛[0;32mI (2011) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE␛[0m
I (2211) wifi:wifi firmware version: 3ea4c76
I (2211) wifi:config NVS flash: enabled
I (2211) wifi:config nano formating: disabled
I (2211) wifi:Init dynamic tx buffer num: 32
I (2211) wifi:Init data frame dynamic rx buffer num: 16
I (2221) wifi:Init management frame dynamic rx buffer num: 16
I (2221) wifi:Init management short buffer num: 32
I (2231) wifi:Init static tx buffer num: 8
I (2231) wifi:Init static rx buffer size: 1600
I (2231) wifi:Init static rx buffer num: 4
I (2241) wifi:Init dynamic rx buffer num: 16
␛[0;32mI (2251) esp_claim: Initialising Assisted Claiming. This may take time.␛[0m
␛[0;33mW (2251) esp_claim: Generating the private key. This may take time.␛[0m
␛[0;32mI (67941) esp_rmaker_node: Node ID ----- 240AC4F99FAC␛[0m
␛[0;32mI (67941) display: configuring the house␛[0m
␛[0;32mI (67941) display: house configured␛[0m
␛[0;32mI (67951) display: lights off␛[0m
␛[0;32mI (69361) display: configuring the temperature␛[0m
␛[0;32mI (69361) display: temperature configured␛[0m
␛[0;32mI (69451) display: configuring the fan␛[0m
␛[0;32mI (69451) display: configured fan_object␛[0m
␛[0;32mI (69451) display: configured fan_strength_slider␛[0m
␛[0;32mI (69451) display: configured fan_sw1␛[0m
␛[0;32mI (69451) display: fan configured␛[0m
␛[0;32mI (69461) esp_rmaker_time_sync: Initializing SNTP. Using the SNTP server: pool.ntp.org␛[0m
␛[0;32mI (69471) esp_rmaker_core: Starting RainMaker Core Task␛[0m
␛[0;32mI (69481) esp_claim: Waiting for assisted claim to finish.␛[0m
␛[0;32mI (69481) wifi_prov_scheme_ble: BT memory released␛[0m
␛[0;32mI (69481) app_wifi: Starting provisioning␛[0m
␛[0;33mW (69501) phy_init: failed to load RF calibration data (0x1102), falling back to full calibration␛[0m
␛[0;32mI (69631) phy: phy_version: 4180, cb3948e, Sep 12 2019, 16:39:13, 0, 2␛[0m
I (69691) wifi:mode : sta (24:0a:c4:f9:9f:ac)
␛[0;32mI (69701) BTDM_INIT: BT controller compile version [219866f]␛[0m
␛[0;32mI (69701) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE␛[0m
␛[0;32mI (69881) protocomm_nimble: BLE Host Task Started␛[0m
␛[0;32mI (69891) wifi_prov_mgr: Provisioning started with service name : PROV_02167d ␛[0m
␛[0;32mI (69891) app_wifi: Provisioning started␛[0m
␛[0;32mI (69891) app_wifi: Scan this QR code from the phone app for Provisioning.␛[0m
GAP procedure initiated: advertise; disc_mode=2 adv_channel_map=0 own_addr_type=0 adv_filter_policy=0 adv_itvl_min=256 adv_itvl_max=256

  █▀▀▀▀▀█ ▄█ ▄▄ █▄▀ ▀▀██▀▀█ █▀▀▀▀▀█   
  █ ███ █ ▄█▀█ ▄ ▄▄▄▀ ▄▀▀▀▀ █ ███ █   
  █ ▀▀▀ █ ▄ █ ▀▄ ▄█ █▀ ▀█▀█ █ ▀▀▀ █   
  █▀████▀▄▀█▄█▀▀ █ ▀█▄▄▄█▄ █▀▄  ▄█    
    ▀█▀ ▀█▀█▄▀▄▀ ▀██▀▄▀▄▀▀ ▀▄▀▀ ▄▀▄   
   ▀ ▀▀ ▄▀▀▄▄▄█▀▀ ▀▄ ▀▄ ▄ ▄  ▄█▀ ▄▀▄   
  ▄▀▀█▄█▀▄  ▄▀▄█▀ ▄▀██▀  ▀▀▄▄█▀ ▄ ▄   
    ▀ ██▀▄▄▄▀ ▀▀▀▀█▀▄▄ ▄    ▄▀▀▀ █▄   
  █  ▀▄█▀▄▄   ▄ ▀█▀▀█▄ █▀▄█ █▀▄▄▄▄▄   
  ▀ ▀  ▀▀▀█▀█ ▀▀▀▀▄██▄ ▄ ▄█▀▀▀██▄▄█   
  █▀▀▀▀▀█ ▀███▀ █▀  ▄  ▄ ▄█ ▀ █ ▄▀    
  █ ███ █ █▀█▀█▀ ▀█▀█▄█▄█ █▀▀██▀▄▀    
  █ ▀▀▀ █ █ ▀  ▀ █▄▀█▄██ ▄█ ▀█▄▀█▀    
  ▀▀▀▀▀▀▀ ▀  ▀ ▀▀▀▀▀ ▀  ▀▀▀ ▀▀   ▀    

なんとかQRコード表示までうまくいったようです
アスキーアートでQRコードが出るとは思わなかったw
ターミナルでの表示なので確かに絵はでないか。。。
ちなみに上のQRコードは加工しています。

おそらくM5Stackの画面はこんな感じになっていると思います。
ファンのアイコンの下のスライドスイッチあたり触ると
「ぶーーん」とファンが回りますw
IMG_4707_2.png

2-2. あとは

あとはドキュメント通り、ESP RainMakerにデバイス登録すれば、
スマホ側からFanのOn/Offとか明るさ変えたりとかできると思います^^

3. ESP-IDF v4.2 のインストール

3-1. やっぱりココでもつまづく

ドキュメントにある下のコマンドを実行!!!

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install cmake ninja dfu-util
mkdir $HOME/esp
cd $HOME/esp
git clone -b release/v4.2 --recursive https://github.com/espressif/esp-idf.git
cd $HOME/esp/esp-idf
. $HOME/esp/esp-idf/install.sh
. $HOME/esp/esp-idf/export.sh

そしてエラー :cold_sweat:

〜〜〜いろいろ省略〜〜〜
Installing Python environment and packages
Creating a new Python environment in /Users/オレ/.espressif/python_env/idf4.2_py2.7_env
Installing virtualenv
/System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python: No module named pip
Traceback (most recent call last):
  File "/Users/オレ/esp/esp-idf/tools/idf_tools.py", line 1492, in <module>
    main(sys.argv[1:])
  File "/Users/オレ/esp/esp-idf/tools/idf_tools.py", line 1488, in main
    action_func(args)
  File "/Users/オレ/esp/esp-idf/tools/idf_tools.py", line 1205, in action_install_python_env
    stdout=sys.stdout, stderr=sys.stderr)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 190, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['/System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python', '-m', 'pip', 'install', '--user', 'virtualenv']' returned non-zero exit status 1

[プロセスが完了しました]

う〜ん、どうするかな。。。
。。。とりあえずpython3にしちゃおうw
コケているのは、
. $HOME/esp/esp-idf/install.sh
brewはインストールされている
ということで、、、

pyenvをインストール

% brew install pyenv
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> Updated Formulae
Updated 11 formulae.

==> Downloading https://homebrew.bintray.com/bottles/autoconf-2.69.catalina.bottle.4.tar.gz
==> Downloading from https://d29vzk4ow07wi7.cloudfront.net/ca510b350e941fb9395522a03f9d2fb5df276085d806ceead763acb95889a368?response-content-
######################################################################## 100.0%
==> Downloading https://homebrew.bintray.com/bottles/pkg-config-0.29.2_3.catalina.bottle.tar.gz
==> Downloading from https://d29vzk4ow07wi7.cloudfront.net/80f141e695f73bd058fd82e9f539dc67471666ff6800c5e280b5af7d3050f435?response-content-
######################################################################## 100.0%
==> Downloading https://homebrew.bintray.com/bottles/pyenv-1.2.22.catalina.bottle.tar.gz
==> Downloading from https://d29vzk4ow07wi7.cloudfront.net/b4f3038e29acde1d99579104ae100777621b9716fe797e7917dad1e9795d3473?response-content-
######################################################################## 100.0%
==> Installing dependencies for pyenv: autoconf and pkg-config
==> Installing pyenv dependency: autoconf
==> Pouring autoconf-2.69.catalina.bottle.4.tar.gz
?  /usr/local/Cellar/autoconf/2.69: 67 files, 3.0MB
==> Installing pyenv dependency: pkg-config
==> Pouring pkg-config-0.29.2_3.catalina.bottle.tar.gz
?  /usr/local/Cellar/pkg-config/0.29.2_3: 11 files, 623.8KB
==> Installing pyenv
==> Pouring pyenv-1.2.22.catalina.bottle.tar.gz
?  /usr/local/Cellar/pyenv/1.2.22: 721 files, 2.6MB

で、python3は何をいれようかなー
最新はいくつかな〜

% pyenv install --list
Available versions:
  2.1.3
  2.2.3
  2.3.7
〜〜〜中略〜〜〜
  3.9.0
  3.9-dev
  3.9.1
  3.10-dev
  activepython-2.7.14
  activepython-3.5.4
〜〜〜以下略〜〜〜

ということで3.9.1に決定!
早速インストール

% pyenv install 3.9.1
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.9.1.tar.xz...
-> https://www.python.org/ftp/python/3.9.1/Python-3.9.1.tar.xz
Installing Python-3.9.1...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Installed Python-3.9.1 to /Users/オレ/.pyenv/versions/3.9.1

無事インストール完了
ちゃんとpyenvでみられるか確認して、3.9.1を使うように。。。

% pyenv versions      
* system (set by /Users/オレ/.pyenv/version)
  3.9.1
% pyenv global 3.9.1
% pyenv rehash
% pyenv versions    
  system
* 3.9.1 (set by /Users/オレ/.pyenv/version)

で、.bash_profileに

.bash_profile
PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

shellがzshなので

% bash
The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.

bash-3.2$ cd
bash-3.2$ source .bash_profile 
bash-3.2$ python --version
Python 3.9.1

ということでpythonを実行すると3.9.1が起動するように〜
とりあえずpipも最新にしておこ

bash-3.2$ pip install --upgrade pip
Collecting pip
  Using cached pip-21.0.1-py3-none-any.whl (1.5 MB)
Installing collected packages: pip
  Attempting uninstall: pip
    Found existing installation: pip 20.2.3
    Uninstalling pip-20.2.3:
      Successfully uninstalled pip-20.2.3
Successfully installed pip-21.0.1

やっとこさ環境がそろったので
コケていたinstall.shを〜

bash-3.2$ cd $HOME/esp/esp-idf
bash-3.2$ . $HOME/esp/esp-idf/install.sh
Installing ESP-IDF tools
Installing tools: xtensa-esp32-elf, xtensa-esp32s2-elf, esp32ulp-elf, esp32s2ulp-elf, openocd-esp32
Skipping xtensa-esp32-elf@esp-2020r3-8.4.0 (already installed)
Skipping xtensa-esp32s2-elf@esp-2020r3-8.4.0 (already installed)
Skipping esp32ulp-elf@2.28.51-esp-20191205 (already installed)
Skipping esp32s2ulp-elf@2.28.51-esp-20191205 (already installed)
Skipping openocd-esp32@v0.10.0-esp32-20200709 (already installed)
Installing Python environment and packages
Creating a new Python environment in /Users/オレ/.espressif/python_env/idf4.2_py3.9_env
Installing virtualenv
Collecting virtualenv
  Downloading virtualenv-20.4.2-py2.py3-none-any.whl (7.2 MB)
     |████████████████████████████████| 7.2 MB 6.7 MB/s 
Collecting distlib<1,>=0.3.1
  Downloading distlib-0.3.1-py2.py3-none-any.whl (335 kB)
     |████████████████████████████████| 335 kB 30.1 MB/s 
Collecting six<2,>=1.9.0
  Downloading six-1.15.0-py2.py3-none-any.whl (10 kB)

〜〜〜省略〜〜〜

Successfully installed Flask-0.12.5 Flask-Compress-1.8.0 Flask-SocketIO-2.9.6 Jinja2-2.11.3 MarkupSafe-1.1.1 Pygments-2.7.4 Werkzeug-0.16.1 bidict-0.21.2 bitstring-3.1.7 brotli-1.0.9 cffi-1.14.5 click-7.1.2 cryptography-3.4.4 ecdsa-0.16.1 future-0.18.2 gdbgui-0.13.2.0 gevent-1.5.0 greenlet-1.0.0 itsdangerous-1.1.0 pycparser-2.20 pyelftools-0.27 pygdbmi-0.9.0.2 pyparsing-2.3.1 pyserial-3.5 python-engineio-4.0.0 python-socketio-5.0.4 reedsolo-1.5.4 six-1.15.0
All done! You can now run:

  . ./export.sh

インストールできた模様?
あとはexport.sh

bash-3.2$ . $HOME/esp/esp-idf/export.sh
Adding ESP-IDF tools to PATH...
Using Python interpreter in /Users/オレ/.espressif/python_env/idf4.2_py3.9_env/bin/python
Checking if Python packages are up to date...
Python requirements from /Users/オレ/esp/esp-idf/requirements.txt are satisfied.
Added the following directories to PATH:
  /Users/オレ/esp/esp-idf/components/esptool_py/esptool
  /Users/オレ/esp/esp-idf/components/espcoredump
  /Users/オレ/esp/esp-idf/components/partition_table
  /Users/オレ/esp/esp-idf/components/app_update
  /Users/オレ/.espressif/tools/xtensa-esp32-elf/esp-2020r3-8.4.0/xtensa-esp32-elf/bin
  /Users/オレ/.espressif/tools/xtensa-esp32s2-elf/esp-2020r3-8.4.0/xtensa-esp32s2-elf/bin
  /Users/オレ/.espressif/tools/esp32ulp-elf/2.28.51-esp-20191205/esp32ulp-elf-binutils/bin
  /Users/オレ/.espressif/tools/esp32s2ulp-elf/2.28.51-esp-20191205/esp32s2ulp-elf-binutils/bin
  /Users/オレ/.espressif/tools/openocd-esp32/v0.10.0-esp32-20200709/openocd-esp32/bin
  /Users/オレ/.espressif/python_env/idf4.2_py3.9_env/bin
  /Users/オレ/esp/esp-idf/tools
Done! You can now compile ESP-IDF projects.
Go to the project directory and run:

  idf.py build

bash-3.2$ idf
idf.py          idf_monitor.py  idf_size.py     idf_tools.py    
bash-3.2$ 

というわけで、idf.pyできるようになった!(っぽい)?

Qiita書くのに疲れたので次回につづく。。。?

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

AWSのコストが急に増加したので調査したらNATゲートウェイのデータ転送料金だった

ECS FargateでWebクローラーのバッチ処理を開発しているのですが、新規バッチのデプロイ後にAWSのコストが予想以上に上がったときのことを書きます。

結論としては、ネットワーク設定ミスによって、本来かける必要のないコストがかかってしまっていました。

個人的に気づきにくかったので、AWSのコスト見直しの一つの項目として、確認の手順を書きたいと思います。

気付いたきっかけ

AWS Cost Explorer のホーム画面で日別コストが見れるのですが、ある日から急にコストが高まっていることに気づきました。

スクリーンショット 2021-02-12 13.34.28.png

サービス別のコストを見ると、「EC2 その他」の項目が増加していることが分かりました。

スクリーンショット 2021-02-12 21.34.26.png

これだけだと原因が分かりにくかったのですが、
「使用タイプグループ」のフィルターでEC2関連を絞り込んでいくことで、原因となっているのが「EC2: NAT Gateway - Data Processed」であることが分かります。

スクリーンショット 2021-02-12 21.43.02.png

AWSのメニューから、VPC > NATゲートウェイ > モニタリング と遷移した画面でも、NATゲートウェイの通信量が増えていることが確認できます。

スクリーンショット 2021-01-31 17.29.01.png

NATゲートウェイ通信量増加の原因

ECS Fargate でサービスを作成したとき、ネットワーク設定のサブネットの項目にパブリックサブネットではなくプライベートサブネットが指定されていたことが原因でした。

そもそも プライベートサブネット ・ パブリックサブネット ・ NATゲートウェイ とは何か

プライベートサブネットはインターネットから接続できないセキュリティ性の高いネットワークで、
パブリックサブネットはインターネットから接続可能なネットワークです。

NATゲートウェイは、プライベートサブネットの内側から外部のインターネットに接続する際に、プライベートIPアドレスをグローバルIPアドレスに変換するためのものです。
※ NATは Network Address Translation の略です。
※ グローバルIPアドレスがないとインターネットに接続できません。

プライベートサブネットには、外部からのアクセスを遮断したいDBサーバなどを配置することが多いです。
今回問題となったバッチ処理のサーバは別に機密情報を持っているわけではないのでプライベートなネットワークに配置する必要はありませんでした。パブリックサブネットに配置することで、NATゲートウェイを通さなくなるので通信コストの増加をなくすことができました。

プライベートサブネットとパブリックサブネットの見分け方は、ルートテーブルの送信先「0.0.0.0/0」がインターネットゲートウェイにつながっているかでどうかで見分けます。
スクリーンショット 2021-02-13 1.56.48.png
ターゲットが「igw-」から始まるのがインターネットゲートウェイなので、この場合はパブリックサブネットです。

スクリーンショット 2021-02-13 1.57.19.png
「nat-」や「eni-」から始まる文字の場合は、プライベートサブネットとなります。

解決方法

ECS Fargateのサービスのネットワーク構成に設定していたサブネットの項目を、プライベートサブネットからパブリックサブネットに設定し直すことで解決しました。

※ ECSクラスターのサービスで実行している場合、ネットワーク構成がサービス作成時にしか設定できないため、サービスを新たに作り直す必要があります。

スクリーンショット 2021-02-12 22.30.39.png

ちょっとした設定の違いでコストが大きく変わることがあるので、びっくりして心臓に悪いですが今後もエンジニアとして頑張りたいと思います。

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

「VPCとは」

VPCとは

VPC:Virtual Private Cloud
日本語で直訳すると、仮想プライベートクラウド。
AWSクラウド内に論理的に分離されたセクションを作り、ユーザーが定義した仮想ネットワークを構築するサービスです。

VPCの特徴

・VPC内で多くのサブネットを構築可能。
・サブネットないでEC2インスタンスを使える。
・サブネットのルーティングテーブルを設定できる。
・VPCにInternet Gatewayを設定し、EC2はそれを利用してインターネットに繋げる。
・一つのVPCは複数のAZに跨がれる。
・一つのサブネットは一つのAZにしか使えない。
・Security Groupはステートフル。
 (ステートフル:行きの通信が許可されれば、戻りの通信も許可される。)
・Network Access Control Listはステートレス。
 (ステートレス:行き通信と戻り通信は別々で配置し、お互いに影響しない。)
・サブネットの設定可能範囲:/16~/28。

VPCの設定手順

1613146644857.jpg

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

RDS for Oracle にEC2から接続する

はじめに

RDS for Oracleのデータベースに接続を試みました。
すっと接続できなかったので備忘のためのメモと役に立ったリンクを記載。

背景

社内の踏み台サーバ(Windows Server)からパブリックサブネットに配置したRDS for Oracleに接続を試みたが、なぜか接続できないので色々実施。

とりあえず接続できればよかったので、踏み台→EC2→RDSと間にEC2をはさんで接続を試行。
EC2には問題なくログインできたので、踏み台→AWSのネットワーク的には問題なかったはず。
EC2とRDSは同じVPCのパブリックサブネットに配置。

EC2にSSH接続し、以下のリンクを参照し順番に実行。
必要な部分を置き換えて最終的に無事接続できた。
EC2にOracle ClientをインストールしてRDS(Oracle)に接続する
https://zatoima.github.io/oracle-ec2-oracleclient-install.html

上記リンク良いところ

他の「RDS sqlplus 接続」系の記事もたくさん見たが、「圧縮ファイルをEC2にアップする」などの手順があったり手間が多かった。
この記事だと、curlとyumで解決するので、怠惰な私にはありがたかった。
→EC2がインターネット出られる状態になっていれば問題なく実施できる。
自分が記事を書く時も、なるべくストレスなく完了できる手順書けるよう意識したい。

参考

EC2からSQLPLUSでRDSを接続する設定
https://www.flyenginer.com/low/low_db/ec2%E3%81%8B%E3%82%89sqlplus%E3%81%A7rds%E3%82%92%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B%E8%A8%AD%E5%AE%9A.html#toc7

Oracle DB インスタンスへの接続
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_ConnectToOracleInstance.html

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

AWS S3 CSSが反映されないとき

初めに

s3にboto3を使ってindex.html, main.js, style.cssをアップロードした。URLを開くとJavascriptが動いていることがわかった。しかしstyle.cssが反映されていなかった。

image.png

メタデータ編集

手順1
style.cssをクリックし、オブジェクトアクションをクリック

image.png

手順2
メタデータの編集をクリック

image.png

手順3
以下の"値"が"text/html"になっているので、"text/css"に編集する

image.png

編集後

image.png

手順4

オレンジ色のメタデータの編集ボタンを押す

image.png

これで反映される!!!
と思いきや反映されませんでした。
なぜ!!!

キャッシュの削除

キャッシュを削除すると反映された・・・
(・∀・)ウン!!
設定しなおした後は必ずキャッシュ削除
以下の記事を参考にした

https://hodalog.com/httpd-enablesendfile-off/

boto3

upload.py
import boto3


def get_content_type_dict():
    content_dict = {'html': 'text/html',
                    'css': 'text/css',
                    'js': 'text/javascript',
                    'jpeg': 'image/jpeg',
                    'png': 'image/png',
                    'csv': 'text/csv',
                    'json': 'application/json',
                    'pdf': 'application/pdf'}
    return content_dict


def upload(up_file, bucket, object_name, credentials):
    session = boto3.Session(aws_access_key_id=credentials[0],
                            aws_secret_access_key=credentials[1],
                            aws_session_token=credentials[2])
    s3_client = session.client('s3')
    type_dict = get_content_type_dict()
    content_type = type_dict[os.path.splitext(object_name)[1].strip('.')]
    try:
        s3_client.upload_file(up_file, bucket, object_name,
                              ExtraArgs={'ContentType': content_type,
                                         'ACL': 'public-read'})

こんな感じで拡張子に応じてアップするときメタデータを設定すると楽かも
Content-Typeは以下の記事を参考にした
https://qiita.com/AkihiroTakamura/items/b93fbe511465f52bffaa

ExtraArgsなるものの存在は以下の記事が参考になった
https://qiita.com/jansnap/items/ecad5f20659cf138419b

疑問

main.jsはメタデータがtext/htmlでも動くこと

参考文献

ローカル環境でCSSが反映されない時に見直すべきhttpdの設定
https://hodalog.com/httpd-enablesendfile-off/

Content-Typeの一覧
https://qiita.com/AkihiroTakamura/items/b93fbe511465f52bffaa

boto3でS3にアップロードした画像が、ブラウザで表示するとダウンロードされてしまう時
https://hack-le.com/boto3-s3-browser/

Python+boto3でS3に画像をアップロードして公開する
https://qiita.com/jansnap/items/ecad5f20659cf138419b

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

【初心者】AWS Key Management Service (AWS KMS) を使ってみる

1. 目的

  • AWSのセキュリティ関連サービスの復習をしている。AWS KMSについて、暗号鍵の登録や、ファイルの暗号化・復号といった基本的な処理を行い、動作イメージを把握する。

2. AWS KMSとは(自分の理解)

  • データを暗号化するための鍵の管理を行ってくれるサービス。暗号鍵をAWSの責任範囲において保管したり、更新したりしてくれる。

3. やったこと

  • CMK(カスタマーマスターキー) を作成する。
  • CMKに紐づくデータキーを作成する。
  • データキーで自分のファイルを暗号化する。
  • (暗号化されたデータキー及び暗号化されたファイルを残し、元のファイルを削除する。)
  • 暗号化されたデータキーを復号し、復号したデータキーを用いて暗号化されたファイルも復号する。

kmsの図.png

4. 予習

先人のまとめを読んで勉強する。

5. 実施手順

5.1 CMK(カスタマーマスターキー)の作成

  • まずはマネージメントコンソールにて、KMSでの暗号化処理を行う際のベースとなる、CMK(カスタマーマスターキー)を作成する。
  • KMSのメニューから「カスタマー管理型のキー」を開き、「キーの作成」を選択する。

kms01a.png

  • キーのタイプを「対称」、キーマテリアルオリジンを「KMS」とする。※タイプを「対称」とすることでCMKがAES 265bitのものになる。また、オリジンを「KMS」とすることで、KMSのサービス用の領域の中に、AWSが生成し管理するCMKが作成される。

kms02a.png

  • エイリアス(名前) を 「mksamba-masterkey」とする。

kms03a.png

  • キー管理者を追加する。今回はIAMユーザ(自分)を指定。キー管理者はキーの有効・無効化、更新、削除が可能。

kms04a.png

  • キーの使用許可者を追加する。今回はIAMユーザ(自分)を指定。キーの使用許可者は、キーを用いた暗号化、復号の処理を行うことが可能。

kms05a.png

  • キーポリシーの内容を確認する。前の手順で追加したキー管理者、キー使用許可者とは別に、初期設定値として、自AWSアカウントのIAMユーザでKMSへのアクセス権があるユーザに対しては全ての操作が許可されている。

kms06a.png

  • 作成したCMK(mksamba-masterkey)が表示されていることを確認する。メニューから有効化、無効化、削除のスケジューリングが可能。作成したCMKの中身は見ることができない。

kms08a.png

5.2 データキーの作成

  • CMKに紐づくデータキーを作成する。CMK自体を用いてデータを直接暗号化することもできるが、通常は実際に実データの暗号化処理を行うためのデータキーを発行して、それを用いて暗号化を行う。
  • ここからはCLIを用いて操作を行う。
# AWS CLIバージョンの確認
[ec2-user@ip-10-0-0-126 ~]$ aws --version
aws-cli/2.1.24 Python/3.7.3 Linux/4.14.214-160.339.amzn2.x86_64 exe/x86_64.amzn.2 prompt/off

# KMSのAPI(GenerateDatakey)を用いて、CMKに紐づくデータキーを作成
[ec2-user@ip-10-0-0-126 ~]$ aws kms generate-data-key --key-id arn:[mksamba-masterkeyのARN] --key-spec AES_256
{
    "CiphertextBlob": "[encrypted-datakey-string]",
    "Plaintext": "[plain-datakey-string]",
    "KeyId": "arn:aws:kms:ap-northeast-1:xxxxxxxxxxxx:key/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
  • "Plaintext"がデータキーそのもの、"CiphertextBlob"がCMKにより暗号化されて、かつbase64エンコードされたデータキーとなる。
  • "Plaintext"は、文字列をそのままコピペして、ファイル"plain-datakey"として保存する。
  • "CiphertextBlob"は、文字列をコピペして、base64デコードして、ファイル"encrypted-datakey"として保存する。
[ec2-user@ip-10-0-0-126 ~]$ echo [plain-datakey-string] > plain-datakey
[ec2-user@ip-10-0-0-126 ~]$ echo [encrypted-datakey-string] | base64 --decode > encrypted-datakey

5.3 ファイルの暗号化

  • 作成したデータキーを用いてファイルの暗号化を行う。
# 暗号化したいファイルの確認
[ec2-user@ip-10-0-0-126 ~]$ cat plain-document
休みがほしい。温泉に行きたい。

# データキーを用いて暗号化する。
# 元ファイル"plain-document"を、暗号鍵"plain-datakey"を用いてaes-256-cbcモードで暗号化して、ファイル"encrypted-document"として保存する。
[ec2-user@ip-10-0-0-126 ~]$ openssl aes-256-cbc -e -in plain-document -out encrypted-document -pass file:plain-datakey

# 暗号化されていることの確認
[ec2-user@ip-10-0-0-126 ~]$ cat encrypted-document
縒唳9楳H??合й偉(碁Ra@?肄?;X・^

  • 暗号化処理が終わった後、本来は安全のため、元ファイル"plain-document"、及び暗号化されていないデータキー"plain-datakey"を削除する必要がある。今回は復号後の動作確認のためそのままにしておくが、復号時はこれらのファイルが存在しない前提で復号処理を行う。
  • データキーを用いて暗号化する仕組みが「Envelope Encryption」と呼ばれている。今回のケースだと、暗号化されたデータキー"encrypted-datakey" が封筒(Envelope)で、暗号化されたファイル"encrypted-document"が便箋で、便箋に書かれた内容が封筒に入っていて外からは読めないイメージととらえた。

5.4 ファイルの復号

  • 先の手順で暗号化したファイルを復号する。
# KMSのAPI(Decrypt)を用いて、まず暗号化されたデータキーを復号する。
[ec2-user@ip-10-0-0-126 ~]$ aws kms decrypt --ciphertext-blob fileb://encrypted-datakey --output text --query Plaintext > decrypted-datakey

# データキーを作成した時に入手した、暗号化前のデータキーと比較し、データが一致することを確認する。
[ec2-user@ip-10-0-0-126 ~]$ diff plain-datakey decrypted-datakey
[ec2-user@ip-10-0-0-126 ~]$

# 復号後のデータキーを用いて、暗号化したファイルを復号する。元通りになっていることを確認する。
[ec2-user@ip-10-0-0-126 ~]$ openssl aes-256-cbc -d -in encrypted-document -pass file:decrypted-datakey
休みがほしい。温泉に行きたい。
  • この後、復号後のデータキーを削除して復号処理全体が完了となる。
  • decryptの際に、CMKのKeyIDを指定しなくても大丈夫なのか疑問に思ったが、aws kms cli の help 内の記載によると、CMKがsymmetricの場合にはCMKのKeyIDを指定することは必須ではなく、metadataを用いて適切なCMKが自動的に選択されるとのこと。

6. 所感

  • 一応、原理としてはどのような仕組みになっているのかを確認することができた。S3やRDSなどのデータを暗号化する際にどのように応用されているのかなどはまた確認してみたい。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む