工作と競馬

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

タグ:boto3

概要

boto3を使い、CloudWatchEventsでLambda Functionを呼ぶルールを設定した。最初、うまくルールが発動せずハマったことがあるので、注意点もメモっておく。


背景と目的

boto3から、AWSのCloudWatchEventsにルールを設定し、定期的にLambda Functionを実行しようと思ったので、方法を調べ、メモしておく。


詳細

1.boto3のドキュメントで方法を確認

CloudWatchEventsのルールを設定するには、boto3.client("events").put_ruleboto3.client("events").put_targetsを使う。

また、呼び出し側のLambda関数のpolicyにおいて、CloudWatchEventsから呼び出されることを許可必要がある。ここで、ハマってしまいうまく動かなかった。注意。


2.実装

実装したのは以下。ここでは、ルール名をboto3_test、ターゲットのLambda Functionをfor_testという名前のもの(内容は、ブランク関数。Hello world!を出力するだけ)、入力パラメータはjson文字列とした。

import boto3

# ルールを追加
ret_rule = boto3.client("events").put_rule(
    Name="boto3_test",
    Description=u"説明文",
    ScheduleExpression="cron(* * * * ? *)"
)

print json.dumps(ret_rule, indent=4)

# ターゲットを追加
ret_target = boto3.client("events").put_targets(
    Rule="boto3_test",
    Targets=[
        {
            "Id": "for_test",
            "Arn": "arn:aws:lambda:リージョン:アカウントID:function:for_test",
            "Input": json.dumps({})
        }
    ]
)

ここで、上記ソースコードを実行すると、エラーなく実行され、マネジメントコンソール上にも、有効なルールとして表示される。しかし、これだけではちゃんと動かない。

put_targetsの説明をじっくり読むと、

To be able to make API calls against the resources that you own, Amazon CloudWatch Events needs the appropriate permissions. For AWS Lambda and Amazon SNS resources, CloudWatch Events relies on resource-based policies.

とある。つまり、Lambda Function側のポリシーを設定してねということ。で、リソースポリシーはどう設定すればいいのかというと、こちらに記述があり、AWS Lambda Permissionの項を参考に、呼び出されるLambda Functionのポリシーを設定。


# Lambdaにパーミッションを追加
ret_lambda = boto3.client("lambda").add_permission(
    FunctionName='for_test',
    StatementId='ステートメントID',
    Action='lambda:InvokeFunction',
    Principal='events.amazonaws.com',
    SourceArn='arn:aws:events:リージョン:アカウントID:rule/boto3_test'
)


なお、マネジメントコンソールからルールを設定した場合は、裏で勝手にこのパーミッションの設定をやってくれている。なので、動くということだ。

3.動作確認

上記の設定により、ちゃんと指定したルールに沿って、イベントが発生し、Lambda Functionが実行された。


まとめ

boto3を使い、CloudWatchEventsでLambda Functionを呼ぶルールを設定することができた。呼び出し側のLambda Functionのポリシーを適切に設定する必要があることに注意。

概要

 boto3で、ローカルからLambdaのコードを更新する方法を調べ、正しく行えることを確認した。


背景と目的

 以前のS3へのアップロードに引き続き、ローカルPC上からboto3を使ってLambdaのコードを更新できるようにする。


詳細

0.実施環境
  • Windows10
  • Python 2.7
  • AWS CLIインストール済み
  • boto3 インストール済み
1.方法を調べる

boto3のドキュメントを見ると、Lambda.Clientに、update_function_codeというメソッドがあるので、これでできそう。

2.対象のlambda function
  • 関数名=boto3_update_test
  • 言語はPython
  • 更新内容となるソースコードはlambda_function.pyというファイルに以下を書き、zipファイルとして圧縮
# coding: utf-8

import datetime

def lambda_handler(event, context):
 # TODO implement
 return datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")
3.実装

 実装したのが、以下。

import boto3

client = boto3.client('lambda')

# zipファイルの読み込み
zip_file = open(u"ソースコードのzipファイルのパス", 'rb')
zip_file_contents = zip_file.read()

# アップデートの実行
response = client.update_function_code(
    FunctionName='boto3_update_test',
    ZipFile=zip_file_contents,
    Publish=True
)

print response
4.動作確認

 実行したところ、responseの中身でステータスコード200が返ってきて、以下のようにコンソール画面でもちゃんと更新されていることが確認できた。

更新後
図4.1 更新後

 というわけで、ちゃんと更新できた。


概要

 boto3で、ローカルからS3へファイルをアップロードする方法を調べ、正しく行えることを確認した。


背景と目的

 AWSのS3へのアップロードを手でやるのが面倒になったので、今更ながら、ローカルPC上からboto3を使ってアップロードできるようにする。


詳細

0.実施環境
  • Windows10
  • Python 2.7
1.AWS CLIのインストール
  • まず、AWS CLIをインストール。なくてもできなくはないのかもしれないが、後述のCredentialsの設定をしておくと、ソースコード内にいちいちCredentialsを書かなくていいようなので、インストールする。
  • 私の場合Windowsの64ビットなので、こちらからmsiをダウンロードし、インストールした。
2.boto3のインストール

 pipを使ってインストール。特に迷うことはない。

pip install boto3
3.Credentialsの設定

 こちらに従い、

aws configure

 とすると、アクセスキーIDとシークレットアクセスキーが順に聞かれるので、入力。そのあと、リージョンも入力する。

4.S3へのアップロード

 以下のように、boto3を使ってput_objectを実行。

import boto3

s3 = boto3.resource('s3')
# ファイルを読み出し
data = open("アップロードしたいファイルのパス", 'rb')
# アップロード
s3.Bucket('バケット名').put_object(Key='アップロード先のキー', Body=data)

 S3バケットを確認したところ、ちゃんとファイルが入っていた。正しく動作した。とりあえず、これでアップロードをPythonスクリプトで自動化できそう。


このページのトップヘ