目次
概要
こんにちは、テクニカルサポートの牛山です。
今回は、SAM機能でバブリックプレビューされました「AWS SAM Accelerate」を使用してみたという記事になります。
「AWS SAM Accelerate」は、ローカルでインフラストラクチャをエミュレートしていたものを、クラウド上に開発環境としてデプロイし、テストを効率化するための機能となります。
リアルタイムでコード変更を監視し、実行時のログ内容をリアルタイムで表示させることができます。
サーバレス開発ではローカルでのエミュレートが複雑になる場合がありましたが、クラウド上でテストすることによりインフラの制度を高めることができます。
前提条件
- AWS SAMコマンドをインストール済みであること。
- AWS CLI IAMユーザをセットアップ済みであること。
- AWS CLI認証情報を設定済みであること。
環境
- Amazon Linux release 2 (Karoo)
ツール名 | バージョン |
---|---|
Python | 3.9.0 |
SAM CLI | 1.35.0 |
aws-cli | 2.4.0 |
プロジェクト作成
hello-worldチュートリアルプロジェクト使用し、EC2のリストを表示するものへ変えていきます。
sam init --app-template hello-world --name sam-tutorial --package-type Zip --runtime python3.9
プロジェクトを作成すると、以下のようなディレクトおよびファイルが生成されます。
今回さわるのは、 app.py
と template.yaml
を編集していくことになります。
tree sam-tutorial
sam-tutorial
├── events
│ └── event.json
├── hello_world
│ ├── app.py
│ ├── __init__.py
│ └── requirements.txt
├── __init__.py
├── README.md
├── template.yaml
└── tests
├── __init__.py
├── integration
│ ├── __init__.py
│ └── test_api_gateway.py
├── requirements.txt
└── unit
├── __init__.py
└── test_handler.py
デプロイおよび追跡
sam sync --watch
コマンド使用し、AWS SAMにファイルの変更を監視させ、変更が検出された場合、自動的にクラウドと同期するようになります。
※sam deployコマンドと同様にすべてのインフラストラクチャとコードをクラウド上にデプロイまたは更新します。
sam sync --watch --stack-name sam-app
実行するとβ機能であることと、syncコマンドは開発スタックにのみ使用してくださいという注意書きが出力され、β機能を有効にするか確認のため、質問されます。
今回、有効にしたいので、 yes とタイプしてEnterしてください。
その後、CloudFormationスタックにより、Lambda関数やApiGateway等のリソースが作成されます。
CloudFormation outputs from deployed stack項目、HelloWorldApi項目にApiGatewayのURLが出力されます。
Stack creation succeeded. Sync infra completed.
および Infra sync completed.
と出力されることを確認します。
コマンドは、ターミナルを奪うので、ターミナルを消さずに、新規ターミナルセッションを作成します。
リアルタイムログをターミナル上で有効化
すでにあるsam logsコマンドの強化版でAPI GatewayのログやAWS X-Rayからのログをトレースし画面上に出力させることが以下コマンドで可能となります。
sam logs --stack-name sam-app --include-traces --tail
こちらも、β機能であることが出力されコマンドを続行するか問われるので、 yes とタイプしてEnterしてください。
先ほど作成した、ApiGatewayのURLにアクセスします。
アクセスするとブラウザ上に {"message": "hello world"}
と出ます。
リアルタイムログターミナル上で確認すると、Lambdaを実行した際にCloudWatch Logsへ出力されるログ情報がリアルタイムでターミナル上に出力されつことを確認できます。
コマンドは、ターミナルを奪うので、ターミナルを消さずに、新規ターミナルセッションを作成します。
EC2インスタンスデプロイ
EC2のリストを表示させたいので、テンプレートファイルに、EC2デプロイ設定を記述します。
Resources:
セクション配下へ記載するようにします。
リファレンス:Amazon Elastic Compute Cloud resource type reference
diff -u template.yaml.org template.yaml
--- template.yaml.org 2021-11-23 04:52:37.192821433 +0900
+++ template.yaml 2021-11-23 06:41:52.738453504 +0900
@@ -25,6 +25,19 @@
Properties:
Path: /hello
Method: get
+ HelloWorldEC2:
+ Type: AWS::EC2::Instance
+ Properties:
+ ImageId: ami-0e60b6d05dc38ff11 # Amazon Linux 2 AMI (HVM) aws ssm get-parameter --name /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 --region ap-northeast-1
+ InstanceType: t3.nano
+ AvailabilityZone: ap-northeast-1a # 作成済みのものを指定します。
+ SubnetId: subnet-xxxx # 作成済みのものを指定します。
+ KeyName: "xxxx" # 作成済みのものを指定します。
+ BlockDeviceMappings:
+ - DeviceName: "/dev/xvda"
+ Ebs:
+ VolumeSize: 8
+ VolumeType: "gp2"
Outputs:
# ServerlessRestApi is an implicit API created out of Events key under Serverless::Function
デプロイおよび追跡ターミナルセッションで Stack creation succeeded. Sync infra completed.
および Infra sync completed.
と出力されることを確認します。
Lambda IAM Role権限付与
Lambda IAM RoleからEC2リストを表示できるようにするため、EC2の読み取り権限を付与します。
Resources:
-> HelloWorldFunction:
セクション配下に Policies:
へ設定します。
diff -u template.yaml_ec2 template.yaml
--- template.yaml_ec2 2021-11-23 06:41:52.738453504 +0900
+++ template.yaml 2021-11-24 05:52:09.543677670 +0900
@@ -25,6 +25,8 @@
Properties:
Path: /hello
Method: get
+ Policies:
+ - arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess
HelloWorldEC2:
Type: AWS::EC2::Instance
Properties:
デプロイおよび追跡ターミナルセッションで Stack creation succeeded. Sync infra completed.
および Infra sync completed.
と出力されることを確認します。
app.pyへEC2リスト表示処理追加
hello_world/app.py
にある、pythonファイルを編集します。
処理内容は以下となります。
EC2のAPIを叩いて、EC2に設定されているタグ情報を表示する内容となります。
diff -u hello_world/app.py.org hello_world/app.py
--- hello_world/app.py.org 2021-11-23 04:52:37.197821430 +0900
+++ hello_world/app.py 2021-11-22 16:26:07.670920678 +0900
@@ -1,4 +1,6 @@
+import datetime
import json
+import boto3
# import requests
@@ -33,10 +35,26 @@
# raise e
+ print("Invoking the updated function!")
+
+ data = [ ]
+ my_client = boto3.client( 'ec2' )
+ ec2_describe_instances_dict = my_client.describe_instances( )
+ #ec2_describe_instances_dict = event
+
+ print( '----------------------' )
+ print( datetime.datetime.now( ) )
+
+ for reservations in ec2_describe_instances_dict[ 'Reservations' ]:
+ for instances in reservations[ 'Instances' ]:
+ for tags in instances[ 'Tags' ]:
+ data.append( tags[ 'Value' ] )
+ print( tags[ 'Value' ] )
+
return {
"statusCode": 200,
"body": json.dumps({
- "message": "hello world",
+ "message": str( data ),
# "location": ip.text.replace("\n", "")
}),
}
変更を保存すると即座にクラウド上のLambda関数と同期されます。
動作確認
APIゲートウェイのURLにアクセスすると、ブラウザ上に {"message": "['HelloWorldEC2', 'sam-app', 'arn:aws:cloudformation:ap-northeast-1:************:stack/sam-app/f014c810-4bcf-11ec-9749-0a3950af64f5']"}
と出力され、無事に取得できていることが確認できます。
リアルタイムログターミナル上で確認すると、Lambdaを実行した際にCloudWatch Logsへ出力されるログ情報がリアルタイムでターミナル上に出力されることを確認できます。
後片付け
最後に作成したリソースの削除を実施します。
sam delete --stack-name sam-app
Deleted successfullyとなれば問題ありません。
他、aws-sam-cli-managed-default
スタックや、CloudWatchLogsのログが残ってしまっているので適宜、マネージメントコンソールから削除を実施してください。
※EC2キーペアの削除が必要であれば実施してください。
Are you sure you want to delete the stack sam-app in the region ap-northeast-1 ? [y/N]: y
Do you want to delete the template file 03ddef688595a94c949e6c8f76df1049.template in S3? [y/N]: y
- Deleting S3 object with key 9bc1c3cafbe33e60e22e60cd9faace55
- Deleting S3 object with key 2bf487d5fbd5d19e56c26fcda84adc06.template
- Deleting S3 object with key 03ddef688595a94c949e6c8f76df1049.template
- Deleting Cloudformation stack sam-app
Deleted successfully
まとめ
AWS SAM Accelerate機能便利ですよね。
開発速度が上がりそうです。
プロフィール
AWSの設計・構築をメインにおこなっています。
運用・保守をおこなう部署におりましたが、最近、アーキテクト課に異動しました。
日々精進しております。
LINK
クラウドベリージャム:プロフィールページ