月別アーカイブ: 2022年9月

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がもっと便利になって、開発者はより業務ロジックに集中出来る世の中になれば良いなと思います(^^)

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

Java初心者がJavaのプロになるためのおすすめ本

概要~Java初心者が現場使えるJavaプログラムを理解するまでのおすすめ参考書ロードマップ~

仕事を始めてJavaに取り組むようになった方は多いのではないでしょうか。
私も実は仕事を始めて初めてJavaを知った/勉強したのですが、最初色んな言葉が出てきて大混乱。勉強が結構大変だったことを覚えています。

そんな経験があったため、最近入ってくる新人さん向けに私が10年働く間にJava初心者に何を学んでもらえばいいか考え、行き着いた結果の良質と考えている参考書10選を今回紹介します。

つまり、個人的Java初心者が現場使えるJavaプログラムを理解するまでの参考書ロードマップの紹介です。

想定読者

  • 仕事を始めてJavaプログラムが必要になった人
  • Javaの勉強を始めて専門用語が多過ぎて勉強に挫折しそうな人

結果

忙しい人はとりあえず結果だけご覧ください。

Java良書10選

  1. やさしいJava
  2. スッキリわかるJava入門
  3. スッキリわかるJava入門 実践編
  4. リーダブルコード
  5. オブジェクト指向でなぜつくるのか
  6. Webを支える技術 ―― HTTP,URI,HTML,そしてREST
  7. 独習Java
  8. プロになるJava
  9. Java言語で学ぶデザインパターン入門
  10. Effective Java

やさしいJava

それでは紹介です。最初はやさしいJavaです。

やさしいJava

まず最初の一冊はわかりやすさを重要視して選んでいます。なぜならJavaの特徴として、他の言語に比べわかりにくい専門用語多く、初心者にはプログラムの理解より言葉の理解最初のハードルがまず高い事が挙げられるからです。

そのため、Javaの入門書は今となってはたくさんありますが、まずは入門書としてタイトルの通り非常にわかりやすいこの本から入るのがいいかなと思っています

スッキリわかるJava入門

次はスッキリわかるJava入門です。

スッキリわかるJava入門

Javaの入門書は1冊ではちょっと物足りないため、もう一冊入門書的な位置づけの本を入れています。
2冊を読み比べて重要なところ、1冊では理解できなったところをもう1冊で補完して、自分の理解力を高めることが重要と考えています。
Javaは1冊だけでは書ききれない重要な概念が多いため、出来れば2冊入門書を読みましょう。

スッキリわかるJava入門 実践編

次はスッキリわかるJava入門の続編、スッキリわかるJava入門 実践編です。

スッキリわかるJava入門 実践編

1歩進めて実践編が本書になります。実際に現場で使える内容となっているので、基礎を理解した上で、読み進めるといいかなと思います。

リーダブルコード

次はリーダブルコードです。
ちょっと箸休めです。

リーダブルコード

内容を知っている人は、なぜここでリーダブルコード?と思う人もいると思うのですが、私はこのタイミングがベストと思います。
プログラム初心者が読む本として位置付けされることもあると思いますが、私はJavaが分かってから読むべき(一度読んでいても再読すべき)と考えています。
自身でJavaコードをある程度書けるようになってからこの本を読むとよりリアルな気づきがあると思います。そう言えばあの時書いたあのコード、リーダブルではなかったな。など。

オブジェクト指向でなぜつくるのか

次はオブジェクト指向でなぜつくるのかです。
こちらもJavaに特化した内容ではないため箸休め第2弾です。

オブジェクト指向でなぜつくるのか

そもそもなぜJavaがここまで流行ったのか、オブジェクト指向はどんなに便利なのか、Javaでオブジェクト指向で作るというのはどういうことなのか理解するのに良い本と考えています。

Webを支える技術 ―― HTTP,URI,HTML,そしてREST

次はWebを支える技術 ―― HTTP,URI,HTML,そしてRESTです。
箸休め第3弾(最後の箸休め)です。そろそろプログラムを見ることに疲れた人向けです(^^;)

Webを支える技術 ―― HTTP,URI,HTML,そしてREST

皆さんがJavaを勉強する理由は様々だと思いますが、最近はWebシステムを作るケースが多いのではないでしょうか。
そんな人向けの本になっているので、私はWeb関係ないという人は飛ばしてもらっていいのですが、Javaで「HTTP,URI,HTML,そしてREST」をプログラミングするという人はぜひ読んでおいてください。
コードが書けるだけではWebシステムは完成しません。なぜそのようなコードが必要かを理解できるようになると思います。

独習Java

箸休めが終わりまとめ編になります。
まとめ関連のおすすめは独習Java です。この本を読んで基礎の振り返りをしっかりする、自信の技術力として定着化するイメージで選んでいます。

独習Java

この本は昔からある良書の扱いになるので教科書的な本になります。そのため丁寧なのですが、最初の1冊としては他の本に読み易さという点で譲りましたが、重要なポイントの抑え方、記載テーマ、サンプルコードなどがやはり入門本からは1つレベルアップしたような教科書的な良書 になっています。いつでも振り返れるよう手元に置いておきたい内容になっています。

プロになるJava

次はプロになるJavaです。
タイトルの通りですが、ここからプロになりましょう(^^)

プロになるJava

ここまでで基礎を固める -> 実践を学ぶ -> プロになる というレベルアップを想定しています。
印象としては、実践を学ぶ -> プロになる 部分はちょっと飛躍的レベルアップなのですが、その部分は実際に自分の手を動かしてプログラミングした結果や実際やったこと読んだことをGoogle検索等で補完しながらレベルアップすることを想定しています。(ここまで読んだ読者ならそれが出来るだけのレベルアップがされていると考えています)

Java言語で学ぶデザインパターン入門

プロになったら次はデザインパターンを学びましょう。

Java言語で学ぶデザインパターン入門

正直プロなったところがJavaで給料をもらえるというスタートラインと思います。
つまり、ここまでのJavaプログラマーでは現場で技術力の差別化が出来ません。
そこで、オッこの人はJavaがかなり出来るなと思ってもらえるようにデザインパターンを学びましょう。
現場でこれはファクトリーデザインパターンですね。なんて、会話が出来るとJavaで自信をもって仕事をしているなと言えると思います。

Effective Java

ついに最後の1冊、10冊目です。
Effective Java です。

Effective Java

もはや説明はいらないくらいJavaをしっかり勉強したことがある人なら誰でも知っている名書と思います。
ただ、いきなりこの本を読んで理解できる人は少ないと思うので今回の最後の1冊として紹介する形で記載しました。
皆さんもぜひここまで読み進めてみてJavaの理解を深めてください!

まとめ

今回は、Java初心者が現場使えるJavaプログラムをプロとして理解するまでのおすすめの参考書10冊を紹介しました。
これらを理解すれば間違なく私はJavaのプロフェッショナルです。と、自信をもって仕事ができる人材になれるかなと思って選抜しているので、これからJavaを頑張ろうと思っている人がいたらぜひ参考に1冊でも読んでみてください。

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