AWS」カテゴリーアーカイブ

AWS Lambda 入門~おすすめ本5冊の紹介~

概要〜サーバレス基礎からAmplifyを使った本格開発までのおすすめ書籍〜

最近、AWS Lambdaの本増えてきましたよね。ということで今回はLambdaのおすすめ本の紹介です。

基礎編から本格的な専門書、アーキテクト、実際にAmplifyを使った開発と徐々にレベルアップする内容になっているのでLambdaを学びたい人は一つずつ読んでいってみてください。

Lambdaおすすめ本 5冊

今回紹介するAWS Lambdaのおすすめ本の一覧です。
忙しい方はここだけ確認してください。

基礎から学ぶ サーバーレス開発

基礎から学ぶ サーバーレス開発

まずは基本編です。Lambdaというかサーバレスとは?という導入編です。サーバレスとはどういうものか丁寧に書かれています。まずはサーバでの開発と比較してサーバレスにはどういったメリットデメリットがあるのかこの本で学びましょう。

目次

  • CHAPTER 01 サーバーレスとは
    • 1 サーバーレスの概要
    • 2 サーバーレスが注目された要因と新たなる課題
    • 3 サーバーレスのメリット・デメリット
  • CHAPTER 02 サーバーレス開発でよく使うサービス
    • 4 AWS Lambda
    • 5 Amazon API Gateway
    • 6 Amazon Aurora Serverless
    • 7 Amazon CloudWatch
    • 8 Amazon Simple Queue Service (Amazon SQS)
    • 9 AWS CodeCommit
    • 10 AWS CodePipeline
    • 11 AWS CodeBuild
    • 12 AWS CodeDeploy
    • 13 Amazon Simple Storage Service (Amazon S3)
    • 14 AWS Step Functions
    • 15 Amazon DynamoDB
    • 16 AWS Cloud9
    • 17 AWS X-Ray
  • CHAPTER 03 サーバーレスアプリケーションの構築
    • 18 フレームワーク
    • 19 CI/CD
    • 20 AWSにおけるCI/CD
    • 21 デプロイ手法
    • 22 トラフィックシフト
    • 23 昇格
  • CHAPTER 04 サーバーレスの運用監視
    • 24 サーバーレスのコスト
    • 25 サーバーレスにおける監視
  • CHAPTER 05 サーバーレス開発におけるセキュリティ
    • 26 サーバーレス開発におけるセキュリティの考え方
    • 27 Lambda@Edgeの利用
  • CHAPTER 06 サーバーレスの構築例
    • 28 完全サーバーレスでのWebページ構築事案
    • 29 完全サーバーレスでのWebページのバッチ部分
    • 30 APIバックエンドにAmazon RDSを用いた事例および2019年のアップデートについて
    • 31 サーバーレスで作る在宅勤務中の勤務時間登録システム
    • 32 AWS LambdaをAlexaのエンドポイントとして使う事例
  • CHAPTER 07 サーバーレスの失敗談と問題解決
    • 33 失敗談①~Amazon RDSを起動させ続けた
    • 34 失敗談②~AWS Lambda でスロットリングが発生してしまった
    • 35 SPA+サーバーレスで再読み込みをするとAccessDeniedになってしまう問題の解決方法

AWSではじめる クラウド開発入門

AWSではじめる クラウド開発入門

東大の人気授業が書籍化された内容です。Lambdaに限らずクラウド開発入門という位置付けなのでいろんな開発内容が書かれていて、クラウドでこうやって開発するんだとわかる内容になってます。最後の方は、かなり実践的で勉強になります。

目次

  • Chapter 1 はじめに
    • 1-1 本書の目的内容
    • 1-2 本書のフィロソフィー
    • 1-3 AWS アカウント
    • 1-4 環境構築
    • 1-5 前提知識
    • 1-6 本書で使用する表記について
  • Chapter 2 クラウド概論
    • 2-1 クラウドとは?
    • 2-2 なぜクラウドを使うのか?
  • Chapter 3 AWS入門
    • 3-1 AWSとは?
    • 3-2 AWSの機能・サービス
    • 3-3 Region と Availability Zone
    • 3-4 AWSでのクラウド開発
    • 3-5 CloudFormationとAWS CDK
  • Chapter 4 Hands-on #1:初めてのEC2インスタンスを起動する
    • 4-1 準備
    • 4-2 SSH
    • 4-3 アプリケーションの説明
    • 4-4 プログラムを実行する
    • 4-5 小括
  • Chapter 5 Hands-on #2: AWS でディープラーニングを実践
    • 5-1 なぜ機械学習をクラウドで行うのか?
    • 5-2 GPU による深層学習の高速化
    • 5-3 準備
    • 5-4 アプリケーションの説明
    • 5-5 スタックのデプロイ
    • 5-6 ログイン
    • 5-7 Jupyter Notebook の起動
    • 5-8 PyTorch はじめの一歩
    • 5-9 実践ディープラーニング! MNIST手書き数字認識タスク
    • 5-10 スタックの削除
  • Chapter 6 Docker 入門
    • 6-1 クラウドシステムの構築に向けて
    • 6-2 機械学習の大規模化
    • 6-3 Docker とは
    • 6-4 Docker チュートリアル
    • 6-5 Elastic Container Service (ECS)
  • Chapter 7 Hands-on #3 : AWS で自動質問回答ボットを走らせる
    • 7-1 Fargate
    • 7-2 準備
    • 7-3 Transformer を用いた question-answering プログラム
    • 7-4 アプリケーションの説明
    • 7-5 スタックのデプロイ
    • 7-6 タスクの実行
    • 7-7 タスクの同時実行
    • 7-8 スタックの削除
  • Chapter 8 Hands-on #4: AWS Batch を使って機械学習のハイパーパラメータサーチを並列化する
    • 8-1 クラウドを用いた機械学習モデルの最適化
    • 8-2 AWS Batch
    • 8-3 準備
    • 8-4 MNIST 手書き文字認識(再訪)
    • 8-5 アプリケーションの説明
    • 8-6 スタックのデプロイ
    • 8-7 Docker image を ECR に配置する
    • 8-8 単一のジョブを実行する
    • 8-9 並列に複数の Job を実行する
    • 8-10 スタックの削除
    • 8-11 クラウドを用いた機械学習アプリケーションの開発とデバッグ
    • 8-12 小括
  • Chapter 9 ウェブサービスの作り方
    • 9-1 個人のためのクラウドからみんなのためのクラウドへ
    • 9-2 ウェブサービスの仕組み Twitter を例に
    • 9-3 REST API
    • 9-4 Twitter API
  • Chapter 10 Serverless architecture
    • 10-1 Serverful クラウド (従来型)
    • 10-2 Serverless クラウドへ
    • 10-3 サーバーレスクラウドを構成するコンポーネント
  • Chapter 11 Hands-on #5: サーバーレス入門
    • 11-1 Lambda ハンズオン
    • 11-2 DynamoDB ハンズオン
    • 11-3 S3 ハンズオン
  • Chapter 12 Hands-on #6: Bashoutter
    • 12-1 準備
    • 12-2 アプリケーションの説明
    • 12-3 アプリケーションのデプロイ
    • 12-4 API リクエストを送信する
    • 12-5 大量のAPIリクエストをシミュレートする
    • 12-6 Bashoutter GUI を動かしてみる
    • 12-7 アプリケーションの削除
    • 12-8 小括
  • Chapter 13 Hands-on #7: boto3 道場
    • 13-1 boto3 の基本
    • 13-2 S3 道場
    • 13-3 DynamoDB 道場
    • 13-4 小括
  • Chapter 14 Hands-on #8: シン・Bashoutter
    • 14-1 シン・Bashoutter プロジェクトの概要
    • 14-2 STEP1:ドメインの設定とCloudFront の配置
    • 14-3 STEP2:Cognito によるユーザー認証の追加
  • Chapter 15 Hands-on #9: 深層学習を用いたアート自動生成アプリケーション
    • 15-1 Neural Art Canvas プロジェクト
    • 15-2 Neural style transfer
    • 15-3 ローカルで Neural style transfer を実行
    • 15-4 Step Functions
    • 15-5 Lambda layers
    • 15-6 アプリケーションの説明
    • 15-7 アプリケーションのデプロイ
    • 15-8 画像の生成 (コマンドラインから)
    • 15-9 画像の生成 (GUIから)
    • 15-10 アプリケーションの削除
  • Appendix 環境構築
    • A-1 本書で必要な計算機環境
    • A-2 AWS アカウントの取得
    • A-3 AWS のシークレットキーの作成
    • A-4 AWS CLI のインストール
    • A-5 AWS CDKのインストール
    • A-6 WSL のインストール
    • A-7 Docker のインストール
    • A-8 Python venv クイックガイド
    • A-9 ハンズオン実行用の Docker image の使い方

AWS Lambda実践ガイド 第2版 impress top gearシリーズ

AWS Lambda実践ガイド 第2版

ここからがLambdaの本格化書籍です。まずはLambdaの専門書といったらこれという一冊です。人気本で第二版も発売されてます。Lambdaの基礎からSAMを使った本格化開発まで記載されている良書です。Lambdaの専門書としてまずはこの本をおさえた方が良い内容になってます。

基本を抑えつつ現場で役に立つバージョン管理やエイリアスといった運用面の記載や、コールドスタートやコネクションなど現場で知っておかなければならない制限事項についても書かれており、本当にLambdaと言ったらこれという良書だと思います。

目次

  • 第1章 Lambda で実現するサーバーレスシステム
  • 第2章 Lambda 事始め
  • 第3章 Lambda の実行環境とイベント
  • 第4章 Lambda の開発環境と SAM
  • 第5章 S3 のイベント処理
  • 第6章 API Gateway、DynamoDB、SES との連携
  • 第7章 SQS やSNS を使った連携

AWSによるサーバーレスアーキテクチャ

AWSによるサーバーレスアーキテクチャ

アーキテクト部分からの一冊です。サーバレスアーキテクチャの本ということですが、Lambdaの解説書になっているのでLambdaの専門書という一面もあります。基礎からアーキテクトまで書かれていて参考になります。

