駆け出しプログラマーの成長日記

駆け出しプログラマーの成長日記をご覧いただきありがとうございます。何かお気づきの点、このような場合どうすればよいかなど質問やアドバイスお待ちしております。僕の成長のため、皆様の成長の手助けのためになればよいなと思います。

APIGatewayの作成とLambdaの連結方法

動作環境

PC : Windows11
AWS:Lambda, APIGateway

概要

LambdaのトリガーにAPIGatewayを設定する。

LambdaのトリガーにAPIGatewayを設定

Lambdaの作成

AWS管理画面にログインし、Lambdaを検索欄にて検索。
右上のオレンジ色の関数を作成を選択。

Lambdaの作成

関数の作成画面がでてきたら、一から作成を選択。
基本的な情報には
関数名、ランタイム、アーキテクチャの選択があるので下記のように設定。(関数名は任意の名前で。今回はTestで行く。)

Lambdaの設定

設定ができたら右下の関数の作成をクリックするとLambdaの作成は完了。

APIGatewayの作成

APIGatewayを検索欄にて検索。
右上の「APIを作成」をクリック。

APIGateway作成

今回は外部のアプリからURLにクエリパラメータを乗せて送信し、APIを操作するため、RESTAPIのパブリックの方を作成する。
RESTAPIの左下の構築をクリック。

RESTAPIを作成。

プロトコルの選択では「REST」にチェックをいれる。
新しいAPI作成欄では新しいAPIの作成にチェックを入れる。
API名には任意の名前を付ける。(このブログではTestとつける)
説明欄には自分のわかりやすい説明をつける。(翻訳APIなど...)
エンドポイントはリージョンに設定し、APIの作成へ。

API作成設定

APIGatewayの作成はできたのでこれからAPIGatewayの設定を行っていく。
アクションのメソッドの作成を選択。
プルダウンでGETを選択し、チェックを選択。

APIGatewayのメソッド作成

GETメソッドを選択し、GETメソッドのセットアップ画面の表示。
統合タイプにLambdaを選択。
Lambdaプロキシ統合の使用にチェックを入れる。(画像では入れ忘れているので注意)
Lambdaのリージョンに利用するリージョンを選択。
(今回はap-northeast-1[東京リージョン]に設定。)
Lambda関数名は作成したLambdaの関数名を入れる。
(今回はTestで作成したのでTestと入れる)
デフォルトタイムアウトにチェックが入っていることを確認し、保存ボタンを押す。

APIGatewayとLambdaの連携

これでLambdaにAPIGatewayのトリガー実装が完了。
次回はLambdaを使って翻訳APIの実装をしていきたいと思う。

C#でAWS S3にデータを送受信方法

実行環境

AWS S3, C#
Editer : VisualStadio2022
PC : Windows11

今回はAWS S3に関しては作成済みということで進めていく。

ソースコード

・usingパッケージ
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.IO;

using System, using System.IOは標準で呼び出せる。
using Amazon, using Amazon.S3, using Amazon.S3.ModelはNugetパッケージマネージャからインストールする。

C#からAWS S3へのデータ送信ソースコード
static IAmazonS3 client;
static string bucketName = "";  //バケット名の入力
static string profileName = "default";
static string accessKey = ""; //アクセスキーの入力
static string secretKey = ""; //シークレットキーの入力

[Obsolete]
static void Main(string[] args)
{
    Amazon.Util.ProfileManager.RegisterProfile(profileName, accessKey, secretKey);

    using (client = new AmazonS3Client(RegionEndpoint.APNortheast1))
    {
        string[] files = Directory.GetFiles("folder", "*", SearchOption.AllDirectories);

        foreach (string str in files)
        {
            string str2 = str.Replace("\\", "/");
            WritingAnObject(str, str2);
        }
    }
}
static async void WritingAnObject(string filename, string filename2)
{
    try
    {
        PutObjectRequest putRequest = new PutObjectRequest
        {
            BucketName = bucketName,
            Key = filename2,
            FilePath = filename
        };
        PutObjectResponse response = await client.PutObjectAsync(putRequest);
        Console.WriteLine("Status Code: " + response.HttpStatusCode);
    }
}
ソースコード解説

バケット名, アクセスキー, シークレットキーはご自身のAWSのキーを使用。
アクセスキー、シークレットキーはIAMユーザーの認証情報から取得可能。

Amazon.Util.ProfileManager.RegisterProfile("string", "string", "string")で後のprofileNameで参照できるプロファイルを登録する。

client = new AmazonS3Client(RegionEndPoint.APNortheast1)

new AmazonS3Client()でアプリケーションのデフォルト設定から読み込まれた認証情報を使用してAWSS3Clientを構築。

RegionEndPoint.APNortheast1はリージョンの設定。

