AWS-SDK & nodejs メモ

はじめに

自分用のメモ代わりです。すみません。
nodejsでaws-sdkの各種機能を適当にメモっていきます。

共通処理

aws-sdkを読み込み、リージョンとプロファイルを設定

const aws = require('aws-sdk');

var credentials = new aws.SharedIniFileCredentials({
    profile: "<プロフィル名>"
});
aws.config.update({
    region: "<リージョン名>",
    credentials: credentials
});

S3

ローカルファイルをS3にアップロード

const s3 = new aws.S3();

const params = {
    Bucket: "<バケット名>",
    Key: "<キー名>",
    Body: fs.createReadStream("<ローカルファイルのパス>"),
};

s3.upload(params).promise()
.then(function(data) {
    console.log(`アップロード成功: s3://${data.Bucket}/${data.Key}`);
})
.catch(function(err){
    console.dir(err);
});

続きを読む

CloudFormerのちょっとした落とし穴

はじめに

同じ内容で2回もハマってしまったのでメモ。

CloudFormerで既存のAWS構成をテンプレートに落とした時、CloudFormationの構文エラーになるJSONが吐かれる事があるという話です。

本題

文字列の配列でなければならないプロパティーが、単一の文字列になってしまいます。

CloudFormerの出力
{
    "s3policyxxxbucket": {
      "Type": "AWS::S3::BucketPolicy",
      "Properties": {
        "Bucket": {
          "Ref": "s3xxxbucket"
        },
        "PolicyDocument": {
          "Version": "2012-10-17",
          "Id": "Policy-xxx",
          "Statement": [
            {
              "Sid": "xxxxxxxxxxxx",
              "Effect": "Allow",
              "Principal": "*",
              "Action": "s3:GetObject",
              "Resource": "<省略>",
              "Condition": {
                "IpAddress": {
                  "aws:SourceIp": "0.0.0.0/0"
                }
              }
            }
          ]
        }
      }
    }
}

上記の"Action": "s3:GetObject"が問題で、正しくは"Action": [ "s3:GetObject" ]です。

最後に

CloudFormerで既存のAWS構成をテンプレートに落とすことが出来るのは便利ですが、それを使う時にはちょっと注意が必要ですね。

それと、CloudFormationのエラー出力がもう少し情報を出してくれれば..と思います。今回もInvalid Resource ...ぐらいしか言ってくれなかったので、他の箇所を疑ってしまい、解決するまでに時間を浪費しました。

とは言え、CloudFormerの出力はそのまま使うなと公式にも注意書きしてあった気がするので、よく確認しなかった自分が悪いのですが。

続きを読む