目次

  • 第1部 導入
    • 第1章 サーバーレスの世界へ
      • 1.1 ここに至るまでの流れ
      • 1.2 サーバーレスアーキテクチャの原則
      • 1.3 サーバーからサーバーレスへの乗り換え
      • 1.4 サーバーレスの長所と短所
      • 1.5 まとめ
    • 第2章 アーキテクチャとパターン
      • 2.1 ユースケース
      • 2.2 アーキテクチャ
      • 2.3 パターン
      • 2.4 まとめ
    • 第3章 サーバーレスアプリケーションの構築
      • 3.1 24-Hour Video
      • 3.2 Amazon SNS の設定
      • 3.3 動画ファイルのアクセス権限の設定
      • 3.4 メタデータの生成
      • 3.5 仕上げ
      • 3.6 演習問題
      • 3.7 まとめ
    • 第4章 クラウドの設定
      • 4.1 セキュリティモデルとID管理
      • 4.2 ログとアラート
      • 4.3 料金
      • 4.4 演習問題
      • 4.5 まとめ
  • 第2部 コア機能
    • 第5章 認証と認可
      • 5.1 サーバーレス環境における認証
      • 5.2 24-Hour Videoへの認証の追加
      • 5.3 AWS との統合
      • 5.4 委任 トークン
      • 5.5 演習問題
      • 5.6 まとめ
    • 第6章 オーケストレーターとしての AWS Lambda
      • 6.1 AWS Lambdaの内部
      • 6.2 プログラミングモデル
      • 6.3 バージョニング、エイリアス、環境変数
      • 6.4 CLI の使い方
      • 6.5 AWS Lambdaのパターン
      • 6.6 Lambda関数のテスト
      • 6.7 演習問題
      • 6.8 まとめ
    • 第7章 Amazon API Gateway
      • 7.1 インターフェイスとしてのAmazon API Gateway
      • 7.2 Amazon API Gateway の操作
      • 7.3 ゲートウェイの最適化
      • 7.4 ステージとバージョン
      • 7.5 演習問題
      • 7.6 まとめ
  • 第3部 アーキテクチャの拡張
    • 第8章 ストレージ
      • 8.1 賢いストレージ
      • 8.2 セキュアなアップロード
      • 8.3 ファイルへのアクセス制限
      • 8.4 演習問題
      • 8.5 まとめ
    • 第9章 データベース
      • 9.1 Firebase 入門
      • 9.2 24-Hour VideoへのFirebase の追加
      • 9.3 ファイルへのアクセスの保護
      • 9.4 演習問題
      • 9.5 まとめ
    • 第10章 仕上げの学習
      • 10.1 デプロイとフレームワーク
      • 10.2 よりよいマイクロサービスのために
      • 10.3 AWS Step Functions
      • 10.4 AWS Marketplaceが開くビジネスチャンス
      • 10.5 これからの展開のために
  • 付録A サーバーレスアーキテクチャのためのサービス
    • A.1 Amazon API Gateway
    • A.2 Amazon SNS (Simple Notification Service)
    • A.3 Amazon 53 (Simple Storage Service)
    • A.4 Amazon SQS (Simple Queue Service)
    • A.5 Amazon SES (Simple Email Service)
    • A.6 Amazon RDS (Relational Database Service) & Amazon DynamoDB
    • A.7 Amazon CloudSearch
    • A.8 Amazon Elastic Transcoder
    • A.9 Amazon Kinesis Data Streams
    • A.10 Amazon Cognito
    • A.11 Auth0
    • A.12 Firebase
    • A.13 その他のサービス
  • 付録B インストールとセットアップ
    • B.1 システムの準備
    • B.2 IAM ユーザーとCLI のセットアップ
    • B.3 ユーザーアクセス権限の設定
    • B.4 新しいS3バケットの作成
    • B.5 IAMロールの作成
    • B.6 Lambda関数のための準備
    • B.7 Amazon Elastic Transcoder の設定
    • B.8 npm のセットアップ
  • 付録C 認証と認可について
    • C.1 認証と認可の基本
    • C.2 JWT
  • 付録D AWS Lambdaの内部
    • D.1 実行環境
    • D.2 制限
    • D.3 古いランタイムの扱い方
  • 付録 E モデルとマッピング
    • E.1 動画リストの取得
  • 付録 F Amazon S3のイベントメッセージ構造
    • F.1 S3 イベントメッセージの構造
    • F.2 覚えておくべきこと
  • 付録 G Serverless Framework & AWS SAM
    • G.1 Serverless Framework
    • G.2 AWS SAM
    • G.3 まとめ

AWS Amplify Studioではじめるフロントエンド+バックエンド統合開発

AWS Amplify Studioではじめるフロントエンド+バックエンド統合開発

最後はより実践編という位置付けでAmplifyを使った開発の内容の本にしました。Lambdaの基礎ではないため、これまでの本で基礎をおさえつつ再度のAmplifyでアプリ開発の本格入門という位置付けの本のしています。Amplify自体いろんな機能があって覚えることがたくさんなのですが、それら丁寧に解説してくれる内容になってます。

Lambdaの真価が問われるのはバックエンドとしてフロントエンドから連携されたアプリだと思っており、それを簡単に実現してくれるAmplifyには個人的には非常に期待しています。本の内容としては、Amplifyの一機能としてLambdaの使用方法を説明した内容になるのでLambdaに特化した内容ではないのですが、実業務でのLambdaで完結することはあまりないと思うで、一番実践に近い本だと思っています。

目次

  • Chapter1 AWS Amplifyを使おう
    • 1.1. AWS Amplifyを準備する
    • 1.2. サンプルアプリを作成する
  • Chapter2 Amplify Studioでバックエンドを設計する
    • 2.1. Reactアプリケーションの作成
    • 2.2. Amplify Studioとユーザー認証
    • 2.3. データモデルの設計
  • Chapter3 FigmaによるUI設計
    • 3.1. Figmaの基本操作
    • 3.2. Figmaでデザインする
    • 3.3. グラフィックの作成
    • 3.4. データモデル用のコンポーネントの利用
  • Chapter4 Reactによるフロントエンド開発
    • 4.1. Reactアプリケーションの基本
    • 4.2. Reactコンポーネントの設計
    • 4.3. ステートフックと副作用フック
    • 4.4. Reactコンポーネントを活用する
  • Chapter5 DataStoreによるデータベースアクセス
    • 5.1. コレクションコンポーネントの利用
    • 5.2. ReactとDataStoreの利用
    • 5.3. モデルデータの操作
  • Chapter6 GraphQLによるデータの利用
    • 6.1. Amplify MockとGraphQL
    • 6.2. コードからGraphQLを利用する
    • 6.3. GraphQLによるデータの書き換え
  • Chapter7 S3ストレージとLambda関数
    • 7.1. Amazon S3の利用
    • 7.2. ファイルの基本操作
    • 7.3. Lambda関数の利用
    • 7.4. LambdaからAWSの機能を使う
  • Chapter8 JavaScriptベースによるフロントエンド開発
    • 8.1. JavaScriptベースのアプリケーション作成
    • 8.2. Amplifyの機能を利用する

LINE Messaging API を使ってAWS Lambdaに連携する

概要

最近、LINE Messaging API x AWS Lambda x Google スプレッドシート を連携してサクッと便利ツールを作っている日々です♪
個人的にサクッと作れる便利ツールとして、UILINE Messaging APIにして、ロジックAWS Lambdaに、DBGoogle スプレッドシートで作るという構成が簡単に出来て気に入っています。

そこで今回はLINE Messaging API x AWS Lambda の連携編になります。
LINE Messaging API と AWS Lambda をWebhookを使ってHTTPSで連携します。
LINE Developersアカウントがあれば誰でも簡単・無料で出来るので、気になった人はやってみてください。

Lambdaの良書が増えてきたので、おすすめ本5冊を以下で紹介しています。Lambdaについて本格的に勉強したい方はぜひ読んでみてください。

AWS Lambdaおすすめ書籍5冊の紹介

前提条件

  • LINE Developersアカウント(LINE Business ID)取得
    • 無料で作成できるのでアカウントがない人は取得しましょう。
  • AWS Lambda関数の HTTP(S) エンドポイント割り当て
    • LINEからLambdaに連携するために、Lambda関数にHTTP(S) エンドポイントが必要になります。Lambdaを作成する際に、関数 URL を有効化する方法が簡単ですが、アクセス制御はしっかり行ってHTTP(S) エンドポイントを公開しましょう。

公式ページ

Messaging APIを始めよう
https://developers.line.biz/ja/docs/messaging-api/getting-started/

LINE Developersにログイン

まずは、LINEにログインします。
LINE Developersアカウント(LINE Business ID)を作成していない人はアカウントを作成から作成します。

https://account.line.biz/login

プロバイダー/チャネル作成 

ログイン後、LINE DevelopersコンソールというLINEの画面でプロバイダーチャネルを作成します。

  • プロバイダー:サービスを提供し、ユーザーの情報を取得する開発者個人、企業、または団体等のことです。個人で運用する場合は自由に登録すれば良いと思います。
  • チャネル:LINEが提供する機能を、サービス提供者が利用するための通信路です。今回の場合は、AWS Lambdaと LINE Messaging API を使って連携するLINEアプリのことです。

参考ページ
https://developers.line.biz/ja/docs/line-developers-console/overview/

プロバイダー作成

それではプロバイダーから作成していきます。
LINE Developersコンソールの画面操作だけで作成できるので簡単です。

LINE Developersコンソールにログイン後、表示される左メニューのプロバイダーを選択しし、プロバイダーの作成を選択します。

作成画面が表示されるため、任意のプロバイダー名を入力し、作成ボタンで作成されます。
簡単ですね。

チャネル作成

続いてチャネルの作成に移ります。
こちらもLINE Developersコンソールの画面操作だけで作成できます。

プロバイダーを選択する(今回は、AWS Lambdaとの連携が目的なのでLambdaProviderというプロバイダーを作成しています)と、チャネルの設定画面が表示されるため、AWS Lambdaと連携する Messaging API をクリックします。

チャネルの種類Messaging API になっていること、プロバイダー作成したプロバイダーになっていることを確認しましょう。あとは、必須項目を自身の情報で入力すれば大丈夫です。
利用規約を確認して、作成ボタンを押しましょう。

チャネル設定

無事にチャネルが作成されたらチャネルの設定に移ります。
この設定作業でAWS Lambdaとの連携情報認証情報LINEアプリの応答メッセージの設定などを行います。

作成したチャネルを選択します。(今回は、MessagingLambdaというチャネル名で作成しています)

Messaging API設定をクリックします。

ページ中央にあるWebhook URLに連携するAWS Lambdaの公開されたURLを編集ボタンを押して設定します。

URLを設定すると、検証ボタンやWebhookの利用Webhookの再送エラーの統計情報の設定ができるようになるので、必要な設定を行います。
Webhookの利用は必ず必要になるので、必ずONにします。

ページ下部にあるチャネルアクセストークンを設定します。
LambdaからこのLINEアプリに連携する際に指定するキーになる情報なので外部に漏れないないように管理しましょう。

応答/あいさつメッセージのカスタマイズ

ページ中央部にある応答メッセージあいさつメッセージ編集ボタンからこのLINEアプリにメッセージを送った時の応答メッセージLINEアプリを友だち追加した時のあいさつメッセージを編集できます。必要であれば編集しましょう。

編集ボタンをクリックすると以下の応答設定用の専用画面が表示されるため、専用画面で設定を変更します。

今回、AWS Lambdaから応答メッセージを自動作成して送信予定のため、応答メッセージオフに設定します。

AWS Lambdaの実装

