Kategorien
Docker

Docker Shell Alias verwenden unter Linux

Um auf der Linux Shell die gewohnten Aliase wie ll für ls -lh zu verwenden, muss man folgenden Trick verwenden:

Da das Login über sh keine Linux Login Shell ist, werden die Alias Definitionen in /etc/profile.d nicht geladen beim Login.

Lösung:

Es reicht, sich mit sh –login im Container anzumleden, dann stehen die Alias Definitionen zur Verfügung.

Kategorien
Amazon AWS Docker PHP 7

DockerFile PHP mit XDebug und Amazon Linux 2

Ein DockerFile für eine PHP 7.2. Umgebung mit XDebug für eine Symfony 4 Umgebung unter Amazon Linux 2:

FROM amazonlinux:2.0.20190823.1

RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

# install php
RUN amazon-linux-extras install -y php7.2
RUN yum install -y php-devel.x86_64 php-xml.x86_64 php-pecl-zip.x86_64  php-intl.x86_64

#install xdebug
RUN yum install -y gcc make
RUN yum install -y php-pear.noarch
RUN pecl install xdebug
RUN echo 'zend_extension=/usr/lib64/php/modules/xdebug.so' >> /etc/php.ini
Kategorien
Docker

Docker Xdebug remote_host setzen in Toolbox für PHPStorm

Um mit Xdebug und PHPStorm im Docker Container debuggen zu können, aber die Fehlermeldung bekommt:

Connection was not established. Probably 'xdebug.remote_host=docker.for.win.localhost' is incorrect

liegt das daran, dass Docker in der Toolbox Variante für Windows den Platzhalter docker.for.win.localhost nicht befüllt. Es muss also die IP des PHPStorm Rechners manuell gesetzt werden.

Dazu setzt man manuell den Wert von xdebug.remote_host auf 192.168.99.1 (die IP Docker für den Host setzt, kann varieren) bei den CLI Interpreter Optionen:

 

Kategorien
Docker

Docker Verzeichnis mounten unter Windows 10 mit Docker Toolbox

Um einen lokalen Ordner in einen Docker Container unter Windows 10 zu mounten, kann man entweder Docker für Windows verwenden oder wenn man die Windows 10 Home Edition verwendet, ist man gezwungen, dies per Hand mit Virtual Box erledigen.

Dazu muss man die Docker default Box auswählen in Virtual Box:

virtual_box_shared_folder

und einen neuen Gemeinsamen Ordner hinzufügen:virtual_box_shared_folder_add

Dann muss man die docker-machine neustarten in der Docker Toolbox, dadurch wird die docker default Virtual Box neugestartet:

docker-machine restart

Jetzt kann man sein Verzeichnis mounten in seiner docker-compose.yml:

volumes:
  - /htdocs/my_project:/var/www/html/

Jetzt wird der Ordner in dem Docker Container erfolgreich gemountet.

Mit dem folgenden Befehl kann getestet werden, ob das mounten erfolgreich war:

docker exec -it CONTAINER_ID ls -ll /var/www/html
Kategorien
Server Administration

Yum Package suchen

Mit diesem Befehl kann man nach yum Packeten suchen:

yum search mysql | grep client
Kategorien
PHP PHP 7 VBA Excel

PHP csv Datei mit Umlauten erstellen für Excel

Um eine csv-Datei zu erstellen, in der die Umlaute richtig kodiert sind, muss man in seinem Projekt, welches im Normalfall UTF-8 kodiert ist, die Umlaute nach UTF-16LE kodieren. Diese Kodierung kann von Windows und Mac angezeigt werden.

$file = fopen('file.csv', 'w');
foreach ($rows as $row) {
 $row = array_map(function($cell){
 return mb_convert_encoding($cell, 'UTF-16LE', 'UTF-8');
 }, $row);
 fputcsv($file, $row, ';');
}
fclose($file);
Kategorien
Amazon AWS Symfony

Monolog Logging für AWS Cloudwatch Logs konfigurieren

Damit die Logs schön formatiert aus einer Symfony 4 Anwendung in AWS Cloudwatch ankommen, muss man Monolog folgendermaßen konfigurieren:

# config/services.yaml
Monolog\Formatter\JsonFormatter:
    calls:
        - [includeStacktraces]

und

# config/packages/prod/monolog.yaml
monolog:
  handlers:
    main:
      type:  stream
      level: error
      path:  '%kernel.logs_dir%/error.log'
      formatter: Monolog\Formatter\JsonFormatter

Danach muss man der Cloudwatch Daemon konfigurieren:

# /etc/awslogs/awslogs.conf
[general]
# Path to the CloudWatch Logs agent's state file. The agent uses this file to maintain
# client side state across its executions.
state_file = /var/lib/awslogs/agent-state

[/var/www/html/var/log/error.prod.log]
datetime_format = [%Y-%m-%d H:%M:%S]
file = /var/www/html/var/log/error.log
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = test_group_name/error_log

und man erhält wunderbare (aggregierte) ErrorLog Informationen in Cloudwatch Logs Insight:

 

 

Kategorien
Amazon AWS

11 AWS Cloudformation Experten Tricks

Bei meiner Arbeit mit Cloudfromation habe ich viel nützliche Tipps gesammelt, die ich gern teilen will.

1. Eine IDE mit Autocomplete verwenden

Für die Jetbrains IDEs wie PHPStorm, Webstorm oder IntelliJ gibt es ein sehr gutes AWS Cloudfromation Plugin namens AWS Cloudfromation von Leonid Shalupov:

AWS Cloudfromation Plugin von Leonid Shalupov

Dieses biete Autocomplete für die IDE an und eine automatische Formatüberprüfung, ob Attribute gesetzt werden, die dort nicht erlaubt sind. Auf diesem weg kann man viele Fehler schon vor dem validieren finden und spart viel Zeit.

AWS Cloudfromation Autocomple

2. AWS-CLI Befehle verwenden

Kategorien
Amazon AWS

Cloudformation reboot einer EC2 Instanz

Damit eine Instanz neu neugestartet wird, nachdem die Einrichtung erfolgt ist, muss man folgende Befehl in die UserData Sektion eintragen im Cloudformation Template:

UserData:
  # is executed as root user
  Fn::Base64:
    !Sub |
      #!/bin/bash -xe
      yum update -y aws-cfn-bootstrap
      /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource WebServerInstance --configsets InstallAndRun --region ${AWS::Region}
      /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerInstance --region ${AWS::Region}
      reboot
Kategorien
Amazon AWS Python

AWS Lanbda erstellen eines Route53 A Records Eintrages

Mit Hilfe der folgende Python AWS Lambda Funktion kann man einen A Record in Route53 erstellen/updaten:

import json
import boto3

route53 = boto3.client('route53')

def lambda_handler(event, context):
    print("Received event: " + json.dumps(event, indent=2))
    domain = event['domain']

    route53.change_resource_record_sets(
        HostedZoneId='HostedZoneId',
        ChangeBatch={
            'Comment': 'Update or Insert an A Record',
            'Changes': [
                {
                    'Action': 'UPSERT',
                    'ResourceRecordSet': {
                        'Name': domain,
                        'Type': 'A',
                        'SetIdentifier': domain,
                        'Region': 'region',
                        'ResourceRecords': [
                            {
                                'Value': '1.1.1.1'
                            }
                        ],
                        'TTL': 300
                    }
                }
            ]
        }
    )

 

Dazu muss die Labda Funktion die notwendigen Rechte für Route53 besitzen.

Die Dokumentation ist hier.

Die Funktion kann getestet werden mit:

{
  "domain": "foo.bar.de"
}