using(){} はusingステートメントといってリソースの破棄を行う。
(ファイルなどはアンマネージド型リソースなのでリソースの権利取得から操作、破棄までのプログラムを記述しなければならないが、usingでリソースの破棄するプログラムを省略でき、簡略化することが可能)

string[] files = Directory.GetFiles("folder", "*", SearchOption.AllDirectories);

Directory.GetFiles()は指定したディレクトリ内のファイル名前(パスを含む)を返す。

folder, "*", SearchOption.AllDirectoriesは「(自分のソースコード配置位置)\bin\Debug\net6.0」内にfolderの中のデータすべてを意味する。

ワイルドカード"*"はすべてのフォルダを意味する。(正規表現

SearchOption.AllDirectoriesはサブフォルダも含めたすべてのフォルダを取得する。

Unity3D キーボードの矢印キーで物体を操作する方法(Vecter3の利用方法)

Unity環境

エディターバージョン : 2021.3.16f1
コア : 3D
PC : Windows11


球体オブジェクトとステージの作成

・地面の作成

まず、Unityを上記記載の環境でUnityの立ち上げ。
Hierarchyビューから3DObjectのCubeを選択し、Stageを作成する。

Cubeの作成

作成したCubeの名前をStageに変更。
Stageを選択した状態でInspecterビューのTransformのScaleを(25, 1, 25)に変更しCubeのサイズを変更。

・ボールが落ちないように左右上下の壁を作る。

先ほどと同様にCubeの作成し、オブジェクト名を「Wall」する。
HierarchyビューでWallを選択したままInspecterビューのTransformのPosition(0,1,13), Scale(25, 3, 1)に変更する。

WallのTransformの変更

1辺の壁ができたので他の壁も同じように作成していく。
ここで、先ほど見たく、1からWallの作成をしていってもよいが、作成したWallをコピー&ペーストで作成した方が手間が省けるのでコピーする。
HierarchyビューでWallを選択の上、[Ctrl] + [D]でWallの複製が可能。
それぞれのWallにPosionとScaleを以下のように設定。

オブジェクト名 Position Location Scale
Wall(1) (0, 1, -13) (0, 0, 0) (25, 3, 1)
Wall(2) (13, 1, 0) (0, 90, 0) (27, 3, 1)
Wall(3) (-13, 1, 0) (0, 90, 0) (27, 3, 1)

これでステージの準備はできたので次はボールの作成と動的処理について説明する。

ボールの作成とボールの動的処理

・ボールの作成方法

Cubeの作成と同様にHierarchyビューから3DObjectのSphereを選択。
そうすると、球体オブジェクトができる。
SphereのPositionを(0, 2, 0)に設定。
ここでGameをプレイしてみる。
Sceneビューの「▶」ボタンを押すとゲームが開始される。

GameStart

ゲームをスタートすると球体が浮いて止まっているのがわかる。
この球体にはまだ重力が働いていないため、このような現象になる。
ここでこのSphereに重力を加える。
HierarchyビューでSphereを選択し、Inspecterビューの一番下に「Add Component」をクリックし、検索画面でRigidbodyと検索しRigidbodyを追加する。

Componentの追加(Rigidbody)

これでGameStartしてみるとしっかりと重力がかかり、落下してくるのを確認できると思う。
これではまだ操作はできないので次に操作するためのスクリプトについて説明していく。

・ボールの動的処理

ボールの動的処理はいくつか方法はあるが、今回はGravity(重力)を操作してボールを操ってみたいと思う。
Projectビューで右クリックし、Create -> C#Scriptを作成。

C#Scriptの作成

作成されたC#Scriptの名前を「GravityOperation」に変更し、Scriptファイルをエディターで開く。
プログラムを下記のように編集。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GravityOperation : MonoBehaviour
{
    //重力加速度定数
    const float Gravity = 9.81f;

    //重力の適用具合
    public float gravityScale = 1.0f;
    
    //毎フレーム読み出されるメソッド
    void Update()
    {
        Vector3 vector = new Vector3();
        //キーボードの矢印キーを取得。
        vector.x = Input.GetAxis("Horizontal");
        vector.z = Input.GetAxis("Vertical");
        vector.y = -1.0f;
        //gravityに値を反映
        //normalizedはvectorを正規化している。
        Physics.gravity = Gravity * vector.normalized * gravityScale;
    }
}

編集できたスクリプトを保存し、Unity画面に戻る。
作成したスクリプトをオブジェクトにアタッチ処理をする。
HierarchyビューでSphereを選択し、ProjectビューのGravityOperationスクリプトをInspecterにドラッグ&ドロップ。
InspecterにGravityOperation(Script)が設定されていればOK。
GameStartボタンを押して動作確認してみると、矢印キーでボールの動きを制御できているのがわかる。