いよいよここからはAWS Lambda側の実装になります。
前提条件のところに書きましたが、LINEと連携するためHTTP(S) エンドポイントが公開されているLambda関数の使用が前提になります。
今回は、最も基本的なLINEからLambdaにメッセージを送った時にLambdaからLINEへの応答メッセージを送る方法と、LambdaからLINEへプッシュメッセージを送る方法を記載します。

応答メッセージを送る

LINEからLambdaにメッセージを送った時に送られたメッセージをもとにして応答メッセージを送信するAPIは以下になります。

https://developers.line.biz/ja/reference/messaging-api/#send-reply-message

具体的には以下のhttpsリクエストを応答メッセージとして送信する必要があります。

curl -v -X POST https://api.line.me/v2/bot/message/reply \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer {channel access token}' \
-d '{
    "replyToken":"{Reply token}",
    "messages":[
        {
            "type":"text",
            "text":"Hello, user"
        },
        {
            "type":"text",
            "text":"May I help you?"
        }
    ]
}'

  • channel access token:LINE Developersコンソールで発行したチャネルアクセストークンを設定します。
  • Reply token:メッセージのやり時の度にLINEからLambdaに送られたリクエストメッセージの中からReply tokenを取得して設定します。

LINEから送られてくるリクエストメッセージのReply tokenの具体例は以下になります。replyToken部から取得しましょう。
text部にLINEから送られてくるメッセージが格納されており、userId部がLINEの送信者を特定するIDになります。(userIdは次の「プッシュメッセージを送る」で使用します)

{
  "destination": "xxxxxxxxxx",
  "events": [
    {
      "type": "message",
      "message": {
        "type": "text",
        "id": "14353798921116",
        "text": "Hello, world"
      },
      "timestamp": 1625665242211,
      "source": {
        "type": "user",
        "userId": "U80696558e1aa831..."
      },
      "replyToken": "{Reply token}",
      "mode": "active",
      "webhookEventId": "01FZ74A0TDDPYRVKNK77XKC3ZR",
      "deliveryContext": {
        "isRedelivery": false
      }
    }
  ]
}

実際にLambdaで replyToken を取得して、応答メッセージを送信するサンプルは以下になります。

import json
import requests
from pprint import pprint

def lambda_handler(event, context):
    #=========================
    # LINEからのリクエスト解析
    #=========================
    bodyjson = json.loads(event['body'])
    messagetext = bodyjson['events'][0]['message']['text']
    print("messagetext: " + messagetext)
    replyToken = bodyjson['events'][0]['replyToken']
    print("replyToken: " + replyToken)

    #=========================
    # LINEへのレスポンス作成
    #=========================
    resmessage = [
        {'type':'text','text':messagetext}
    ]
    payload = {'replyToken': replyToken, 'messages': resmessage}
    # カスタムヘッダーの生成(dict形式)
    headers = {'content-type': 'application/json', 'Authorization': 'Bearer XXX'}
    # headersにカスタムヘッダーを指定
    r = requests.post("https://api.line.me/v2/bot/message/reply", headers=headers, data=json.dumps(payload))
    print("LINEレスポンス:" + r.text)
    return

LINEから送られてきたメッセージをそのまま送り返すサンプルになっています。
LINEからのメッセージと replyToken を取得して、応答メッセージ用のhttpsリクエストに設定して送信すればOKです。簡単ですね。

プッシュメッセージを送る

次はLambdaからLINEにプッシュメッセージを送るAPIは以下になります。

https://developers.line.biz/ja/reference/messaging-api/#send-push-message

具体的には以下のhttpsリクエストを送信することでプッシュメッセージを送ることができます。

curl -v -X POST https://api.line.me/v2/bot/message/push \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer {channel access token}' \
-d '{
    "to": "{user id}",
    "messages":[
        {
            "type":"text",
            "text":"Hello, world1"
        },
        {
            "type":"text",
            "text":"Hello, world2"
        }
    ]
}'

  • channel access token:LINE Developersコンソールで発行したチャネルアクセストークンを設定します。
  • user id:プッシュメッセージを送りたい相手の userId を設定します。(userId は「応答メッセージを送る」で確認したLINEからメッセージが送られてきた時のリクエスト内容から確認できます)

実際にLambdaでプッシュメッセージを送信するサンプルは以下になります。

import json
import requests
from pprint import pprint

def lambda_handler(event, context):
    #===========================
    # LINEへのPUSHメッセージ作成
    #===========================
    resmessage = [
        {'type':'text','text':'メッセージ1'},
        {'type':'text','text':'メッセージ2'}
    ]
    payload = {'to': 'XXX', 'messages': resmessage}
    # カスタムヘッダーの生成(dict形式)
    headers = {'content-type': 'application/json', 'Authorization': 'Bearer XXX'}
    # headersにカスタムヘッダーを指定
    r = requests.post("https://api.line.me/v2/bot/message/push", headers=headers, data=json.dumps(payload))
    print("LINEレスポンス:" + r.text)
    return
  • ['to': 'XXX']:プッシュメッセージを送りたい相手の userId を設定します。
  • [Bearer XXX]:LINE Developersコンソールで発行したチャネルアクセストークンを設定します。

送信先のuserIdとチャネルアクセストークンを設定するだけになります。こちらも簡単ですね。

まとめ

今回は、LINE Messaging API x AWS Lambda の連携編を説明しました。
基本的にはLINE Developersコンソール上の設定作業がメインで、Lambda上の実装はMessaging API のリファレンス通りやるだけなので比較的簡単にできたのではないでしょうか。
これで何かあったらLINEにメッセージを送るとツールを動かせたり、定期的にLambdaを起動してLINEにメッセージを送ったりできるので簡単なツールだったら自分でサクッと作ってしまおうかなと思って個人的には気に入っている方法になります。
興味がある方がいたらぜひやってみてください。

AWS Lambda で Python プログラミング~Boto3 サンプル集S3編~

概要~個人的によく使うLambda(Python Boto3)のサンプル集~

Lambdaプログラミングしていて良く使うコードサンプルをまとめていきます。
随時更新予定です(^^)

公式APIリファレンス

AWS公式のAPIリファレンスは以下のURLで何かあったら参照して正しく使いましょう。

https://boto3.amazonaws.com/v1/documentation/api/latest/index.html

S3サンプル

S3ファイルダウンロード

ダウンロードするS3のバケット名、オブジェクト名、Lambdaのローカル環境に保存するファイル名を指定します。
ローカル環境上に同名のファイルがあった場合は上書きされます。

import boto3
s3 = boto3.client('s3')

# バケット名、ダウンロードオブジェクト名、ダウンロードファイル名
S3_BUCKET_NAME = 'sample-bucket'
S3_OBJECT_DOWNLOAD_FILE_NAME = 'sample.jpg'
LOCAL_SAVE_FILE_NAME = '/tmp/sample.jpg'

def lambda_handler(event, context):

    # S3ダウンロード
    s3.download_file(S3_BUCKET_NAME, S3_OBJECT_DOWNLOAD_FILE_NAME, LOCAL_SAVE_FILE_NAME)

    return

S3ファイルアップロード

アップロード先のS3のバケット名、オブジェクト名、Lambdaのローカル環境にあるアップロード対象のファイル名を指定します。
Lambdaのローカル環境にアップロードファイルがある前提のため、事前にアップロードファイルは作成しておく必要があります。
S3上に同名のオブジェクトがあった場合は上書きされます。

import boto3
s3 = boto3.client('s3')

# バケット名、オブジェクト名、アップロード対象ファイル名
S3_BUCKET_NAME = 'sample-bucket'
S3_OBJECT_UPLOAD_FILE_NAME = 'S3sample.jpg'
LOCAL_UPLOAD_FILE_NAME = '/tmp/sample.jpg'

def lambda_handler(event, context):

    # TODOアップロード対象ファイル作成処理

    # S3アップロード
    s3.upload_file(LOCAL_UPLOAD_FILE_NAME, S3_BUCKET_NAME, S3_OBJECT_UPLOAD_FILE_NAME)

    return

S3ファイルダウンロード(メモリ上で扱う場合)

ローカル環境に保存せず、そのままメモリ上でバイトデータとして扱う場合は以下になります。

import boto3

s3 = boto3.resource('s3')

# バケット名、ダウンロードオブジェクト名
S3_BUCKET_NAME = 'sample-bucket'
S3_OBJECT_DOWNLOAD_FILE_NAME = 'sample.jpg'

def lambda_handler(event, context):
    # S3ダウンロード
    bucket = s3.Bucket(S3_BUCKET_NAME)
    obj = bucket.Object(S3_OBJECT_DOWNLOAD_FILE_NAME)
    response = obj.get()
    body = response['Body'].read()

    # 別のBotoクライアントにバイトのまま渡す場合
    # response = client.xxxxxx(Image={'Bytes': body})
    # ダウンロードファイルが画像ではなくJSONファイルの場合
    # print(json.loads(body.decode('utf-8')))

S3ファイルのリスト表示

ファイルのリスト表示するS3のバケット名を指定します。

import boto3

s3 = boto3.client('s3')

# バケット名
S3_BUCKET_NAME = 'sample-bucket'

def lambda_handler(event, context):

    # オブジェクトのリスト表示
    response = s3.list_objects_v2(Bucket=S3_BUCKET_NAME)

    for obj in response['Contents']:
        print(obj['Key'])

    return

S3事前署名付きURL発行

S3に保存してあるファイルを一時的に公開するときに使用する事前署名付きURLを発行するサンプルです。
事前署名付きURLを発行するS3のバケット名、オブジェクト名、URLの有効期限(秒)を指定します。

import boto3
s3 = boto3.client('s3')

# バケット名、事前署名URL発行オブジェクト名、有効期限(秒)
S3_BUCKET_NAME = 'ai-sample-bucket'
S3_OBJECT_PRESIGNES_FILE_NAME = 'sample.jpg'
EXPIRATION = 3600

def lambda_handler(event, context):

    # 事前署名URL発行
    response = s3.generate_presigned_url('get_object',
        Params={'Bucket': S3_BUCKET_NAME,
        'Key': S3_OBJECT_PRESIGNES_FILE_NAME},
        ExpiresIn=EXPIRATION)

    print(response)

    return

参考

Boto3ライブラリは、boto3.clientとboto3.resourceの2つの主要なクラスがあります。

boto3.clientは、AWSサービスのAPIアクションを呼び出すためのクライアントを提供します。例えば、s3クライアントを作成して、S3バケットを作成したり、オブジェクトを取得したり、削除したりすることができます。これは低レベルのAPIであり、AWSリソースとのやり取りがJSONデータで行われます。

一方、boto3.resourceは、AWSリソースを表すPythonオブジェクトを提供します。これは、より高レベルのAPIであり、AWSリソースとPythonオブジェクトのやり取りが可能です。例えば、s3リソースを使用して、バケットを作成したり、オブジェクトを取得したり、削除したりすることができます。また、オブジェクトにはファイルの内容にアクセスするためのread()メソッドがあり、オブジェクトに対してPythonオブジェクトと同じように操作できます。

