背景
業務でAWS に関わることになったので、必要そうな技術を試行中
そもそも、Node.js から理解していなかったので、まずはそれを理解しつつ、以下をやってみることに
色々やってなんとなく把握したこと
- NVM: Npm の Version 管理。Node.js 使うなら入れたほうがよさげ
- npm: Node.js の Package 管理。
-
package.json: これを元に bulid してくれる感じ?
- dependencies: 本番用
- devDependencies: 開発用
-
npm install で、dependencies に従って node_modules の下に依存関係を処理してくれる。
- npm install のオプションは、documents を見て後々整理すべし
-
npm init で作成すると package.json を用意してくれる
- npx create-* で、各種 template を元に作れる。npm init => npx create- って感じ
- これ使わずに、いきなり package.json 書いて、npm install でもOK
- template は ここで。Link は React Native へ
Node.jsの使用開始
このチュートリアルは、npm init で作るわけではなく、自身で package.json を作成していく
これのおかげで、package.json の作り方とかがようやく整理ついた記念のチュートリアル
前提条件タスク
- npm インストール済み
- AWS SDK もOK
- 認証情報もOK。確認するなら %userprofile%.aws\credentials を開けばOK。
ステップ 1: Amazon S3 パッケージと依存関係をインストールします
- まずはプロジェクトフォルダを適当に作る
- て、フォルダ内へ移動して
- package.json を VS Code で開く
mkdir TryS3ByNode
cd TryS3ByNode
code package.json
貼り付けるコードはチュートリアルそのままで、保存して終了
{
"name": "aws-sdk-v3-iam-examples",
"version": "1.0.0",
"main": "index.js",
"dependencies": {
"@aws-sdk/client-s3": "^3.32.0"
},
"type": "module"
}
で、package.json をインストールさせる
npm install
依存関係の追加
ここの説明が、初心者に優しい説明。最初は意味不明ですが
npm install @aws-sdk/client-s3
ステップ 2: Node.js コードを記述する
- "libs" フォルダを作って
- current directory を lib へ
- library ファイルを VS Code で開いて編集
mkdir lib
cd lib
code s3Client.js
- チューとリアルのコードをコピペ
- region を自分の環境に合わせて修正:ap-northeast-1 へ
import { S3Client } from "@aws-sdk/client-s3";
// Set the AWS Region.
const REGION = "ap-northeast-1"; //e.g. "us-east-1"
// Create an Amazon S3 service client object.
const s3Client = new S3Client({ region: REGION });
export { s3Client };
sample code は GitHub にもあるよーってことなので、後で見ないとね
- で、再度 root に戻って
- メインのコードをVS Code で開く(作成)
cd ..
code sample.js
- いよいよ最後のコードをチュートリアルからコピペ
// Import required AWS SDK clients and commands for Node.js.
import { PutObjectCommand, CreateBucketCommand } from "@aws-sdk/client-s3";
import { s3Client } from "./libs/s3Client.js";
// Set the parameters
const params = {
Bucket: "BUCKET_NAME", // The name of the bucket. For example, 'sample_bucket_101'.
Key: "KEY", // The name of the object. For example, 'sample_upload.txt'.
Body: "BODY", // The content of the object. For example, 'Hello world!".
};
const run = async () => {
// Create an Amazon S3 bucket.
try {
const data = await s3Client.send(
new CreateBucketCommand({ Bucket: params.Bucket })
);
console.log(data);
console.log("Successfully created a bucket called ", data.Location);
return data; // For unit tests.
} catch (err) {
console.log("Error", err);
}
// Create an object and upload it to the Amazon S3 bucket.
try {
const results = await s3Client.send(new PutObjectCommand(params));
console.log(
"Successfully created " +
params.Key +
" and uploaded it to " +
params.Bucket +
"/" +
params.Key
);
return results; // For unit tests.
} catch (err) {
console.log("Error", err);
}
};
run();
ステップ 3: 例の実行
で、いよいよ動かす!
node sample.js
エラー解決へと
モジュールが無い!?
Error [ERR_MODULE_NOT_FOUND]: Cannot find module 'C:\Users\user\TryS3ByNode\libs\s3Client.js' imported from C:\Users\user\TryS3ByNode\sample.js
認証情報がおかしい
Error CredentialsProviderError: Could not load credentials from any providers
%userprofile%.aws\credentials で、[default] 定義が抜けていたので、既存のをコピーして [default] 作成
バケット名が不正
Error InvalidBucketName: The specified bucket is not valid.
- Default の名称
BUCKET_NAME
も 例として記述されていた名称もsample_bucket_101
初心に戻って、命名規則を見に行くと・・目が点
例が2つとも命名規則違反ですか
バケット名重複
Error BucketAlreadyExists: The requested bucket name is not available. The bucket namespace is shared by all users of the system. Please select a different name and try again.
"_" → "-" へ置換した以下の名称は、すでに使われてるってお話。まぁ、パーティション内ってなったらそうでしょうねぇ
ってことで、適当な名称にして対処
sample-bucket-101
バケットは作られたが、ファイルが作られない
バケット作るだけのコードだった・・
完了
あとがき
チュートリアルで初めて上手くいった・・。
変化が激しい世界での長いチュートリアルはそのままじゃちゃんと動く奴は少ないんだなというのを改めて理解
で、技術に疎いと、それらの調査対処にも時間がかかるので、初期の立ち上がりは大変だなぁ・・と
今回は以下の理由でなんとかなったんだな、と
- Node.js + S3 という単純な世界
- 他のチュートリアルなどで、少しずつ対処できる範囲が広がった
次は、何にすべきか・・
- 止まってる cognito
- DynamoDB
- S3 でその他の機能確認
- React Native
なんかだんだん楽しくなってきた