MENU
  • ホーム
  • プログラミング
  • ワードプレス
    • プラグインプラグイン関連記事
    • 賢威賢威のカスタマイズ
    • CSSCSSの関連記事
  • サイト情報
    • プライバシーポリシー
  • ツール
    • メルエディター
    • フリマスパイダー – 疾風
    • フリマスパイダー
    • -ポイ活くんα-
  • お問い合わせ
あらゆるモノにHackする、探究者の読み物。
Let's Hack Tech
  • ホーム
  • プログラミング
  • ワードプレス
    • プラグインプラグイン関連記事
    • 賢威賢威のカスタマイズ
    • CSSCSSの関連記事
  • サイト情報
    • プライバシーポリシー
  • ツール
    • メルエディター
    • フリマスパイダー – 疾風
    • フリマスパイダー
    • -ポイ活くんα-
  • お問い合わせ
Let's Hack Tech
  • ホーム
  • プログラミング
  • ワードプレス
    • プラグインプラグイン関連記事
    • 賢威賢威のカスタマイズ
    • CSSCSSの関連記事
  • サイト情報
    • プライバシーポリシー
  • ツール
    • メルエディター
    • フリマスパイダー – 疾風
    • フリマスパイダー
    • -ポイ活くんα-
  • お問い合わせ
  1. ホーム
  2. プログラミング
  3. AWSのLambdaとS3連携でハマる所

AWSのLambdaとS3連携でハマる所

2023 2/02
プログラミング
2019-10-082023-02-02
AccessDenied

最近AWSのLambdaがお気に入りで、凝っています。

line-bot作ってみたり、PA-APIのプロキシ作ってみたりと、自分で超手軽にAPIを作れてしまうところがイイですね。

色々触ってみた結果、POSTされたデータをファイルとして保存したいぞと思ったんですが、S3というAWS上のストレージと連携させる必要があるようで、こいつがまた厄介だったので、忘れないようにメモ書きです。

目次

LambdaからS3に保存するコードは超簡単

# ①ライブラリのimport
import boto3
from datetime import datetime
 
print('Loading function')      # ②Functionのロードをログに出力
 
s3 = boto3.resource('s3')      # ③S3オブジェクトを取得
 
# ④Lambdaのメイン関数
def lambda_handler(event, context):
    
    bucket = 'your_backet_name'    # ⑤バケット名を指定
    key = 'test_' + datetime.now().strftime('%Y-%m-%d-%H-%M-%S') + '.txt'  # ⑥オブジェクトのキー情報を指定
    file_contents = 'Lambda test'  # ⑦ファイルの内容
    
    obj = s3.Object(bucket,key)     # ⑧バケット名とパスを指定
    obj.put( Body=file_contents )   # ⑨バケットにファイルを出力
    return

コード自体はめっちゃ簡単ですね。
調べてすぐ出てくるレベルでNode.jsとかのコードもすぐ出てきました。

参考サイトは以下。

ナレコムAWSレシピ | AIに強い情報...
【AWS Lambdaの基本コードその2】 S3へのファイル保存 大柳です。 「AWS Lambdaの基本コード」シリーズ、第2回目はLambdaからS3へのファイル保存を行い…

問題はAccessDenied

ちゃきちゃきっとコピペってとりあえずテストします。

API GateWayにトリガーしてとりあえずAnyでGetします。
Putなんですが、Getします。

Lambda execution failed with status 200 due to customer function error: An error occurred (AccessDenied) when calling the PutObject operation: Access Denied.

AccessDeniedというエラーが出現して上手くいきません。よく見るやつですね。まぁなんかアレです。パーミッションとかそんな系の、アイツですね。

ソースコードはすぐ見つかるんですが、割とこの辺解説されてないことが多いので、どっちかというとこの方が困ります。

S3はアクセス権限とか色々ややこしい

調べてみるまでもなく、S3へのアクセス権がないであろう事は容易に想像できるエラーメッセージですが、問題はそれをどうやったら設定できるのか?ってことです。

っていうか、同じアカウントで作ったLambdaとS3の間に、何のアクセス権が必要なんでしょうか?

僕の設定が悪いだけで普通の人は勝手に連携されるのがディフォルトなんでしょうか?世知辛い世の中ですね。

バケットにアクセス権限を設定する

なんかS3では一番親のフォルダをバケットと呼ぶらしいです。フォルダって呼べよ。分かりにくい。せめてディレクトリとかやろ。

バケットポリシー

こんな感じです。Json形式で書き込むみたいなんですが、何書きゃいいのかサッパリわからないですね。

下の方にポリシージェネレータとか言う、ここに書き込むためのJsonを簡単に作れるヤツもあるんですが、それで作った結果、何故かエラーで進みませんでした。Principalがどうのこうの。

そろそろ嫌になってきましたね。
ていうことで、公式のドキュメントとか色々調べた結果、出来たポリシーがこちら。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Principal": {
                "AWS": "arn:aws:iam::xxxxxxxx:role/service-role/lambda-role-xxxxxx"
            },
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::AccountBBucketName/*"
        }
    ]
}

AccountBBucketName

この箇所はアクセス権限を与えたいバケット名を入れるところです。

arn:aws:iam::xxxxxxxx:role/service-role/lambda-role-xxxxx

この箇所はLambdaの実行ロールというやつです。ぶっちゃけあんまり意味は分かってませんが、AWSのサービスのパーツ毎に割り振られるIDみたいなもんですかね。

Lambdaの場合はこの辺から確認できます。

これでとりあえず、エラー回避できました。

プログラミング
AWS Lambda
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする コメントをキャンセル

email confirm*

post date*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

シンプル美と機能性を両立させた、国内最高峰のWordPressテーマ『SWELL』
人気記事
  • IQテストいくつか受けてみました
    ネット上で信憑性がありそうなIQテスト、5種類まとめて受けた結果…
  • hayate
    メルカリの商品を世界最速で購入するためだけのアラートツール
  • 【Python】BeautifulSoupの使い方・基本メソッド一覧|スクレイピング
  • Pythonファイルのexe化
    【悲報】PyInstallerさん、300MBのexeファイルを吐き出すようになる
  • Amazon Echo アレクサのコマンドまとめ
    AmazonEchoの使い方とできる事、アレクサへの指示コマンド一覧
最近の投稿
  • 正規表現処理の濁点でハマった話2024-12-12
  • 保護中: 疾風v2更新履歴2024-05-31
  • 【自営・経営者向け・税金も】クレジットカードガチ勢による最強クレカ解説2023-10-23
  • PyQt5 QListWidget の item削除でtextBoxのフォーカスが奪われる2023-03-05
  • WordPressからのメールが届かない時の調査と解決法2023-02-27
目次
目次