それぞれで出来ること、やりたいことを理解して使い分けましょう。

EC2(WindowsServer)にSSM Fleet Managerを使ってRDP接続してみる

概要~AWSのEC2(WindowsServer)にAWS Systems Managerのフリートマネージャーを使ってRDP接続してみる~

皆さんはWindowsサーバのEC2を立てた後、どのようにRDP接続していますか?
私はしばらく踏み台サーバを構築して踏み台サーバを経由してアクセスしていたのですが、最近Fleet Managerの存在を知ったのですぐに乗り換えました(^^)便利です。
ただ、乗り換えにあたりいくつか注意点があったのでその内容を共有します。

Fleet Manager RDP接続切り替え手順

今回の記事内容は既存のEC2インスタンスにFleet Managerで接続する接続方法の切り替え手順になります。EC2インスタンスを新しく作成してFleet Managerから接続するのは以下の記事のように比較的簡単に出来るのでそれらの記事を参照にしてください。

【RDP切り替え手順】

  1. RDP接続先のEC2のIAMロールにAmazonSSMManagedInstanceCoreを追加する
  2. SSM Agentを最新化する
  3. RDP接続ポートを3389にする

それでは手順の詳細を説明していきます。

手順1:EC2のIAMロールにAmazonSSMManagedInstanceCoreを追加

Fleet Managerを使ったRDP接続には専用のIAMポリシーが追加になります。AmazonSSMManagedInstanceCoreというポリシーをIAMロールに追加しましょう。
AmazonSSMFullAccessというポリシーもありますが、このポリシーではダメなので注意しましょう。

このIAMポリシーを持つIAMロールをEC2に付与することで、フリートマネージャーが該当のEC2をマネージドノードとして認識でき、フリートマネージャーのマネージドノードの一覧に表示されるようになります。(反映には時間がかかるようで私の場合、IAMロール設定後10分程度一覧に表示されるまで時間がかかりました)

ちなみにこの画面はAWS Systems Managerのトップ画面の左メニューにあるフリートマネージャーをクリックすることで遷移できます。

手順2:SSM Agentを最新化する

手順1を実行することで基本的にはフリートマネージャーからのRDP接続の準備が完了なのですが、私の場合、これだけではエラーになったため、あと2つの切り替え手順を記載します。ちなみにこの状態でRDP接続をするためには、フリートマネージャーの画面から ノードアクションリモートデスクトップ(RDP)との接続をクリックします。

表示されたリモートデスクトップ接続画面からユーザー認証情報(通常のRDP接続に使っているID/パスワード認証)か、キーペア(EC2作成時に指定したキーペアを使った認証)かを選び、Connectをクリックします。

接続を試みているようですが、、、

最終的にはリモートデスクトップセッションが確立できないとかで、タイムアウトしました。。。

この原因を調査したのですが、直接的な原因がわからず、結論としてはSSM Agentのバージョンアップをしたところ、解決しました。
(私のEC2は2020年頃作成したもので、SSMエージェントは自動インストールされており、当時のバージョンは3.0.XXX.Xくらいだったと思います)

SSM Agentの最新化は以下のフリートマネージャーの画面操作で簡単にできます。
アカウント管理SSMエージェントの自動更新

↓のバージョンが上がったことを確認しましょう。

手順2は以上です。

手順3:RDP接続ポートを3389にする

この手順は敢えてデフォルトのRDP接続ポートを変更していた人のみの手順になります。
私はポート変更していたので、ここで結構ハマリました。
なぜなら3389以外のポートにしていた場合、エラーメッセージが↓の認証エラーでした。。。

リモートデスクトップセッションを確立できません。
有効な認証情報が提供されていること、および指定したユーザがリモートデスクトップ経由でログインできることを確認してください。
Authentication failed

このエラーに従って接続ユーザやキーペアの正当性を繰り返し確認したり、新しいログインユーザを作成してみたり、もう一台EC2を立ち上げてそのEC2からの接続を試みたり等、試しましたが、その場合は正しくRDPできてしまう。。。ただ、フリートマネージャーを使ったRDPは必ずこのエラーになってしまう。。。

既存のEC2からの乗り換えは難しいかと諦めかけたときにそう言えばデフォルトのRDPポートを変えていることに気が付き、もしかしたらと試してみたら無事に接続できました。

リモートデスクトップのデフォルトポートの変更はAWSとは関係のない話しなので変更手順は以下のサイト等参照にします(^^;)

https://learn.microsoft.com/ja-jp/windows-server/remote/remote-desktop-services/clients/change-listening-port

以上です!

まとめ

私の環境ではいくつかのエラーが発生し乗り換え手順が必要になりましたが、基本的にはフリートマネージャーはかなり便利に使えると思います。
いくつか接続後の注意点としては、

  1. ファイル共有が出来ない(ローカル環境からファイルをコピペするが出来ない)ことは、S3をローカル環境とEC2のファイル共有に利用することが運用しています。
  2. 日本語が入力できない

ことが挙げられ、2番目(今のところ出来なそう)はなんとかならないかなぁと思っているところです。

gspreadライブラリを使ってPythonでGoogleスプレッドシートの操作(値追加・値取得・行追加・行削除)する

概要〜Pythonでgspreadライブラリを公式ページにならってやってみてAWS LambdaでGoogleスプレッドシートに定期的に記録する〜

皆さん日々記録を取りたい時どこに記録をしていますか?
私はGoogleスプレッドシートを多用しています。
なぜなら、、、

  • Googleアカウントをもっていれば誰でも無料で使える
  • Webブラウザがあれば携帯、PC問わずアクセスできる
  • ちょっと修正したいなと思った時の修正がExcelと同じ操作感なので容易

などの理由からです。
日々自動化して記録をしたいことがあるのですが、その都度DBを用意して記録するのはそれなりに手間がかかるので私はGoogleスプレッドシートを使って日々の自動化処理を実行しています。
今回はその時に役に立つ、PythonからGoogleスプレッドシートに簡単にアクセスできるgspreadライブラリを調べたのでその整理内容になります。

出来るようになること

  • Googleスプレッドシートを開く
  • Googleスプレッドシートのシートを指定する
  • Googleスプレッドシートの値を取得する
  • Googleスプレッドシートに値を書き込む
  • Googleスプレッドシートに行を追加する/行を削除する

最終的なコードは以下になります。
これだけのコードでGoogleスプレッドシートに対する最低限の操作が出来るのでかなり簡単だったと思います。

import gspread
import json

#認証処理
gc  = gspread.service_account_from_dict('認証情報のJSON')

# ファイル名指定で開く
sh = gc.open('ファイル名')

# シート名指定
worksheet = sh.worksheet("シート名")

# A1等のラベル指定して値取得
val = worksheet.acell('B1').value

# ラベル指定して値を更新
worksheet.update('B1', 'Bingo!')

# 最終行に引数のリストの内容を1行追加
worksheet.append_row(['A','B','C'])

公式ページ

gspreadの公式ページは以下になります。

https://docs.gspread.org/en/latest/

前提条件

前提条件としてGoogleスプレッドシートにアクセスするための認証情報(JSONファイル)をGCPで取得する必要があります。(GCPを利用するのでGCPアカウントが必要になります)
今回はgspreadライブラリの説明をメインとした記事なのでこの部分は割愛しますが、以下のようなコードで取得した認証情報を使って認証処理を実装します。
gspreadライブラリを使えばたった3行です。簡単ですね。

import gspread
import json

#認証処理
gc  = gspread.service_account_from_dict('認証情報のJSON')

認証処理の更新ページURLは以下になります。
実装方法は上のサンプル以外にもあるので必要なら別の方法を確認してみてください。

https://docs.gspread.org/en/latest/oauth2.html

ワークブックを開く

それでは実際のGoogleスプレッドシートの操作の説明に移ります。
まず最初はGoogleスプレッドシートの操作するスプレッドシートを指定して開きます。
指定方法にはファイル名を指定、キーを指定、URLの指定の3つの方法があるので、扱い易い方法で開けばいいと思います。個人的にはファイル名指定が一番直感的に扱えるかなと思っています。

# ファイル名指定で開く
sh = gc.open('ファイル名')

# スプレッドシートのキー指定で開く
sh = gc.open_by_key('スプレッドシートキー')

# URL指定で開く
sh = gc.open_by_url('URL')

# スプレッドシートを取得したらスプレッドシートの内容を表示してみる
print(sh.title) #スプレッドシートのタイトルを表示する
print(sh.id) # スプレッドシートキーを表示する

ファイルを開く部分の公式ページは以下になります。

https://docs.gspread.org/en/latest/user-guide.html#opening-a-spreadsheet

シート選択

スプレッドシートが開けたら次はシートを選択します。
この辺りの操作間はExcel操作と一緒ですね。
こちらも複数の方法がありますが、基本的にはインデックスを指定するか、シート名を指定する方法になります。個人的にはこちらもシート名を指定する方法が直感的かなと思います。

# シートのインデックスを指定(先頭は0になります)
worksheet = sh.get_worksheet(0)

# シート名指定
worksheet = sh.worksheet("シート名")

# 先頭のシート指定(先頭のシートだけです。sheet2にしたところで2番目のシートは指定できません)
worksheet = sh.sheet1

# すべてのシートをリストで取得する
worksheet_list = sh.worksheets()

# シートを取得したらシートの内容を表示してみる
print(worksheet.title)  # シート名表示
print(worksheet.id) # シートID表示

公式ページは以下になります。

https://docs.gspread.org/en/latest/user-guide.html#selecting-a-worksheet

値取得

シートまで取得できたので、それではここから値を取得していきます。
A1等のラベル表記と1,2といった行と列番号を指定して取得する方法があります。
こちらはどちらの取得方法でも良いと思うので好みですかね。。。

# A1等のラベル指定して値取得
val = worksheet.acell('B1').value

# 行と列番号を指定して値取得(左:行番号、右:列番号)
val = worksheet.cell(1, 2).value

# 行番号の指定して1行の値をリストとして取得
values_list = worksheet.row_values(1)

# 列番号の指定して1列の値をリストとして取得
values_list = worksheet.col_values(1)

# 値を取得したら値の内容を表示してみる
print(val) # 値表示
print(values_list) # 取得したリストの値を表示

公式ページは以下になります。

https://docs.gspread.org/en/latest/user-guide.html#getting-a-cell-value

他にもシート全て値を取得する方法や行ごとに取得する方法が公式ページには記載されているので参照してみてください。

https://docs.gspread.org/en/latest/user-guide.html#getting-all-values-from-a-worksheet-as-a-list-of-lists

https://docs.gspread.org/en/latest/user-guide.html#getting-all-values-from-a-worksheet-as-a-list-of-dictionaries

