あまぶろぐ

インフラと趣味のゆるいブログ

インフラエンジニア、初めてのLambda(前編)

コードを書いたことがないインフラエンジニア(私)が、独学でLambdaを触って、「ハマった部分」を記載。同じように初めて触る方の参考になればと。記事は2回(前編、後編)に分けます。

Lambdaの設定

Lambdaはサーバーレスでコードを実行できるサービスです。

AWS Lambda(イベント発生時にコードを実行)| AWS

 

「なんらかのイベント」をトリガーにLambdaを動作させるというもののようです(私の理解)。設定方法としては2つあります。

(1)Lambdaの設定画面でコードを直接入力する
(2)Lambdaが備えていないライブラリを実行したい場合は、「外部ライブラリ」と「コード」をパッケージ化してzip化したものをLambdaに登録

素人には(1)と(2)の区別をどうすればよいのか?がすぐにはわかりません。現時点(2021/7時点)での私の理解は、下記サイトのコードであれば(1)でよいのではと思ってます。間違っていれば別途訂正します。

Lambda — Boto3 Docs 1.18.2 documentation

いろいろなサイトをみるとサンプルコードが公開されています。その中で、「外部ライブラリ」の記述がなければ、(1)で実行できると思っています。
ここでハマったことの1つ目です。後述しますが、Lambdaを設定するコンソールの操作を間違っていたため、意図した通りLambdaが動作しませんでした。当初は操作の誤りという認識がなかったため、上記の(1)で動作しないので(2)でやる必要があるのか?と思い込んでました。

 コードの中身

上述の通り、Lambdaは「なんらかのイベント」をトリガーとします。素人的には「そのトリガーを受け取ったLambdaが、コードに記載された値を実行する」と考えていました。この先入観をもって、世の中のサンプルコードを見ていたので中身を理解できなかったことが、ハマったことの2つ目です。
私の検証では、「CloudWatch Events」をトリガーにLambdaを動作させるというものでした。いくつかのサンプルコードでは、CloudWatch Eventsの中に「値」を入れてLambdaのコードは「変数」という構造でした。コードを書く人はこのような構造が多いんですかね。今回の検証内容を運用で利用する場合、Lambdaは1つだけ設定し、CloudWatch Eventsを複数作成するとなりますが、そちらの方が運用に最適だなと気付かされました。

(検証内容、参考にしたサイト)

CloudWatchアラームに定時ダウンタイム設定をいれる - Qiita

CloudWatchAlarmにLambdaでダウンタイム設定をいれてみた | DevelopersIO

本当に勉強になりました。ありがとうございました。

 

 操作方法、コードの保存

ハマったことの3つ目です。操作方法です。Lambdaの設定画面で、コードを保存しました。その際にデフォルトの名前「lambda_function.py」から異なる名前にしました。拡張子を「.py」としなかったためコードが読まれませんでした。サンプルコードが記載されたサイトではコードの文字列がカラフルでしたが、私のLambdaの画面は「黒文字のみ」だったため、不思議でした。また、テスト機能にどんな値を入れて良いのかわからず、切り分けができませんでした・・・

 

以上が前編です。後編は実際の操作画面を記載します。

Run Commandでシェルを実行、その結果をメール通知

(やったこと)

AWS Systems ManagerのRun CommandからEC2へPowerShellのコマンドを投げる
・その結果をAmazon SNSでメール通知

ここでいう「結果」とは、PowerShell実行の「成功」「失敗」であり、EC2上で実行されたPowerShellの結果が通知されるものではなかった・・・この検証を始めた目的は、「EC2上で実行されたPowerShellの結果を通知させる」だったので残念な結果となりました。

 

(流れ、手順)

  1. SNS、IAM関連の設定
    下記サイトを参考に、SNS、IAMポリシー、ロールの設定を行います。私は「タスク5」の設定を間違ったため、「ハマり」ました。SNSからのメールが届かず何度も設定を見直しました。

    docs.aws.amazon.com

  2. Systems Manager Run Command の設定
    Systems Manager の画面より、Run Command を選択します。

    f:id:risooh:20210715223002p:plain

    Systems Manager
    Run Command より、EC2上で実行したスクリプトを選択します。今回はWindowsOSなので、PowerShellを検索します。

    f:id:risooh:20210715223353p:plain

    PowerShellで検索

    f:id:risooh:20210715223450p:plain

    PowerShellを実行できるコマンド
    上記を選択後、EC2のWindowsOS上で流したいコマンドを入力します。今回はCドライブの容量をチェックしたかったので、「fsutil」を実行します。

    f:id:risooh:20210715223603p:plain

    コマンド
    次の対象のEC2を選択します。

    f:id:risooh:20210715223734p:plain

    EC2を選択
    SNS及びロールを紐づけます。

    f:id:risooh:20210715223829p:plain

    以上で設定完了です。Run Commandを実行し、その結果を確認する画面が以下です。

    f:id:risooh:20210715223933p:plain

    結果
    EC2のCドライブの状況を確認できました。その結果の通知メールが以下です。

    f:id:risooh:20210715224033p:plain

    メール
    冒頭に記載したように「Run Command」の実行結果が通知され、Cドライブの状況は記載がありませんでした。ロール、ポリシー関連で「ハマった」ため時間がかかった上に、期待した結果が得られず、とても疲れました。







2021年7月の目標

ブログを書き始めたのは、以下が理由です。

  • エンジニアとして、技術に関わり続けたい(マネジメントだけは嫌)
  • エンジニアとして、手を動かしたい(週に2-3日は技術に触れたい)
  • エンジニアとして、表現するスキルを向上させたい