値を更新

続いて値を更新していきます。
方法は値取得と同一になり、A1等のラベル表記と1,2といった行と列番号を指定して取得する方法があります。

# ラベル指定して値を更新
worksheet.update('B1', 'Bingo!')

# 行と列番号を指定して値更新
worksheet.update_cell(1, 2, 'Bingo!')

# 範囲を指定して値をまとめて更新
worksheet.update('A1:B2', [[1, 2], [3, 4]])

# 更新したら値の内容を表示してみる
print(worksheet.acell('B2').value) # 値表示

公式ページは以下になります。

https://docs.gspread.org/en/latest/user-guide.html#updating-cells

行操作

最後に行ごとに操作する方法の紹介になります。
実際スプレッドシートの更新は行ごとに行うことが多いと思うので、その時の操作方法になります。
方法としては、最終行に追加、指定行に追加、指定行の削除になります。
行を指定しての更新方法が見つからず私は指定行を削除後、指定行を追加することで行の更新を行っています。

# 最終行に引数のリストの内容を1行追加
worksheet.append_row(['A','B','C'])

# 指定行に引数のリストの内容を1行追加
worksheet.insert_row(['A','B','C'], 1)

# 指定行を削除
worksheet.delete_rows(2)

# 行を更新したら値の内容を表示してみる
values_list = worksheet.row_values(1)
print(values_list)

公式ページは以下になります。

https://docs.gspread.org/en/latest/api/models/worksheet.html#gspread.worksheet.Worksheet.append_row

https://docs.gspread.org/en/latest/api/models/worksheet.html#gspread.worksheet.Worksheet.insert_row

https://docs.gspread.org/en/latest/api/models/worksheet.html#gspread.worksheet.Worksheet.delete_row

まとめ

いかがだったでしょうか。
私はgspreadライブラリを使うことでかなり簡単にGoogleスプレッドシートの操作ができたと感じています。
私はこれをAWS Lambdaに実装し日々の記録を自動化しています。
機会があればLambdaへの実装方法を記事にしようと思いますが、ソースコードだけ参考に載せておきます。
認証情報をパラメータストアから取得するところがAWS Lambda特有の部分ですが、他は同じようにGoogleスプレッドシートの操作が可能です。

import gspread
import json
import boto3
import os

# パラメータストアに保存している認証情報のキー名を環境変数から取得
# PARAM_KEY = os.environ.get('●●●パラメータストアを取得する環境変数名を指定●●●')
# 私は環境変数として「PARAM_KEY」として設定
PARAM_KEY = os.environ.get('PARAM_KEY')

def lambda_handler(event, context):

    # パラメータストアに保存している認証情報(JSONファイルを取得)
    ssm = boto3.client('ssm')
    response = ssm.get_parameters(
        Names=[
            PARAM_KEY,
        ],
        WithDecryption=True
    )
    service_account_info = json.loads(response['Parameters'][0]['Value'])

    #認証処理
    gc  = gspread.service_account_from_dict(service_account_info)

    # ファイル名指定で開く
    sh = gc.open('●●●Googleスプレッドシートファイル名を指定●●●')

    # シート名指定
    worksheet = sh.worksheet("●●●操作するシート名を指定●●●")

    # A1等のラベル指定して値取得
    val = worksheet.acell('B1').value

    # ラベル指定して値を更新
    worksheet.update('B1', 'Bingo!')

    # 最終行に引数のリストの内容を1行追加
    worksheet.append_row(['A','B','C'])

Lambdaの環境変数に以下を設定

SystemsManagerのパラメータストアに以下を設定

AWS Lambda関連の記事は以下などを投稿しているので興味がある方はぜひ読んでみてください(^^)

1.AWS Lambda 入門~おすすめ本5冊の紹介~

2.AWS Lambda で Python プログラミング~Boto3 サンプル集S3編~

3.AWS Lambda SAMとは?~Cloud9でSAM Sampleを使ってPythonのLambdaプログラムを簡単にデプロイする~

これで日々の単調な作業から脱却します!

AWS Lambda SAMとは?~Cloud9でSAM Sampleを使ってPythonのLambdaプログラムを簡単にデプロイする~

概要

前のLambda投稿に続き今回もAWS Lambdaネタになります。
今回はLambda構築・設定・イベントソースマッピングからソースコードを管理・編集しやすいようにAWS サーバーレスアプリケーションモデル (Serverless Application Model)、AWS SAMにチャレンジします。

https://aws.amazon.com/jp/serverless/sam/

サンプルコードなどの簡単なプログラミングであればAWSコンソールで設定、ソースコードの直接編集すれば良いのですが、ちょっと規模が大きくなるとLambdaの設定・ソースコードをしっかり管理したい、しっかりテストしたいという状況が出てきます。

その時にかなり便利なのがAWS サーバーレスアプリケーションモデル(AWS SAM)になります。

Lambdaを使って本格的にLambdaのサービスを運用したい人、興味がある方は読んでみて下さい。

資格試験の勉強法は記事は以下を参照。

AWS初心者がAWS 認定ソリューションアーキテクト – アソシエイト資格試験に合格した時の勉強法
AWS初心者がAWS 認定ソリューションアーキテクト – プロフェッショナル資格試験に合格した時の勉強法

想定読者

  • LambdaでSAMを使ってみたい人
  • Lambdaの知識をレベルアップしたい人
  • Lambdaを実運用で使っている人

参考書籍

AWS Lambda実践ガイド 第2版

【Kindle版】AWS Lambda実践ガイド 第2版

ほぼほぼこの本を参考にさせて頂きました。
Lambdaに特化した本はあまりないので現時点で唯一の専門書と思います。
2022年になって第2版となり内容が最新化されています。

目次

  • SAM環境(Cloud9環境)準備
  • SAM初期設定
  • SAMビルド/デプロイ

SAMを使って簡単なLambda関数を作っていきます。
作業時間、たったの 30分!

SAM環境(Cloud9環境)準備

SAMを使うためには SAM CLI がインストールされている必要があります。
ローカル環境でインストールしても良いのですが、AWS の Cloud9 を使うのが一番簡単なので今回はCloud9の環境準備から説明します。

Cloud9の作成は非常に簡単で、AWSコンソールのCloud9のサービスメニュに行き、

image.png

Create environmentをクリック
image.png

Nameに任意の名前を入力
Next stepをクリック

image.png

環境設定は、基本的には任意のものを選択していいのですが、ブラウザからそのままアクセスが出来て簡単なのが direct access 、料金が安く済むものが t2.micro になります。

image.png

料金節約のため無操作30分後に自動停止するよう After 30 minutes(default) のままにしておきます。
Network settingd(advanced) はデフォルトVPC以外に作りたい時(Cloud9へのアクセスをしっかりアクセス制御したい時)に選択します。
Next step をクリック

image.png

設定内容を最終確認して問題なければ、Create environment クリック

memo_2022-05-01-11-46-16.png

数分待つとこんな感じのCloud9のトップ画面が表示されます。
実際の操作は左メニューから編集したいファイルを選択し画面中央部で編集する操作と、画面下部のコンソール部分に直接コマンドを実行する大きく2パターンの操作があります。

image.png

SAM初期設定(sam init)

それでは実際にSAMの初期設定をしていきます。
画面下部のコンソールに sam init のコマンドを実行して初期設定します。

$ pwd
/home/ec2-user/environment
$ sam init

You can preselect a particular runtime or package type when using the `sam init` experience.
Call `sam init --help` to learn more.

Which template source would you like to use?
        1 - AWS Quick Start Templates
        2 - Custom Template Location
Choice: 1

Choose an AWS Quick Start application template
        1 - Hello World Example
        2 - Multi-step workflow
        3 - Serverless API
        4 - Scheduled task
        5 - Standalone function
        6 - Data processing
        7 - Infrastructure event management
        8 - Lambda EFS example
        9 - Machine Learning
Template: 1

 Use the most popular runtime and package type? (Python and zip) [y/N]: y

Project name [sam-app]: sam-example

Cloning from https://github.com/aws/aws-sam-cli-app-templates (process may take a moment)

    -----------------------
    Generating application:
    -----------------------
    Name: sam-example
    Runtime: python3.9
    Architectures: x86_64
    Dependency Manager: pip
    Application Template: hello-world
    Output Directory: .

    Next steps can be found in the README file at ./sam-example/README.md


    Commands you can use next
    =========================
    [*] Create pipeline: cd sam-example && sam pipeline init --bootstrap
    [*] Test Function in the Cloud: sam sync --stack-name {stack-name} --watch


SAM CLI update available (1.53.0); (1.40.1 installed)
To download: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html
$

実際の入力値は以下の4つ

  • Choice: 1(1 - AWS Quick Start Templates)
  • Template: 1(1 - Hello World Example)
  • Use the most popular runtime and package type? (Python and zip) [y/N]: y
  • Project name [sam-app]: sam-example

sam-example というプロジェクト名で、実行環境 python3.9、samテンプレート Hello World Example を選択(テンプレートはすぐに自分で編集するのでなんでも構いません)しています。

sam init コマンドが完了するとひと通り必要なフォルダ・ファイル群が作成されます。

IMG_0358.jpeg

この中で重要なのが、

  • app.py:Lambdaのソースプログラムが記載されているファイル
  • template.yml:Lambdaの設定が記載されているファイル

の二つになります。

IMG_0357.jpeg

それぞれ中身を簡単に見てみます。
まずは template.yml から。

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  sam-example

  Sample SAM Template for sam-example

# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
  Function:
    Timeout: 3

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.9
      Architectures:
        - x86_64
      Events:
        HelloWorld:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /hello
            Method: get

Outputs:
  # ServerlessRestApi is an implicit API created out of Events key under Serverless::Function
  # Find out more about other implicit resources you can reference within SAM
  # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api
  HelloWorldApi:
    Description: "API Gateway endpoint URL for Prod stage for Hello World function"
    Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"
  HelloWorldFunction:
    Description: "Hello World Lambda Function ARN"
    Value: !GetAtt HelloWorldFunction.Arn
  HelloWorldFunctionIamRole:
    Description: "Implicit IAM Role created for Hello World function"
    Value: !GetAtt HelloWorldFunctionRole.Arn

Hello World Example のテンプレートの場合、LambdaとAPIGatewayが含まれています。
Resources: 部がそれらの記述に該当しますが

  • Type: AWS::Serverless::Function:Lambdaであることを示しています
  • Type: Api:APIGatewayであることを示しています

今回は、最小限のLambdaだけの設定にしたいので以下に書き換えます。(ついでにコメントも消してすっきりさせます)

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  sam-example

  Sample SAM Template for sam-example

Globals:
  Function:
    Timeout: 3

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: app.lambda_handler
      Runtime: python3.9

Outputs:
  HelloWorldFunction:
    Description: "Hello World Lambda Function ARN"
    Value: !GetAtt HelloWorldFunction.Arn
  HelloWorldFunctionIamRole:
    Description: "Implicit IAM Role created for Hello World function"
    Value: !GetAtt HelloWorldFunctionRole.Arn

DescriptionOutputs は無くても良い設定のため必要なのは、GlobalsResources 部だけになり、たった 9行 です。

次は app.py です。
このファイルがLambdaの本体のプログラムになります。
今後、自分でプログラムを書き換えるときはこのファイルを編集します。

import json

# import requests


def lambda_handler(event, context):
    """Sample pure Lambda function

    Parameters
    ----------
    event: dict, required
        API Gateway Lambda Proxy Input Format

        Event doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format

    context: object, required
        Lambda Context runtime methods and attributes

        Context doc: https://docs.aws.amazon.com/lambda/latest/dg/python-context-object.html

    Returns
    ------
    API Gateway Lambda Proxy Output Format: dict

        Return doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html
    """

    # try:
    #     ip = requests.get("http://checkip.amazonaws.com/")
    # except requests.RequestException as e:
    #     # Send some context about this error to Lambda Logs
    #     print(e)

    #     raise e

    return {
        "statusCode": 200,
        "body": json.dumps({
            "message": "hello world",
            # "location": ip.text.replace("\n", "")
        }),
    }

こちらはシンプルですね。
コメントがたくさんありますが、戻り値にjson形式の hello world も返却しているだけになってます。

SAMビルド/デプロイ(sam build/sam deploy)

ビルド

では、ビルド/デプロイをやっていきましょう。
template.yml を編集したため、シンプルに Lambda関数1つ を作成するsamテンプレートになっています。

では、ここからはコンソール操作になるので、Cloud9画面下部のコンソール部分でコマンド実行します。
まず、カレントフォルダを ~/environment/sam-example/ (自身で入力したプロジェクトフォルダ)に移動して、ビルドコマンド sam build --use-container を実行します。

実際の実行コマンドは以下の2つ

cd ~/environment/sam-example/
sam build --use-container

では、やってみます。

$ cd ~/environment/sam-example/
$ sam build --use-container
Starting Build inside a container
Building codeuri: /home/ec2-user/environment/sam-example runtime: python3.9 metadata: {} architecture: x86_64 functions: ['HelloWorldFunction']

Fetching public.ecr.aws/sam/build-python3.9:latest-x86_64 Docker container image...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Mounting /home/ec2-user/environment/sam-example as /tmp/samcli/source:ro,delegated inside runtime container
Traceback (most recent call last):
  File "samcli/__main__.py", line 12, in <module>
  File "click/core.py", line 829, in __call__
  File "click/core.py", line 782, in main
  File "click/core.py", line 1259, in invoke
  File "click/core.py", line 1066, in invoke
  File "click/core.py", line 610, in invoke
  File "click/decorators.py", line 73, in new_func
  File "click/core.py", line 610, in invoke
  File "samcli/lib/telemetry/metric.py", line 153, in wrapped
  File "samcli/lib/telemetry/metric.py", line 122, in wrapped
  File "samcli/lib/utils/version_checker.py", line 42, in wrapped
  File "samcli/cli/main.py", line 90, in wrapper
  File "samcli/commands/build/command.py", line 228, in cli
  File "samcli/commands/build/command.py", line 318, in do_cli
  File "samcli/lib/build/app_builder.py", line 172, in build
  File "samcli/lib/build/build_strategy.py", line 42, in build
  File "samcli/lib/build/build_strategy.py", line 53, in _build_functions
  File "samcli/lib/build/build_strategy.py", line 129, in build_single_function_definition
  File "samcli/lib/build/app_builder.py", line 572, in _build_function
  File "samcli/lib/build/app_builder.py", line 705, in _build_function_on_container
  File "samcli/local/docker/container.py", line 308, in wait_for_logs
RuntimeError: Container does not exist. Cannot get logs for this container
[19020] Failed to execute script __main__

おそらく、 RuntimeError: Container does not exist. Cannot get logs for this container エラーが発生します。
ビルドコマンドのオプションで --use-container(実行環境をコンテナ上に作成するオプション)を付けているのですが、Cloud9の初期ディスクだと足りません。。。
(非常にわかりにくいエラーメッセージですね。。。)

なぜなら、、、

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        484M     0  484M   0% /dev
tmpfs           492M     0  492M   0% /dev/shm
tmpfs           492M  468K  491M   1% /run
tmpfs           492M     0  492M   0% /sys/fs/cgroup
/dev/xvda1       10G  8.2G  1.9G  82% /
tmpfs            99M     0   99M   0% /run/user/1000

すでにディスク容量の 82% しており、 1.9G しか残りがないからです。。。
(sam init で大量にディスクを消費したのではなく、Cloud9は最初からディスクが少ないようです。。。)

Cloud9ディスク拡張

では、Cloud9のディスクを増やしましょう。
Cloud9はEC2のLinux上で実現されているのでEC2のメニューからLinuxのディスク拡張操作を行います。
Linuxの場合、ディスク拡張は簡単で、Cloud9を作成すると自動的にEC2のメニューに専用のEC2が出来上がっているので、そのEC2を止めた状態で、EC2のボリュームのメニューのディスクの変更からサイズを増やすだけです。

image.png
image.png

以上です。

再度EC2を起動し、Cloud9のコンソールからディスクが増えていることを確認します

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        484M     0  484M   0% /dev
tmpfs           492M     0  492M   0% /dev/shm
tmpfs           492M  464K  491M   1% /run
tmpfs           492M     0  492M   0% /sys/fs/cgroup
/dev/xvda1       15G  8.2G  6.9G  55% /
tmpfs            99M     0   99M   0% /run/user/1000

使用率 55% 残り 6.9GB になりました。
では、改めてビルドしましょう。

再ビルド

$ cd ~/environment/sam-example/
$ sam build --use-container
Starting Build inside a container
Building codeuri: /home/ec2-user/environment/sam-example runtime: python3.9 metadata: {} architecture: x86_64 functions: ['HelloWorldFunction']

Fetching public.ecr.aws/sam/build-python3.9:latest-x86_64 Docker container image...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Mounting /home/ec2-user/environment/sam-example as /tmp/samcli/source:ro,delegated inside runtime container

Build Succeeded

Built Artifacts  : .aws-sam/build
Built Template   : .aws-sam/build/template.yaml

Commands you can use next
=========================
[*] Invoke Function: sam local invoke
[*] Deploy: sam deploy --guided

requirements.txt file not found. Continuing the build without dependencies.
Running PythonPipBuilder:CopySource
$

今度は成功しました。
ビルド後のディスク容量も確認しておきましょう。

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        484M     0  484M   0% /dev
tmpfs           492M     0  492M   0% /dev/shm
tmpfs           492M  464K  491M   1% /run
tmpfs           492M     0  492M   0% /sys/fs/cgroup
/dev/xvda1       15G   11G  4.6G  70% /
tmpfs            99M     0   99M   0% /run/user/1000
$ 

使用率 70% 残り 4.6GB になりました。
ビルド前と比較すると 2.3GB 使用するようですね。結構使いますね。。。

デプロイ

では、いよいよデプロイです。
sam deploy --guided --capabilities CAPABILITY_IAM CAPABILITY_AUTO_EXPAND デプロイ時のガイド付き、ロール等は自動で作成するオプションを付けています。

実行コマンドは以下の1つ。

sam deploy --guided --capabilities CAPABILITY_IAM CAPABILITY_AUTO_EXPAND

実行します。

$ sam deploy --guided --capabilities CAPABILITY_IAM CAPABILITY_AUTO_EXPAND

Configuring SAM deploy
======================

        Looking for config file [samconfig.toml] :  Not found

        Setting default arguments for 'sam deploy'
        =========================================
        Stack Name [sam-app]: sam-sample
        AWS Region [ap-northeast-1]: 
        #Shows you resources changes to be deployed and require a 'Y' to initiate deploy
        Confirm changes before deploy [y/N]: y
        #SAM needs permission to be able to create roles to connect to the resources in your template
        Allow SAM CLI IAM role creation [Y/n]: y
        Save arguments to configuration file [Y/n]: y
        SAM configuration file [samconfig.toml]: 
        SAM configuration environment [default]: 

        Looking for resources needed for deployment:
         Managed S3 bucket: aws-sam-cli-managed-default-samclisourcebucket-bncdmvrv3w3n
         A different default S3 bucket can be set in samconfig.toml

        Saved arguments to config file
        Running 'sam deploy' for future deployments will use the parameters saved above.
        The above parameters can be changed by modifying samconfig.toml
        Learn more about samconfig.toml syntax at 
        https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-config.html

Uploading to sam-sample/1c2f1111422c1a9a068bc3d12653d3c4  7913 / 7913  (100.00%)

        Deploying with following values
        ===============================
        Stack name                   : sam-sample
        Region                       : ap-northeast-1
        Confirm changeset            : True
        Deployment s3 bucket         : aws-sam-cli-managed-default-samclisourcebucket-bncdmvrv3w3n
        Capabilities                 : ["CAPABILITY_IAM", "CAPABILITY_AUTO_EXPAND"]
        Parameter overrides          : {}
        Signing Profiles             : {}

Initiating deployment
=====================
Uploading to sam-sample/cc7378c1e1ecf6a93a04bc81b3006223.template  768 / 768  (100.00%)

Waiting for changeset to be created..

CloudFormation stack changeset
-------------------------------------------------------------------------------------------------------------------------------------------------------------
Operation                               LogicalResourceId                       ResourceType                            Replacement                           
-------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Add                                   HelloWorldFunctionRole                  AWS::IAM::Role                          N/A                                   
+ Add                                   HelloWorldFunction                      AWS::Lambda::Function                   N/A                                   
-------------------------------------------------------------------------------------------------------------------------------------------------------------

Changeset created successfully. arn:aws:cloudformation:ap-northeast-1:XXXXXXXXXXXX:changeSet/samcli-deploy1651456975/245e03ef-407d-b1c6-43702e5cd1b3-e61b


Previewing CloudFormation changeset before deployment
======================================================
Deploy this changeset? [y/N]: y

2022-05-02 02:03:09 - Waiting for stack create/update to complete

CloudFormation events from changeset
-------------------------------------------------------------------------------------------------------------------------------------------------------------
ResourceStatus                          ResourceType                            LogicalResourceId                       ResourceStatusReason                  
-------------------------------------------------------------------------------------------------------------------------------------------------------------
CREATE_IN_PROGRESS                      AWS::IAM::Role                          HelloWorldFunctionRole                  -                                     
CREATE_IN_PROGRESS                      AWS::IAM::Role                          HelloWorldFunctionRole                  Resource creation Initiated           
CREATE_COMPLETE                         AWS::IAM::Role                          HelloWorldFunctionRole                  -                                     
CREATE_IN_PROGRESS                      AWS::Lambda::Function                   HelloWorldFunction                      -                                     
CREATE_IN_PROGRESS                      AWS::Lambda::Function                   HelloWorldFunction                      Resource creation Initiated           
CREATE_COMPLETE                         AWS::Lambda::Function                   HelloWorldFunction                      -                                     
CREATE_COMPLETE                         AWS::CloudFormation::Stack              sam-sample                              -                                     
-------------------------------------------------------------------------------------------------------------------------------------------------------------