正直、そんなにスキルがあるわけではないです。ここ5年はExcelパワポ職人で「マネジメント」がメイン業務でした。エンジニアとしての在り方を考えるようになり、それがきっかけで転職することになりました。なので、(三日坊主になろうとも)自分の好きな「クラウドに関するインフラブログ」を書き始めました。ここら辺の話はおいおい。

2021年7月の目標

  1. 技術ブログを3本書く!(技術ブログ以外は別に1本)
  2. ブログの見やすさを向上させる!(図、または絵を一度はアップする)
  3. 技術本を4冊読む!(2冊は読み終わりたい)

 

「3.技術本を4冊読む!」ですが、以下の4冊を購入しました。読むだけにならないように・・・

 

 

 

 


 

EC2(Windows)のEBSを異なるEC2にマウントする

(やりたいこと)

  1. WindowsServer にEBS追加、ディスク拡張、ファイル作成
  2. 「1.」からEBSをデタッチ
  3. デタッチしたEBSを別Serverにアタッチ、ファイルがちゃんと見えるか?

 

(実現方法)

  • EBSのアタッチ、デタッチ
  • 別Server(WindowsOS) 上でディスクの有効化、ドライブの割り当て

 

(やったこと)

  1. 1台目のWindowsServerにEBSをアタッチ                  ①EC2ダッシュボードより、「Elastic Block Store>ボリューム」を選択。   ②EBSボリュームを作成する。アクセスする「アベイラビリティーゾーン」は、1台目のWindowsServerと同じであること。                          ③「アクション>ボリュームのアタッチ」を選択して、1台目のWindowsServerにアタッチ。                                     ④1台目のWindowsServerにログインして、OS上でディスクの有効化、ドライブ割り当て。その後、OS上で該当ドライブに作成したテストファイルを保存。          
  2. 1台目のWindowsServerからEBSをデタッチ                 ①EC2ダッシュボードより、「Elastic Block Store>ボリューム」より、「アクション>ボリュームのデタッチ」を選択して該当のEBSボリュームをデタッチ。
  3. 2台目のWindowsServerにEBSをアタッチ                  ①EC2ダッシュボードより、「Elastic Block Store>ボリューム」を選択。           ②アクション>ボリュームのアタッチ」を選択して、2台目のWindowsServerに該当のEBSボリュームをアタッチ。                            ③2台目のWindowsServerにログインして、OS上でディスクの有効化、ドライブ割り当て。その後、OS上で該当ドライブ上に1台目で作成したファイルが存在することを確認。

(雑談)

オンプレ・仮想化環境において、1つのOSに複数のストレージボリュームをアタッチすることはよくあること。それがAWSでも可能なことが確認できた。その際は、EBSとEC2は同じアベイラビリティーゾーンである必要がある。

AWS Systems Manager でWindows Server にRDPする!

(やりたかったこと)

・プライベートサブネットのEC2(Windows)をRDPでメンテナンスする

・踏み台サーバは作りたくない

 

(実現方法)

AWS Systems Manager(SSM)でWindows Server にRDPする

 1.マネージドインスタンスにする

 2.SSMセッションマネージャーを使う

 

(はまったこと)

●パブリックサブネットとプライベートサブネットで実現方法が異なっていた

  ・パブリックサブネットでインターネットにアクセスできれば「SSM」でアクセス可能

  ・プライベートサブネットでインターネットにアクセスできない環境であれば、「SSM+VPCエンドポイント」でアクセス可能

 

(前提条件)

VPC、プライベートサブネット、EC2を事前に作成する

・SSMを利用するAWS用のユーザ(ssmuser)を作成する

・パソコンにAWS CLI、SSMプラグインをインストールする

・SSM用のグループ(AWSSSMaccess-G)を作成、ssmuserを追加する

・AWSSSMaccess-Gに2つのポリシーをアタッチ

  ・AmazonEC2ReadOnlyAccess

  ・AmazonSSMFullAccess 

 

(やったこと)

1.マネージドインスタンスにする

 ①EC2(Windows)にSSM Agentを入れる(大体はデフォルトで入っている)

 

 ②SSM APIへの通信経路を確保する。SSM AgentからSSM APIへアウトバウンド通信が発生する。これを確保する。SSM Agentからインターネットにアクセスできない場合、VPCエンドポイントを利用してSSM APIへの経路を確保する。VPCに3つのエンドポイントを追加、EC2からの接続(443)を許可するSGを作成し、エンドポイントにアタッチ。

  ・com.amazonaws.ap-northeast-1.ssm

  ・com.amazonaws.ap-northeast-1.ec2messages

  ・com.amazonaws.ap-northeast-1.ssmmessages

 

 ③EC2にIAMロールをアタッチする

  ・IAMポリシー「AmazonSSMManagedInstanceCore」をEC2用のIAMロールにアタッチ

 

 2.SSMセッションマネージャーを使う(セッションマネージャーで直接アクセス)

 ①パソコン側の操作

  ・aws configure、ssmuser のAccess Key ID、Secret Access Key、を入力

  ・aws ssm start-session --target EC2のインスタンスID --document-name AWS-StartPortForwardingSession --parameters "portNumber=3389, localPortNumber=13389"

  ・コマンドプロンプト画面で「Waiting for connections...」と表示されれば、RDP画面を起動

  ・アクセス先を「localhost:13389」とする

  ・WindowsのID、パスワードを入力する



参考文献:AWS BlackBelt , AWS Systems Manager