CloudFormation outputs from deployed stack
--------------------------------------------------------------------------------------------------------------------------------------------------------------
Outputs                                                                                                                                                      
--------------------------------------------------------------------------------------------------------------------------------------------------------------
Key                 HelloWorldFunctionIamRole                                                                                                                
Description         Implicit IAM Role created for Hello World function                                                                                       
Value               arn:aws:iam::XXXXXXXXXXXX:role/sam-sample-HelloWorldFunctionRole-11AUZUABC6ASS                                                           

Key                 HelloWorldFunction                                                                                                                       
Description         Hello World Lambda Function ARN                                                                                                          
Value               arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:sam-sample-HelloWorldFunction-y2SU9rABc52s                                           
--------------------------------------------------------------------------------------------------------------------------------------------------------------

Successfully created/updated stack - sam-sample in ap-northeast-1
$ 

ガイド付きなので何回か質問があるので確認して選択しましょう。
Stack Name は、自分で決める任意の名称になります。

ちなみに次回以降の更新の時は選択内容が保持されるため sam deploy コマンドでサクッとデプロイできます。

$ sam deploy
Uploading to sam-sample/287342c7c37cb1d8020451b36647bd1f  452838 / 452838  (100.00%)

        Deploying with following values
        ===============================
        Stack name                   : sam-sample
        Region                       : ap-northeast-1
        Confirm changeset            : True
        Deployment s3 bucket         : aws-sam-cli-managed-default-samclisourcebucket-bncdmvrv3w3n
        Capabilities                 : ["CAPABILITY_IAM", "CAPABILITY_AUTO_EXPAND"]
        Parameter overrides          : {}
        Signing Profiles             : {}

Initiating deployment
=====================
Uploading to sam-sample/17c228278a608cc7c3f55da042cf1ae7.template  768 / 768  (100.00%)

Waiting for changeset to be created..

CloudFormation stack changeset
-------------------------------------------------------------------------------------------------------------------------------------------------------------
Operation                               LogicalResourceId                       ResourceType                            Replacement                           
-------------------------------------------------------------------------------------------------------------------------------------------------------------
* Modify                                HelloWorldFunction                      AWS::Lambda::Function                   False                                 
-------------------------------------------------------------------------------------------------------------------------------------------------------------

Changeset created successfully. arn:aws:cloudformation:ap-northeast-1:XXXXXXXXXXXX:changeSet/samcli-deploy1651457546/3cc5876f-4d81-a290-7cbc821840ed-5d26


Previewing CloudFormation changeset before deployment
======================================================
Deploy this changeset? [y/N]: y

2022-05-02 02:12:41 - Waiting for stack create/update to complete

CloudFormation events from changeset
-------------------------------------------------------------------------------------------------------------------------------------------------------------
ResourceStatus                          ResourceType                            LogicalResourceId                       ResourceStatusReason                  
-------------------------------------------------------------------------------------------------------------------------------------------------------------
UPDATE_IN_PROGRESS                      AWS::Lambda::Function                   HelloWorldFunction                      -                                     
UPDATE_COMPLETE                         AWS::Lambda::Function                   HelloWorldFunction                      -                                     
UPDATE_COMPLETE_CLEANUP_IN_PROGRESS     AWS::CloudFormation::Stack              sam-sample                              -                                     
UPDATE_COMPLETE                         AWS::CloudFormation::Stack              sam-sample                              -                                     
-------------------------------------------------------------------------------------------------------------------------------------------------------------

CloudFormation outputs from deployed stack
--------------------------------------------------------------------------------------------------------------------------------------------------------------
Outputs                                                                                                                                                      
--------------------------------------------------------------------------------------------------------------------------------------------------------------
Key                 HelloWorldFunctionIamRole                                                                                                                
Description         Implicit IAM Role created for Hello World function                                                                                       
Value               arn:aws:iam::XXXXXXXXXXXX:role/sam-sample-HelloWorldFunctionRole-11AUZUANR6ASS                                                           

Key                 HelloWorldFunction                                                                                                                       
Description         Hello World Lambda Function ARN                                                                                                          
Value              arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:sam-sample-HelloWorldFunction-yrJDo52s2SU9                                         
--------------------------------------------------------------------------------------------------------------------------------------------------------------

Successfully created/updated stack - sam-sample in ap-northeast-1
$ 

Outputs に作成されたLambda関数のARNが表示されているので確認して、AWSコンソールからLambdaを確認してみましょう。今回の例だとLambda関数名は sam-sample-HelloWorldFunction-yrJDo52s2SU9 になります。

デプロイされたLambdaの設定を画面を確認すると --capabilities CAPABILITY_IAM CAPABILITY_AUTO_EXPAND オプションのおかげで必要なロールが自動作成されていることがわかります。

image.png

もちろん app.py の内容がLambdaの コードソース 部分で確認できると思います。

image.png

あとは通常のコンソール操作のtestから動作確認可能です。簡単ですね。

まとめ

お疲れ様でした!

今回はLambdaでsamを使って作成してみました。簡単なLambdaであれば、AWSコンソールで十分なのですが、Lambdaと連携するAWSサービスが増えてくれるとAWSコンソールだけではどこに何を設定したか把握しきれず限界が来ると思います。
そこでプログラムを app.py に、環境設定を template.yml にしておけば非常に管理しやすくなりますね。(テキストなのでGitでバージョン管理したり差分比較したり簡単になります)
samを使ってプログラムに集中出来るサーバーレスLambdaがもっと便利になって、開発者はより業務ロジックに集中出来る世の中になれば良いなと思います(^^)

本投稿が少しでも皆さんの良いサーバーレスライフの助けになればと思います(_ _)

AWS Amazon Lightsailなら固定IPも無料!Lightsailを使って運用料金最安値?でWordPress(ブログ)を運用する

概要~LightsailでWordPress構築・固定IPアドレス設定~

いろいろ調べたところWordPressを使ったブログ運用にはAWSのAmazon Lightsailを利用するのが最安値で最も簡単なのではないか?という結論に達したためAmazon LightsailでWordPressを構築する手順を投稿します。

運用料金

月額 $3.5 安い!
しかも今なら最初の3か月間は無料!

構築時間

15分

できるようになること

  • WordPressにログインできる
  • ブログが公開できる

作業手順

  1. インスタンス作成
  2. WordPressログインパスワードの確認
  3. 静的IPの設定
  4. WordPressログイン確認

たったの4手順作業時間15分でWordPressが構築できブログが公開できます!
それでは詳細手順を見ていきましょう。

1.インスタンス作成

まずはWordPressを構築するインスタンスを作成します。
AWSコンソールでAmazon Lightsailのサービスメニューを開き、インスタンスの作成をクリックします。

作成するインスタンスの種類を選択する画面に遷移します。
特にこだわりがなければすべてデフォルトの設定のままで良いと思います。
今回はWordPressの構築なので設計図の選択でWordPressが選択されていることを確認しましょう。

インスタンスプランの選択で月額料金が決定します。
人気ブログになったら変更しないといけないかもしれませんが、初期構築は最小で十分だと思うので、月額$3.5を選択します。
以上で設定は完了のため最後にインスタンスの作成をクリックします。簡単ですね。

無事に作成されると以下のように作成されたインスタンスが確認できる画面になります。

2.WordPressログインパスワードの確認

それでは次の手順に移ります。
次は作成されたインスタンスのWordPressにログインするためのパスワードを確認します。
パスワード確認にはインスタンスにsshでログインする必要がありますが、Amazon Lightsailの場合、ブラウザから簡単にログインできます。
具体的には以下の接続用ボタンを押します。(ちょっとわかりにくいですが、赤枠で囲んでいるオレンジの■部分です)

自動的にログインされ、以下のターミナルがブラウザで表示されます。

パスワードはファイルに記載されているため以下のコマンドを実行します。

cat $HOME/bitnami_application_password

ここではpasswordと表示されたとして手順を進めます。

3.静的IPの設定

設定としては最後の手順になります。
今のままでもWordPressにアクセスでき、ブログ公開もできるのですが、IPアドレスが変わってしまう可能性があり、不便なので固定の静的IPを設定します。
この静的IPアドレスは追加料金無し無料で設定できます。

それでは設定していきます。
まずはAmazon Lightsailのホーム画面に戻りネットワーキングをクリックします。

ネットワーキングのサービスメニューから静的IPの作成をクリックします。

インスタンスへのアタッチで作成したインスタンスを選択し、

作成ボタンで完了です。

完了画面に静的IP(18.XXX.XXX.XXX部)が表示されます。(画像はマスクしています)

4.WordPressログイン確認

準備は全て整いました!
後はログインするだけです。
ログイン用アクセスURLは以下になります。

http://{18.XXX.XXX.XXX(静的IP)}/wp-login.php

WordPressのログイン画面が表示されるので、WordPressの初期ユーザ(user)と、前の手順で確認したパスワードを入力してログインします。

無事にダッシュボードが表示されれば作業完了です。
お疲れ様でした!
後はWordPressを使ってサクッとブログを公開してしまいましょう。

まとめ

作業手順は4手順で作業完了です。
具体的な手順としてもコマンド1つだけであとは画面操作だけなので非常に簡単だったのではないでしょうか。
しかも月額$3.5です。Amazonさん凄いです。
しばらくこれで運用して様子を見ようと思います。(このブログもAmazon Lightsailで運用しています)

補足

最後補足としてAmazon Lightsailのさらに便利なところを紹介していきます。
それは管理画面からいろいろ確認できるところです。
管理画面は以下からアクセスします。

管理画面にアクセスすると以下のサービスメニューが表示されます。
ここでは、便利そうなものをいくつか紹介します。

まずはメトリクス。いろいろ見れるようです。

CPUの概要はこんなグラフです。

送信ネットワークトラフィックだとこんな感じ。

ネットワーキングでファイアフォール設定も確認できました。

履歴でインスタンスの変更履歴が確認できるようです。

削除も簡単にできそうです。

以上!Amazon Lightsailかなり簡単!便利!!安い!!!のではないでしょうか。

AWS ECSでDocker環境を試してみる

概要

AWS資格取得に向けて利用してみたAWSサービスの具体的な利用方法についての投稿です。
今回はAWS上でのDocker利用、 Amazon ECS(Amazon Elastic Container Service)を利用してみる編です。15分程度でDockerを利用したWebアプリケーションが公開できます。
勉強していてコンテナ、タスク、サービス、クラスターと言った用語に混乱してきたので実際にやってみました^^;

資格試験の勉強法は記事は以下を参照。

AWS初心者がAWS 認定ソリューションアーキテクト – アソシエイト資格試験に合格した時の勉強法
AWS初心者がAWS 認定ソリューションアーキテクト – プロフェッショナル資格試験に合格した時の勉強法

想定読者

  • AWSでコンテナと言えばECSって気がするけど実際どうやってECS上でコンテナを動かすか知りたい人
  • ECSのコンテナ、タスク、サービス、クラスターをAWSコンソールで確認して理解を深めたい人

できるようになること

  • Amazon ECSでのWebアプリケーションの公開

およその作業時間

  • 15分
  • ECSの「今すぐ始める」メニューをやってみます
  • すべてデフォルト値でも構築できその場合、5クリック5分で完了します^^;

必要な知識

  • Docker
  • Amazon ECS

予想料金

残念ながら無料ではありません。今回利用するのはAmazon ECSのFargate起動タイプになるので以下の料金がかかります。

image.png
参照元:https://aws.amazon.com/jp/fargate/pricing/

CPUのvCPU単位とメモリのGB単位で料金がかかります。あと、ポイントなのはコンテナイメージのダウンロードを開始した時点からということですね。コンテナの起動有無に関わらず作成したら途中でコンテナ停止しても料金がかかっていることになります。(と言っても後述の必要なタスクの数で定義したコンテナが常時起動するので停止はあまり意味がないようです^^;)

今回の作成サンプルでざっくり計算するとCPU:0.25 vCPU(256)、メモリ:0.5GB(512)を利用するので、仮に一週間起動し続けたとすると

  • CPU:0.05056USD x 0.25vCPU x 24時間 x 7日 = 約2.12USD
  • メモリ:0.00553USD x 0.5GB x 24時間 x 7日 = 約0.46USD

合計 約2.58USD となります。
お試しであれば1日24時間も起動することはないと思うので安い!のではないでしょうか。
(もちろん他のサービス同様、使用用途によってはデータ転送量やCloudWatch利用料とかが追加されることはあるのでご注意ください)

手順の概要

ではやってみましょう。
とは言うものの、ECSの「今すぐ始める」メニューのウィザードに従って入力するだけです。
最初に全体像だけ説明すると、ECSの概念としては、

image.png

図のように、Container definitionTask definitionServiceClusterの4つがあり、こらをウィザードに従って3画面で設定してきます。

これがAmazon ECS理解の最初のハードルと思ったコンテナ、タスク、サービス、クラスターといった用語による混乱です。
それぞれの説明は以下のブラックベルト資料が分かりやすいと思いますが、なんとなく画面を進めながら設定値を眺めながらやっていくと理解できるようになると思います。

image.png
参照元:https://www.slideshare.net/AmazonWebServicesJapan/20200422-aws-black-belt-online-seminar-amazon-elastic-container-service-amazon-ecs

では、始めます。
ECSの初期画面、またはクラスターの今すぐ始めるをクリックして開始します。

image.png
または
image.png
今すぐ始めるをクリックして開始します。(クリック1回目)

Container definition/Task definition設定

最初の画面でContainer definitionとTask definition設定を行います。
コンテナ定義では、デフォルトでhttpd、nginx、tomcatが用意されています。(今回はhttpdを選択)
コンテナ定義、タスク定義いずれも右上に編集ボタンが用意されており、一部パラメータのカスタマイズは可能です。
料金の所で書いたようにCPUとメモリは料金に関係してくれるの編集でカスタマイズしても良いと思います。
とりあえず今回はデフォルトのままをクリック。(クリック2回目)

image.png

Service設定

次はサービス設定です。ロードバランサーとしてALBを組み込めるようですが、とりあえずなしを選択。
この画面も編集ボタンで料金に関係する必要なタスクの数をカスタマイズできます。ただデフォルト値の1から減らすことはできないので、最小限という意味ではこのままをクリック。(クリック3回目)

image.png

Cluster設定

最後にクラスター設定です。と言ってもクラスター名だけなのでデフォルトのままをクリック。(クリック4回目)

image.png

確認画面

確認画面が表示されるので、確認して作成をクリック。
以上!クリック5回で作成完了です!!

image.png

作成画面

内部的にはCloudFormationを使っているようなので、頑張ってVPCから作ってくれていて問題がなければ2,3分後に作成されます。

image.png
2,3分後、、、
image.png

サービスの表示をクリックしてみましょう。
作成されたVPCやサブネット、セキュリティグループの情報が確認できす。

image.png

タスクタブから作成されたタスクをクリックすると

image.png

パブリックIPが割り当てられているので、
http://{割り当てられていたパブリックIP}/
でアクセスしてみます。

image.png

↓が表示されていれば問題なく作成できています。
AWS ECSでのWebアプリケーションの公開完了です!

image.png

実体としては、コンテナ定義の中に定義されている以下のようです。

image.png

はい、クリック5回完了です。
あとはコンテナ定義などいじくり倒しましょう^^

コンテナ確認

ここからは作成されたものを1つ1つ見てみます。まずはコンテナから。
タスク定義のなかにコンテナ定義があります。

image.png

ポートマッピングやマウントポイントなど、コンテナ定義の名前そのままと言ってしまえばそれまでですが、Dockerfileの内容に関連する定義があることがわかります。

タスク確認

次はタスク定義です。

image.png

まず、タスク定義の中にコンテナ定義が含まれています。それに加えて、ネットワークモード、ロールやタスクサイズ(メモリやCPU)がタスク定義として役割のようです。(ブラックベルト資料の具体的定義がこの画面で確認できます)

サービス確認

次はサービスです。クラスターメニューから具体的なサービス名をクリックして確認します。

image.png

まずは必要数(必要なタスクの数)があって、加えてロードバランシング設定、VPCやサブネットといったネットワークアクセス設定があります。

image.png

タスクタブに移動するとタスク定義があり、この画面から複数タスク定義設定が可能なことがわかります。

クラスター確認

最後はクラスターです。

image.png

複数サービスを定義できる画面構成です。
ブラックベルト資料では、実行環境、IAM権限の境界と表現されています。
サービス定義、タスク定義でどのコンテナ定義をまとめるかにも依存すると思いますが、ロードバランシングがサービス定義にあることから、Webサーバ群のサービスとAPサーバ群のサービスの2つのサービスを1つのクラスター配下に定義する。といった使い方がイメージしやすいかなと思います。

補足1:自作Webアプリケーションのコンテナイメージの設定

Container definitionのcustom設定ボタンで自分で作成した今回のようなhttp(80ポート)のWebアプリケーションのコンテナイメージを指定するだけで簡単にWebアプリケーションの公開ができそうですね。

image.png
開いた画面でコンテナのイメージを設定
image.png

コンテナイメージの作成には以下の記事も投稿しているので参考までに。

Windowsで構成情報をDockerfileに定義してイメージを作成してみる

補足2:作成したタスクの停止

試しにタスクタブから停止してみても、、、

image.png

1,2分で再PROVISIONINGされ

image.png

すぐにRUNNING状態になります。

image.png

補足3:作成したWebアプリケーションの削除

クラスターメニューのクラスターの削除から簡単にできます。
CloudFormationを使っているのでVPCからコンテナのタスク定義までまるっと削除されます。
残しておくと料金がかかり続けるので不要になったら必ず削除しましょう。

image.png

まとめ

想像したよりずっと簡単に作成できました。
誰かのコンテナ、タスク、サービス、クラスター理解に役立てればと思います。
今のままだとデフォルト設定のままなので今後は設定内容等、もう少し詳しくみてみる。。。かもしれません(^^;)

AWS EC2 でDocker環境を無料で試してみる

概要

少し前にWindowsにDockerをインストールしていろいろ試してみてたけど
そもそもAWS EC2の方が気楽にいろいろ試せるのでは?と思ってやってみた
思った以上に簡単にできたのでそのやり方を記載

windows版は以下を参照

 WindowsでDocker環境を試してみる

AWS ECS版は以下を参照

 AWS ECSでDocker環境を試してみる

Docker本は以下が詳しくわかりやすいオススメ本です

プログラマのためのDocker教科書

【Kindle版】プログラマのためのDocker教科書


できるようになること

  • AWS EC2でのDocker環境の構築

およその作業時間

  • 10分
  • 5コマンドで完了

必要な知識

  • AWS EC2
  • SSH
  • Docker知識^^;

手順の概要

1.EC2インスタンス作成
2.AMI選択
3.インスタンスタイプ選択
4.インスタンス確認
5.接続用キーペア設定
6.EC2にDockerインストール

参考:公式 Amazon Linux2 に Docker をインストールする

1.EC2インスタンス作成

とりあえずEC2インスタンスを作成するためAWSコンソールからEC2からインスタンス起動を選択

image.png

2.AMI選択

無料枠のAmazon Linux 2を選択

image.png

3.インスタンスタイプ選択

こちらも無料枠を選択し、あとはデフォルトのまま「確認と作成」をクリック

image.png

4.インスタンス確認

作成されるインスタンスをふんふんと確認し、「起動」ボタンをクリック

image.png

5.接続用キーペア設定

SSH接続のために新しいキーペアか既存のキーペアをからキーペアを設定
(画面は既存のキーペアを設定)
最後に「インスタンスの作成」をクリック

image.png

EC2が作成されるまで2,3分待ちましょう。。。

6.EC2にDockerインストール

EC2が作成されたらSSHで接続します
SSH接続の説明は割愛
↓あたりを参考

https://dev.classmethod.jp/cloud/aws/aws-beginner-ec2-ssh/
image.png

SSH接続後、いよいよDockerインストールのコマンドを実行していきます
とりあえずインストールされているパッケージ更新

sudo yum update -y
image.png

完了するとこんな感じ

image.png

いよいよDockerインストール

sudo amazon-linux-extras install docker
image.png

途中確認が表示されたら「y」とか入力

image.png

あっという間にインストールが完了
するとこんな感じ

image.png

インストールできたのでサービス起動

sudo service docker start
image.png

sudo を使用せずに Docker コマンドを実行できるように、ec2-user を docker グループに追加

sudo usermod -a -G docker ec2-user
image.png

一度EC2からログアウト、再度SSH接続する
すると、、、dockerコマンドが普通に使えるように

docker info
image.png

はい、簡単5コマンドでDockerインストール完了です
あとはDockerをいじくり倒しましょう^^

まとめ

想像するよりずっと簡単に環境構築できました
AWSなのでここでいろいろDocker試してみて使い終わったら消してしまえば無料です
消すときはAWSコンソールで↓で完了
EBSとか残ってると微量請求がきてしまうのでまとめて消しておきましょう^^;
時々やってしまうAWSから突然微量請求きてしまうあるあるかと

image.png

EBSの料金について以下に参考記事を書きました。良かったらこちらも^^

 AWS初心者がEC2を最低限の利用料金で利用する